From ea6856eb5412fd0bc358660b79fde7e50a358d69 Mon Sep 17 00:00:00 2001 From: Yongwei Xing Date: Mon, 22 Mar 2021 14:58:39 +0800 Subject: [PATCH] add color canva --- README.md | 25 +++++++++++++ arts/colorcanva.go | 66 ++++++++++++++++++++++++++++++++++ common/rect.go | 30 ++++++++++++++++ docs/doc.md | 27 ++++++++++---- example/example_colorcanva.go | 28 +++++++++++++++ images/colorcanva.png | Bin 0 -> 4727 bytes 6 files changed, 170 insertions(+), 6 deletions(-) create mode 100644 arts/colorcanva.go create mode 100644 common/rect.go create mode 100644 example/example_colorcanva.go create mode 100644 images/colorcanva.png diff --git a/README.md b/README.md index ae511d4..2956134 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ - [Ocean Fish](#ocean-fish) - [Circle Loop](#circle-loop) - [Circle Noise](#circle-noise) + - [Color Canva](#color-canva) - [Julia Set](#julia-set) - [Black Hole](#black-hole) - [Silk Sky](#silk-sky) @@ -424,6 +425,30 @@ func main() { ![](images/circlenoise.png) +### Color Canva + +```go +func main() { + rand.Seed(time.Now().Unix()) + colors := []color.RGBA{ + {0xF9, 0xC8, 0x0E, 0xFF}, + {0xF8, 0x66, 0x24, 0xFF}, + {0xEA, 0x35, 0x46, 0xFF}, + {0x66, 0x2E, 0x9B, 0xFF}, + {0x43, 0xBC, 0xCD, 0xFF}, + } + c := generativeart.NewCanva(500, 500) + c.SetBackground(common.Black) + c.FillBackground() + c.SetLineWidth(8) + c.SetColorSchema(colors) + c.Draw(arts.NewColorCanve(5)) + c.ToPNG("colorcanva.png") +} +``` + +![](images/colorcanva.png) + ### Julia Set ```go diff --git a/arts/colorcanva.go b/arts/colorcanva.go new file mode 100644 index 0000000..3a07785 --- /dev/null +++ b/arts/colorcanva.go @@ -0,0 +1,66 @@ +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() +} diff --git a/common/rect.go b/common/rect.go new file mode 100644 index 0000000..ddfad59 --- /dev/null +++ b/common/rect.go @@ -0,0 +1,30 @@ +package common + +type Rect struct { + x, y, w, h float64 +} + +func (r Rect) X() float64 { + return r.x +} + +func (r Rect) Y() float64 { + return r.y +} + +func (r Rect) W() float64 { + return r.w +} + +func (r Rect) H() float64 { + return r.h +} + +func NewRect(x, y, w, h float64) *Rect { + return &Rect{ + x: x, + y: y, + w: w, + h: h, + } +} diff --git a/docs/doc.md b/docs/doc.md index 5fb0650..2281f9d 100644 --- a/docs/doc.md +++ b/docs/doc.md @@ -34,6 +34,9 @@ - [parameters](#parameters-14) - [Black Hole](#black-hole) - [parameters](#parameters-15) + - [Color Canva](#color-canva) + - [parameters](#parameters-16) + ## Color Circle 2 `Color Circle2` is version 2 of `Color Circle`. It still draws the circle and point cloud. @@ -95,9 +98,10 @@ rs := NewRandomShape(150) - lineNum: It indicates how many lines. ![](../images/contourline.png) + ## Silk Sky -`Silk Sky` would draw an image with multiple circles converge to one point or one circle. +`Silk Sky` would draw an image with multiple circles converge to one point or one circle. ### parameters @@ -122,9 +126,9 @@ silkSky := NewSilkSky(circleNum int, sunRadius float64) ```go func julia1(z complex128) complex128 { - c := complex(-0.1, 0.651) - z = z*z + c - return z + c := complex(-0.1, 0.651) + z = z*z + c + return z } julia := arts.NewJulia(julia1, 40, 1.5, 1.5) ``` @@ -206,7 +210,6 @@ d := arts.NewDotsWave(300) - circleNum: The number of the circle in the image. - ```go cm := arts.NewCircleMove(1000) ``` @@ -247,4 +250,16 @@ y := arts.NewYarn(2000) b := arts.NewBlackHole(200, 400, 0.01) ``` -![](../images/blackhole.png) \ No newline at end of file +![](../images/blackhole.png) + +## Color Canva + +### parameters + +- seg: + +```go +cc := arts.NewColorCanve(5) +``` + +![](../images/colorcanva.png) diff --git a/example/example_colorcanva.go b/example/example_colorcanva.go new file mode 100644 index 0000000..3ad6d66 --- /dev/null +++ b/example/example_colorcanva.go @@ -0,0 +1,28 @@ +package main + +import ( + "github.com/jdxyw/generativeart" + "github.com/jdxyw/generativeart/arts" + "github.com/jdxyw/generativeart/common" + "image/color" + "math/rand" + "time" +) + +func main() { + rand.Seed(time.Now().Unix()) + colors := []color.RGBA{ + {0xF9, 0xC8, 0x0E, 0xFF}, + {0xF8, 0x66, 0x24, 0xFF}, + {0xEA, 0x35, 0x46, 0xFF}, + {0x66, 0x2E, 0x9B, 0xFF}, + {0x43, 0xBC, 0xCD, 0xFF}, + } + c := generativeart.NewCanva(500, 500) + c.SetBackground(common.Black) + c.FillBackground() + c.SetLineWidth(8) + c.SetColorSchema(colors) + c.Draw(arts.NewColorCanve(5)) + c.ToPNG("colorcanva.png") +} diff --git a/images/colorcanva.png b/images/colorcanva.png new file mode 100644 index 0000000000000000000000000000000000000000..789347e9a6f3c998c28469d69a581654a12a6957 GIT binary patch literal 4727 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