Created the split pattern

This commit is contained in:
Sasha Koshka 2023-01-20 23:19:54 -05:00
parent 4c1bf070fe
commit 83d5064803
3 changed files with 65 additions and 29 deletions

43
artist/split.go Normal file
View File

@ -0,0 +1,43 @@
package artist
import "image/color"
// Orientation specifies an eight-way pattern orientation.
type Orientation int
const (
OrientationVertical Orientation = iota
OrientationDiagonalRight
OrientationHorizontal
OrientationDiagonalLeft
)
// Split is a pattern that is divided in half between two sub-patterns.
type Split struct {
First Pattern
Second Pattern
Orientation
}
// AtWhen satisfies the Pattern interface.
func (pattern Split) AtWhen (x, y, width, height int) (c color.RGBA) {
var first bool
switch pattern.Orientation {
case OrientationVertical:
first = x < width / 2
case OrientationDiagonalRight:
first = float64(x) / float64(width) +
float64(y) / float64(height) < 1
case OrientationHorizontal:
first = y < height / 2
case OrientationDiagonalLeft:
first = float64(width - x) / float64(width) +
float64(y) / float64(height) < 1
}
if first {
return pattern.First.AtWhen(x, y, width, height)
} else {
return pattern.Second.AtWhen(x, y, width, height)
}
}

View File

@ -2,34 +2,24 @@ package artist
import "image/color"
// StripeDirection specifies the direction of stripes.
type StripeDirection int
const (
StripeDirectionVertical StripeDirection = iota
StripeDirectionDiagonalRight
StripeDirectionHorizontal
StripeDirectionDiagonalLeft
)
// Striped is a pattern that produces stripes of two alternating colors.
type Striped struct {
First Stroke
Second Stroke
Direction StripeDirection
First Stroke
Second Stroke
Orientation
}
// AtWhen satisfies the Pattern interface.
func (pattern Striped) AtWhen (x, y, width, height int) (c color.RGBA) {
position := 0
switch pattern.Direction {
case StripeDirectionVertical:
switch pattern.Orientation {
case OrientationVertical:
position = x
case StripeDirectionDiagonalRight:
case OrientationDiagonalRight:
position = x + y
case StripeDirectionHorizontal:
case OrientationHorizontal:
position = y
case StripeDirectionDiagonalLeft:
case OrientationDiagonalLeft:
position = x - y
}
@ -40,8 +30,8 @@ func (pattern Striped) AtWhen (x, y, width, height int) (c color.RGBA) {
}
if position < pattern.First.Weight {
return pattern.First.Pattern.AtWhen(x, y, width, height)
return pattern.First.AtWhen(x, y, width, height)
} else {
return pattern.Second.Pattern.AtWhen(x, y, width, height)
return pattern.Second.AtWhen(x, y, width, height)
}
}

View File

@ -75,7 +75,7 @@ func (element *Artist) Resize (width, height int) {
artist.Striped {
First: artist.Stroke { Pattern: uhex(0xFF8800FF), Weight: 7 },
Second: artist.Stroke { Pattern: uhex(0x0088FFFF), Weight: 2 },
Direction: artist.StripeDirection(x),
Orientation: artist.Orientation(x),
},
element.cellAt(x, 1))
@ -107,14 +107,17 @@ func (element *Artist) Resize (width, height int) {
x, element.cellAt(x, 3))
}
// 0, 4
artist.FillEllipse (
element,
artist.Beveled {
Highlight: artist.NewUniform(hex(0xFF0000FF)),
Shadow: artist.NewUniform(hex(0x0000FFFF)),
},
element.cellAt(0, 4))
// 0, 4 - 3, 4
for x := 0; x < 4; x ++ {
artist.FillEllipse (
element,
artist.Split {
First: artist.NewUniform(hex(0xFF0000FF)),
Second: artist.NewUniform(hex(0x0000FFFF)),
Orientation: artist.Orientation(x),
},
element.cellAt(x, 4))
}
// how long did that take to render?
drawTime := time.Since(drawStart)