generativeart/arts/silksky.go

50 lines
1.2 KiB
Go

package arts
import (
"github.com/fogleman/gg"
"github.com/jdxyw/generativeart"
"github.com/jdxyw/generativeart/common"
"math/rand"
)
type silkSky struct {
circleNum int
sunRadius float64
}
// NewSilkSky returns a silkSky object.
func NewSilkSky(circleNum int, sunRadius float64) *silkSky {
return &silkSky{
circleNum: circleNum,
sunRadius: sunRadius,
}
}
// Generative draws a silk sky image.
func (s *silkSky) Generative(c *generativeart.Canva) {
ctex := gg.NewContextForRGBA(c.Img())
xm := float64(rand.Intn(c.Width()/5)) + float64(c.Width()*4/5-c.Width()/5)
ym := float64(rand.Intn(c.Height()/5)) + float64(c.Height()*4/5-c.Height()/5)
mh := s.circleNum*2 + 2
ms := s.circleNum*2 + 50
mv := 100
for i := 0; i < s.circleNum; i++ {
for j := 0; j < s.circleNum; j++ {
hsv := common.HSV{
H: s.circleNum + j,
S: i + 50,
V: 70,
}
rgba := hsv.ToRGB(mh, ms, mv)
xn := (float64(i) + 0.5) * float64(c.Width()) / float64(s.circleNum)
yn := (float64(j) + 0.5) * float64(c.Height()) / float64(s.circleNum)
ctex.SetRGBA255(int(rgba.R), int(rgba.G), int(rgba.B), c.Opts().Alpha())
r := common.Distance(xn, yn, xm, ym)
ctex.DrawEllipse(xn, yn, r-s.sunRadius/2, r-s.sunRadius/2)
ctex.Fill()
}
}
}