generativeart/arts/colorcanva.go

67 lines
1.7 KiB
Go

package arts
import (
"github.com/fogleman/gg"
"github.com/jdxyw/generativeart"
"github.com/jdxyw/generativeart/common"
"math/rand"
)
type colorCanva struct {
seg float64
}
func NewColorCanve(seg float64) *colorCanva {
return &colorCanva{seg: seg}
}
// Generative returns a color canva image.
func (cc *colorCanva) Generative(c *generativeart.Canva) {
ctex := gg.NewContextForRGBA(c.Img())
ctex.SetLineWidth(c.Opts().LineWidth())
rects := make([]*common.Rect, 0)
w := float64(c.Width()) / cc.seg
for i := 0.0; i < cc.seg; i += 1.0 {
for j := 0.0; j < cc.seg; j += 1.0 {
x := i*w + w/2
y := j*w + w/2
rects = append(rects, common.NewRect(x, y, w, w))
}
}
rand.Shuffle(len(rects), func(i, j int) {
rects[i], rects[j] = rects[j], rects[i]
})
ctex.Translate(float64(c.Width())/2, float64(c.Height())/2)
ctex.Scale(0.6, 0.6)
ctex.Translate(-float64(c.Width())/2, -float64(c.Height())/2)
for i := 0; i < len(rects); i++ {
cc.draw(c, ctex, rects[i])
cc.draw(c, ctex, rects[i])
}
}
func (cc *colorCanva) draw(c *generativeart.Canva, ctex *gg.Context, rect *common.Rect) {
rnd := rand.Intn(4)
ww := (rect.W() / 5) * float64(rand.Intn(int(cc.seg)*2)+1)
hh := (rect.H() / 5) * float64(rand.Intn(int(cc.seg)*2)+1)
switch rnd {
case 0:
ctex.DrawRectangle(rect.X()-ww/2+rect.W()/2, rect.Y()+hh/2+rect.H()/2, ww, hh)
case 1:
ctex.DrawRectangle(rect.X()-ww/2-rect.W()/2, rect.Y()+hh/2+rect.H()/2, ww, hh)
case 2:
ctex.DrawRectangle(rect.X()-ww/2+rect.W()/2, rect.Y()+hh/2-rect.H()/2, ww, hh)
case 3:
ctex.DrawRectangle(rect.X()-ww/2-rect.W()/2, rect.Y()+hh/2-rect.H()/2, ww, hh)
}
ctex.SetColor(common.Black)
ctex.StrokePreserve()
ctex.SetColor(c.Opts().ColorSchema()[rand.Intn(len(c.Opts().ColorSchema()))])
ctex.Fill()
}