67 lines
1.7 KiB
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()
|
|
}
|