generativeart/arts/pixelhole.go

56 lines
1.6 KiB
Go

package arts
import (
"github.com/fogleman/gg"
"github.com/jdxyw/generativeart"
"github.com/jdxyw/generativeart/common"
"math"
"math/rand"
)
type pixelHole struct {
dotN int
noise *common.PerlinNoise
}
// NewPixelHole returns a pixelHole object.
func NewPixelHole(dotN int) *pixelHole {
return &pixelHole{
dotN: dotN,
noise: common.NewPerlinNoise(),
}
}
// Generative draws a pixel hole images.
func (p *pixelHole) Generative(c *generativeart.Canva) {
ctex := gg.NewContextForRGBA(c.Img())
for i := 0.0; i < float64(c.Opts().NIters()); i += 1.0 {
ctex.Push()
ctex.Translate(float64(c.Width())/2, float64(c.Height())/2)
p.draw(ctex, c, i)
ctex.Pop()
}
}
func (p *pixelHole) draw(ctex *gg.Context, c *generativeart.Canva, frameCount float64) {
ctex.SetLineWidth(2.0)
c1 := int(frameCount/100.0) % len(c.Opts().ColorSchema())
c2 := (int(frameCount/100.0) + 1) % len(c.Opts().ColorSchema())
ratio := frameCount/100 - math.Floor(frameCount/100)
cl := common.LerpColor(c.Opts().ColorSchema()[c1], c.Opts().ColorSchema()[c2], ratio)
for i := 0.0; i < float64(p.dotN); i += 1.0 {
ctex.Push()
ctex.SetColor(cl)
ctex.Rotate(frameCount/(50+10*math.Log(frameCount+1)) + i/20)
dd := frameCount/(5+i) + frameCount/5 + math.Sin(i)*50
ctex.Translate(common.RandomRangeFloat64(dd/2, dd), 0)
x := p.noise.Noise2D(frameCount/50+i/50, 5000)*float64(c.Width())/10 + rand.Float64()*float64(c.Width())/20
y := p.noise.Noise2D(frameCount/50+i/50, 10000)*float64(c.Height())/10 + rand.Float64()*float64(c.Height())/20
rr := common.RandomRangeFloat64(1.0, 6-math.Log(frameCount+1)/10)
ctex.DrawEllipse(x, y, rr, rr)
ctex.Fill()
ctex.Pop()
}
}