diff --git a/README.md b/README.md index 911f072..616639e 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ This package is still working in progress. More types would be added. Welcome an - Circle Grid - Contour Line - Noise Line +- Ocean Fish For these kinds of art, the package provides as many parameters to control the appearance. @@ -245,6 +246,46 @@ func main() { ``` ![](images/noiseline.png) + +### Dot Line + +```go +func main() { + rand.Seed(time.Now().Unix()) + c := generativeart.NewCanva(2080, 2080) + c.SetBackground(color.RGBA{230, 230, 230, 255}) + c.SetLineWidth(10) + c.SetIterations(4000) + c.SetColorSchema(generativeart.Plasma) + c.FillBackground() + c.Draw(generativeart.NewDotLine(100, 20, 50, false)) + c.ToPNG("dotline.png") +} +``` + +![](images/dotline.png) + +### Ocean Fish + +```go +func main() { + rand.Seed(time.Now().Unix()) + colors := []color.RGBA{ + {0xCF, 0x2B, 0x34, 0xFF}, + {0xF0, 0x8F, 0x46, 0xFF}, + {0xF0, 0xC1, 0x29, 0xFF}, + {0x19, 0x6E, 0x94, 0xFF}, + {0x35, 0x3A, 0x57, 0xFF}, + } + c := generativeart.NewCanva(500, 500) + c.SetColorSchema(colors) + c.Draw(generativeart.NewOceanFish(100, 8)) + c.ToPNG("oceanfish.png") +} +``` + +![](images/oceanfish.png) + ### Circle Loop ```go @@ -264,23 +305,6 @@ func main() { ![](images/circleloop.png) -### Dot Line - -```go -func main() { - rand.Seed(time.Now().Unix()) - c := generativeart.NewCanva(2080, 2080) - c.SetBackground(color.RGBA{230, 230, 230, 255}) - c.SetLineWidth(10) - c.SetIterations(4000) - c.SetColorSchema(generativeart.Plasma) - c.FillBackground() - c.Draw(generativeart.NewDotLine(100, 20, 50, false)) - c.ToPNG("dotline.png") -} -``` - -![](images/dotline.png) ### Julia Set @@ -382,3 +406,4 @@ Thanks for the following sites and repos, I got lots of ideas, inspiration, code - https://openprocessing.org/sketch/1071233 - https://twitter.com/okazz_ - https://openprocessing.org/sketch/738638 +- https://openprocessing.org/sketch/1102157 \ No newline at end of file diff --git a/docs/doc.md b/docs/doc.md index 0c4e103..2ed2d83 100644 --- a/docs/doc.md +++ b/docs/doc.md @@ -107,4 +107,19 @@ julia := generativeart.NewJulia(julia1, 40, 1.5, 1.5) nl := generativeart.NewNoiseLine(1000) ``` -![](../images/noiseline.png) \ No newline at end of file +![](../images/noiseline.png) + +## Ocean Fish + +`Ocean Fish` draws a ocean and some fishes in the center. + +### parameters + +- lineNum: The number of the line used to simulate the ocean wave. +- fishNum: The number of fish. + +```go +o := generativeart.NewOceanFish(100, 8) +``` + +![](../images/oceanfish.png) \ No newline at end of file diff --git a/example/example_oceanfish.go b/example/example_oceanfish.go new file mode 100644 index 0000000..40a4aad --- /dev/null +++ b/example/example_oceanfish.go @@ -0,0 +1,30 @@ +package main + +import ( + "github.com/jdxyw/generativeart" + "image/color" + "math/rand" + "time" +) + +func main() { + rand.Seed(time.Now().Unix()) + //colors := []color.RGBA{ + // {0x05, 0x1F, 0x34, 0xFF}, + // {0x02, 0x74, 0x95, 0xFF}, + // {0x01, 0xA9, 0xC1, 0xFF}, + // {0xBA, 0xD6, 0xDB, 0xFF}, + // {0xF4, 0xF5, 0xF5, 0xFF}, + //} + colors := []color.RGBA{ + {0xCF, 0x2B, 0x34, 0xFF}, + {0xF0, 0x8F, 0x46, 0xFF}, + {0xF0, 0xC1, 0x29, 0xFF}, + {0x19, 0x6E, 0x94, 0xFF}, + {0x35, 0x3A, 0x57, 0xFF}, + } + c := generativeart.NewCanva(500, 500) + c.SetColorSchema(colors) + c.Draw(generativeart.NewOceanFish(100, 8)) + c.ToPNG("oceanfish.png") +} diff --git a/images/oceanfish.png b/images/oceanfish.png new file mode 100644 index 0000000..f95509f Binary files /dev/null and b/images/oceanfish.png differ diff --git a/oceanfish.go b/oceanfish.go new file mode 100644 index 0000000..e7e6157 --- /dev/null +++ b/oceanfish.go @@ -0,0 +1,74 @@ +package generativeart + +import ( + "github.com/fogleman/gg" + "github.com/jdxyw/generativeart/common" + "math" + "math/rand" +) + +type oceanFish struct { + lineNum int + fishNum int +} + +// NewOceanFish returns a oceanFish object. +func NewOceanFish(lineNum, fishNum int) *oceanFish { + return &oceanFish{ + lineNum: lineNum, + fishNum: fishNum, + } +} + +// Generative draws a ocean and fish images. +func (o *oceanFish) Generative(c *canva) { + ctex := gg.NewContextForRGBA(c.img) + + o.drawlines(ctex, c) + + for i := 0; i < o.fishNum; i++ { + ctex.Push() + + theta := float64(360*i) / float64(o.fishNum) + r := float64(c.width) / 4.0 + + ctex.Push() + ctex.Translate(float64(c.width/2)+r*math.Cos(gg.Radians(theta)), float64(c.height/2)+r*math.Sin(gg.Radians(theta))) + ctex.Rotate(gg.Radians(theta + 90)) + o.drawfish(ctex, c, 0, 0, float64(c.width)/10) + ctex.Pop() + + ctex.Clip() + o.drawlines(ctex, c) + ctex.Pop() + ctex.ClearPath() + ctex.ResetClip() + } +} + +func (o *oceanFish) drawlines(ctx *gg.Context, c *canva) { + for i := 0; i < o.lineNum; i++ { + cl := c.opts.colorSchema[rand.Intn(len(c.opts.colorSchema))] + ctx.SetColor(cl) + ctx.SetLineWidth(common.RandomRangeFloat64(3, 20)) + y := rand.Float64() * float64(c.height) + ctx.DrawLine(0, y+common.RandomRangeFloat64(-50, 50), float64(c.width), y+common.RandomRangeFloat64(-50, 50)) + ctx.Stroke() + } +} + +func (o *oceanFish) drawfish(ctex *gg.Context, c *canva, ox, oy, r float64) { + ctex.Push() + ctex.Translate(ox, oy) + ctex.Rotate(gg.Radians(180)) + + ctex.MoveTo(r*math.Cos(gg.Radians(0))-r*math.Pow(math.Sin(gg.Radians(0)), 2)/math.Sqrt(2), + r*math.Cos(gg.Radians(0))*math.Sin(gg.Radians(0))) + for theta := 1.0; theta < 361.0; theta += 1.0 { + x := r*math.Cos(gg.Radians(theta)) - r*math.Pow(math.Sin(gg.Radians(theta)), 2)/math.Sqrt(2) + y := r * math.Cos(gg.Radians(theta)) * math.Sin(gg.Radians(theta)) + ctex.LineTo(x, y) + } + ctex.ClosePath() + ctex.Pop() +}