generativeart/arts/julia.go

47 lines
968 B
Go

package arts
import (
"github.com/jdxyw/generativeart"
"math/cmplx"
)
// GenFunc defines a func type used by julia set.
type GenFunc func(complex128) complex128
type julia struct {
fn GenFunc
maxz float64
xaixs, yaixs float64
}
func NewJulia(formula GenFunc, maxz, xaixs, yaixs float64) *julia {
return &julia{
fn: formula,
maxz: maxz,
xaixs: xaixs,
yaixs: yaixs,
}
}
// Generative draws a julia set.
func (j *julia) Generative(c *generativeart.Canva) {
n := len(c.Opts().ColorSchema())
if n > 255 {
n = 255
}
for i := 0; i <= c.Width(); i++ {
for k := 0; k <= c.Height(); k++ {
nit := 0
z := complex(float64(i)/float64(c.Width())*2.0*j.yaixs-j.yaixs, float64(k)/float64(c.Height())*2.0*j.yaixs-j.yaixs)
for cmplx.Abs(z) <= j.maxz && nit < c.Opts().NIters() {
z = j.fn(z)
nit += 1
}
idx := uint8(nit*255/c.Opts().NIters()) % uint8(n)
c.Img().Set(i, k, c.Opts().ColorSchema()[idx])
}
}
}