50 lines
1.2 KiB
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()
|
|
}
|
|
}
|
|
}
|