56 lines
1.6 KiB
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()
|
|
}
|
|
}
|