generativeart/arts/dotswave.go

50 lines
1.5 KiB
Go

package arts
import (
"github.com/fogleman/gg"
"github.com/jdxyw/generativeart"
"github.com/jdxyw/generativeart/common"
"math"
"math/rand"
)
type dotsWave struct {
dotsN int
}
// NewDotsWave returns a dotsWave object.
func NewDotsWave(dotsN int) *dotsWave {
return &dotsWave{
dotsN: dotsN,
}
}
// Generative draws a dots wave images.
func (d *dotsWave) Generative(c *generativeart.Canva) {
ctex := gg.NewContextForRGBA(c.Img())
noise := common.NewPerlinNoise()
for i := 0; i < d.dotsN; i++ {
x := common.RandomRangeFloat64(-0.1, 1.1) * float64(c.Width())
y := common.RandomRangeFloat64(-0.1, 1.1) * float64(c.Height())
num := common.RandomRangeFloat64(100, 1000)
r := rand.Float64() * float64(c.Width()) * 0.15 * rand.Float64()
ind := common.RandomRangeFloat64(1, 8)
ctex.Push()
ctex.Translate(x, y)
ctex.Rotate(float64(rand.Intn(8)) * math.Pi / 4)
rand.Shuffle(len(c.Opts().ColorSchema()), func(i, j int) {
c.Opts().ColorSchema()[i], c.Opts().ColorSchema()[j] = c.Opts().ColorSchema()[j], c.Opts().ColorSchema()[i]
})
for j := 0.0; j < num; j += ind {
s := float64(c.Width()) * 0.15 * common.RandomRangeFloat64(0, common.RandomRangeFloat64(0, common.RandomRangeFloat64(0, common.RandomRangeFloat64(0, common.RandomRangeFloat64(0, common.RandomRangeFloat64(0, rand.Float64()))))))
ci := int(float64(len(c.Opts().ColorSchema())) * noise.Noise3D(j*0.01, x, y))
ctex.SetColor(c.Opts().ColorSchema()[ci])
ctex.DrawCircle(j, r*math.Sin(j*0.05), s*2/3)
ctex.Fill()
}
ctex.Pop()
}
}