34 lines
829 B
Go
34 lines
829 B
Go
|
package artist
|
||
|
|
||
|
import "math"
|
||
|
import "image/color"
|
||
|
|
||
|
// EllipticallyBordered is a pattern with a border and a fill that is elliptical
|
||
|
// in shape.
|
||
|
type EllipticallyBordered struct {
|
||
|
Fill Pattern
|
||
|
Stroke
|
||
|
}
|
||
|
|
||
|
// AtWhen satisfies the Pattern interface.
|
||
|
func (pattern EllipticallyBordered) AtWhen (x, y, width, height int) (c color.RGBA) {
|
||
|
xf := (float64(x) + 0.5) / float64(width ) * 2 - 1
|
||
|
yf := (float64(y) + 0.5) / float64(height) * 2 - 1
|
||
|
distance := math.Sqrt(xf * xf + yf * yf)
|
||
|
|
||
|
var radius float64
|
||
|
if width < height {
|
||
|
// vertical
|
||
|
radius = 1 - float64(pattern.Weight * 2) / float64(width)
|
||
|
} else {
|
||
|
// horizontal
|
||
|
radius = 1 - float64(pattern.Weight * 2) / float64(height)
|
||
|
}
|
||
|
|
||
|
if distance < radius {
|
||
|
return pattern.Fill.AtWhen(x, y, width, height)
|
||
|
} else {
|
||
|
return pattern.Stroke.AtWhen(x, y, width, height)
|
||
|
}
|
||
|
}
|