add pixel hole; move color to common folder
This commit is contained in:
parent
3328f24db7
commit
3275179fc1
24 changed files with 386 additions and 233 deletions
63
README.md
63
README.md
|
@ -4,7 +4,6 @@
|
|||
[![Go Report Card](https://goreportcard.com/badge/github.com/jdxyw/generativeart)](https://goreportcard.com/report/github.com/jdxyw/generativeart)
|
||||
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/jdxyw/generativeart/master/LICENSE)
|
||||
|
||||
|
||||
`generativeart` is a `Go` package to generate many kinds of generative art. The goal is to collect some excellent generative art (implemented in `R` or `Processing`), and rewrite them in `Go` again. I would paste the original link at the end of this README(If I remember, you can also submit a PR if you found I missed something.). Currently, it supports the following type.
|
||||
|
||||
## Buy me a coffee
|
||||
|
@ -36,6 +35,7 @@ This package is still working in progress. More types would be added. Welcome an
|
|||
- Noise Line
|
||||
- Ocean Fish
|
||||
- Circle Loop2
|
||||
- Pixel Hole
|
||||
|
||||
For these kinds of art, the package provides as many parameters to control the appearance.
|
||||
|
||||
|
@ -68,6 +68,7 @@ NewCircleGrid(circleNumMin, circleNumMax int)
|
|||
NewContourLine(lineNum int)
|
||||
NewNoiseLine(n int)
|
||||
NewCircleLoop2(depth int)
|
||||
NewPixelHole(dotN int)
|
||||
```
|
||||
|
||||
## Docs
|
||||
|
@ -77,6 +78,7 @@ You could find the docs in the [doc](./docs).
|
|||
## Examples
|
||||
|
||||
You could find examples for all types under [example](./example).
|
||||
|
||||
## General Options
|
||||
|
||||
```go
|
||||
|
@ -94,6 +96,7 @@ type Options struct {
|
|||
The `Options` is a global option for the whole `canva`. It includes those general parameters used by different kinds of types, such as `background`, `lineColor`, and `colorScheme`.
|
||||
|
||||
For those parameters specified for different kinds of art types, they have their own `struct`.
|
||||
|
||||
## Usage and example
|
||||
|
||||
### Junas
|
||||
|
@ -206,6 +209,30 @@ func main() {
|
|||
|
||||
![](images/colorloop2.png)
|
||||
|
||||
## Pixel Hole
|
||||
|
||||
```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(800, 800)
|
||||
c.SetBackground(common.Black)
|
||||
c.FillBackground()
|
||||
c.SetColorSchema(colors)
|
||||
c.SetIterations(1200)
|
||||
c.Draw(generativeart.NewPixelHole(60))
|
||||
c.ToPNG("pixelhole.png")
|
||||
}
|
||||
```
|
||||
|
||||
![](images/pixelhole.png)
|
||||
|
||||
### Silk Smoke
|
||||
|
||||
```go
|
||||
|
@ -330,7 +357,6 @@ func main() {
|
|||
|
||||
![](images/circleloop.png)
|
||||
|
||||
|
||||
### Julia Set
|
||||
|
||||
```go
|
||||
|
@ -417,19 +443,20 @@ func main() {
|
|||
|
||||
Thanks for the following sites and repos, I got lots of ideas, inspiration, code, and tricks from them. The list would be very long; sorry for forgetting some of them.
|
||||
|
||||
- https://inconvergent.net/
|
||||
- https://fronkonstin.com/
|
||||
- https://github.com/aschinchon/cyclic-cellular-automata
|
||||
- https://github.com/armdz/ProcessingSketchs
|
||||
- https://github.com/Mr-Slesser/Generative-Art-And-Fractals
|
||||
- https://github.com/cdr6934/Generative-Processing-Experiments
|
||||
- https://github.com/pkd2512/inktober2017
|
||||
- http://blog.dragonlab.de/2015/03/generative-art-week-1
|
||||
- https://editor.p5js.org/kenekk1/sketches/Ly-5XYvKX
|
||||
- http://paulbourke.net/fractals/peterdejong/
|
||||
- https://editor.p5js.org/kenekk1/sketches/O44Dln5oo
|
||||
- https://openprocessing.org/sketch/1071233
|
||||
- https://twitter.com/okazz_
|
||||
- https://openprocessing.org/sketch/738638
|
||||
- https://openprocessing.org/sketch/1102157
|
||||
- https://openprocessing.org/sketch/1071233
|
||||
- <https://inconvergent.net/>
|
||||
- <https://fronkonstin.com/>
|
||||
- <https://github.com/aschinchon/cyclic-cellular-automata>
|
||||
- <https://github.com/armdz/ProcessingSketchs>
|
||||
- <https://github.com/Mr-Slesser/Generative-Art-And-Fractals>
|
||||
- <https://github.com/cdr6934/Generative-Processing-Experiments>
|
||||
- <https://github.com/pkd2512/inktober2017>
|
||||
- <http://blog.dragonlab.de/2015/03/generative-art-week-1>
|
||||
- <https://editor.p5js.org/kenekk1/sketches/Ly-5XYvKX>
|
||||
- <http://paulbourke.net/fractals/peterdejong/>
|
||||
- <https://editor.p5js.org/kenekk1/sketches/O44Dln5oo>
|
||||
- <https://openprocessing.org/sketch/1071233>
|
||||
- <https://twitter.com/okazz_>
|
||||
- <https://openprocessing.org/sketch/738638>
|
||||
- <https://openprocessing.org/sketch/1102157>
|
||||
- <https://openprocessing.org/sketch/1071233>
|
||||
- <https://openprocessing.org/user/139364>
|
||||
|
|
|
@ -1,6 +1,9 @@
|
|||
package common
|
||||
|
||||
import "math"
|
||||
import (
|
||||
"image/color"
|
||||
"math"
|
||||
)
|
||||
|
||||
// Constrain returns a value between a minimum and maximum value.
|
||||
func Constrain(val, low, high float64) float64 {
|
||||
|
@ -17,3 +20,13 @@ func Remap(n, start1, stop1, start2, stop2 float64) float64 {
|
|||
return Constrain(newval, stop2, start2)
|
||||
}
|
||||
}
|
||||
|
||||
// LerpColor blends two colors to find a third color somewhere between them.
|
||||
func LerpColor(c1, c2 color.RGBA, ratio float64) color.RGBA {
|
||||
r := uint8(float64(c1.R)*ratio + float64(c2.R)*(1-ratio))
|
||||
g := uint8(float64(c1.G)*ratio + float64(c2.G)*(1-ratio))
|
||||
b := uint8(float64(c1.B)*ratio + float64(c2.B)*(1-ratio))
|
||||
a := uint8(float64(c1.A)*ratio + float64(c2.A)*(1-ratio))
|
||||
|
||||
return color.RGBA{r, g, b, a}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package generativeart
|
||||
package common
|
||||
|
||||
import "image/color"
|
||||
|
14
docs/doc.md
14
docs/doc.md
|
@ -137,3 +137,17 @@ cl := generativeart.NewCircleLoop2(7)
|
|||
```
|
||||
|
||||
![](../images/colorloop2.png)
|
||||
|
||||
## Pixel Hole
|
||||
|
||||
`Pixel Hole` draws a hole with colored dots.
|
||||
|
||||
### parameters
|
||||
|
||||
- dotN: The number of point in each iteration.
|
||||
|
||||
```go
|
||||
ph := generativeart.NewPixelHole(60)
|
||||
```
|
||||
|
||||
![](../images/pixelhole.png)
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
@ -9,9 +10,9 @@ import (
|
|||
func main() {
|
||||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(600, 600)
|
||||
c.SetBackground(generativeart.Tan)
|
||||
c.SetBackground(common.Tan)
|
||||
c.SetLineWidth(1.0)
|
||||
c.SetLineColor(generativeart.LightPink)
|
||||
c.SetLineColor(common.LightPink)
|
||||
c.FillBackground()
|
||||
c.Draw(generativeart.NewCircleLine(0.02, 600, 1.5, 2, 2))
|
||||
c.ToPNG("circleline.png")
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
@ -9,9 +10,9 @@ import (
|
|||
func main() {
|
||||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(500, 500)
|
||||
c.SetBackground(generativeart.Black)
|
||||
c.SetBackground(common.Black)
|
||||
c.SetLineWidth(1)
|
||||
c.SetLineColor(generativeart.Orange)
|
||||
c.SetLineColor(common.Orange)
|
||||
c.SetAlpha(30)
|
||||
c.SetIterations(1000)
|
||||
c.FillBackground()
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"image/color"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
@ -20,7 +21,7 @@ func main() {
|
|||
{0xFF, 0xFF, 0xFF, 0xFF},
|
||||
}
|
||||
c := generativeart.NewCanva(1000, 1000)
|
||||
c.SetBackground(generativeart.White)
|
||||
c.SetBackground(common.White)
|
||||
c.FillBackground()
|
||||
c.SetColorSchema(colors)
|
||||
c.Draw(generativeart.NewColorCircle(500))
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"image/color"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
@ -17,7 +18,7 @@ func main() {
|
|||
{0xF4, 0x9F, 0x0A, 0xFF},
|
||||
}
|
||||
c := generativeart.NewCanva(800, 800)
|
||||
c.SetBackground(generativeart.White)
|
||||
c.SetBackground(common.White)
|
||||
c.FillBackground()
|
||||
c.SetColorSchema(colors)
|
||||
c.Draw(generativeart.NewColorCircle2(30))
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"image/color"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
@ -13,7 +14,7 @@ func main() {
|
|||
c.SetBackground(color.RGBA{230, 230, 230, 255})
|
||||
c.SetLineWidth(10)
|
||||
c.SetIterations(15000)
|
||||
c.SetColorSchema(generativeart.Plasma)
|
||||
c.SetColorSchema(common.Plasma)
|
||||
c.FillBackground()
|
||||
c.Draw(generativeart.NewDotLine(100, 20, 50, false))
|
||||
c.ToPNG("dotline.png")
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
@ -9,8 +10,8 @@ import (
|
|||
func main() {
|
||||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(600, 600)
|
||||
c.SetBackground(generativeart.DarkPink[rand.Intn(5)])
|
||||
c.SetColorSchema(generativeart.DarkPink)
|
||||
c.SetBackground(common.DarkPink[rand.Intn(5)])
|
||||
c.SetColorSchema(common.DarkPink)
|
||||
c.Draw(generativeart.NewGirdSquares(24, 10, 0.2))
|
||||
c.ToPNG("gsquare.png")
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
@ -9,10 +10,10 @@ import (
|
|||
func main() {
|
||||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(500, 500)
|
||||
c.SetBackground(generativeart.Black)
|
||||
c.SetBackground(common.Black)
|
||||
c.FillBackground()
|
||||
c.SetColorSchema(generativeart.DarkRed)
|
||||
c.SetForeground(generativeart.LightPink)
|
||||
c.SetColorSchema(common.DarkRed)
|
||||
c.SetForeground(common.LightPink)
|
||||
c.Draw(generativeart.NewJanus(10, 0.2))
|
||||
c.ToPNG("janus.png")
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
@ -18,7 +19,7 @@ func main() {
|
|||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(500, 500)
|
||||
c.SetIterations(800)
|
||||
c.SetColorSchema(generativeart.Viridis)
|
||||
c.SetColorSchema(common.Viridis)
|
||||
c.FillBackground()
|
||||
c.Draw(generativeart.NewJulia(julia1, 40, 1.5, 1.5))
|
||||
c.ToPNG("julia.png")
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
@ -9,9 +10,9 @@ import (
|
|||
func main() {
|
||||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(600, 600)
|
||||
c.SetBackground(generativeart.Azure)
|
||||
c.SetBackground(common.Azure)
|
||||
c.SetLineWidth(3)
|
||||
c.SetLineColor(generativeart.Orange)
|
||||
c.SetLineColor(common.Orange)
|
||||
c.FillBackground()
|
||||
c.Draw(generativeart.NewMaze(20))
|
||||
c.ToPNG("maze.png")
|
||||
|
|
28
example/example_pixelhole.go
Normal file
28
example/example_pixelhole.go
Normal file
|
@ -0,0 +1,28 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"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(800, 800)
|
||||
c.SetBackground(common.Black)
|
||||
c.FillBackground()
|
||||
c.SetColorSchema(colors)
|
||||
c.SetIterations(1200)
|
||||
c.Draw(generativeart.NewPixelHole(60))
|
||||
c.ToPNG("pixelhole.png")
|
||||
|
||||
}
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
@ -9,7 +10,7 @@ import (
|
|||
func main() {
|
||||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(500, 500)
|
||||
c.SetBackground(generativeart.Lavender)
|
||||
c.SetBackground(common.Lavender)
|
||||
c.SetLineWidth(2)
|
||||
c.SetIterations(150000)
|
||||
c.FillBackground()
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"image/color"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
@ -10,7 +11,7 @@ import (
|
|||
func main() {
|
||||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(500, 500)
|
||||
c.SetBackground(generativeart.MistyRose)
|
||||
c.SetBackground(common.MistyRose)
|
||||
c.SetLineWidth(1.0)
|
||||
c.SetLineColor(color.RGBA{
|
||||
R: 122,
|
||||
|
@ -18,7 +19,7 @@ func main() {
|
|||
B: 122,
|
||||
A: 30,
|
||||
})
|
||||
c.SetColorSchema(generativeart.Plasma)
|
||||
c.SetColorSchema(common.Plasma)
|
||||
c.SetIterations(4)
|
||||
c.FillBackground()
|
||||
c.Draw(generativeart.NewRandCicle(30, 80, 0.2, 2, 10, 30, true))
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"image/color"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
@ -10,7 +11,7 @@ import (
|
|||
func main() {
|
||||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(500, 500)
|
||||
c.SetBackground(generativeart.White)
|
||||
c.SetBackground(common.White)
|
||||
c.FillBackground()
|
||||
c.SetColorSchema([]color.RGBA{
|
||||
{0xCF, 0x2B, 0x34, 0xFF},
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
@ -9,11 +10,11 @@ import (
|
|||
func main() {
|
||||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(500, 500)
|
||||
c.SetBackground(generativeart.Black)
|
||||
c.SetBackground(common.Black)
|
||||
c.SetLineWidth(1.0)
|
||||
c.SetLineColor(generativeart.MediumAquamarine)
|
||||
c.SetLineColor(common.MediumAquamarine)
|
||||
c.SetAlpha(30)
|
||||
c.SetColorSchema(generativeart.Plasma)
|
||||
c.SetColorSchema(common.Plasma)
|
||||
c.SetIterations(4)
|
||||
c.FillBackground()
|
||||
c.Draw(generativeart.NewSilkSmoke(400, 20, 0.2, 2, 10, 30, false))
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"math/rand"
|
||||
"time"
|
||||
)
|
||||
|
@ -9,11 +10,11 @@ import (
|
|||
func main() {
|
||||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(500, 500)
|
||||
c.SetBackground(generativeart.MistyRose)
|
||||
c.SetBackground(common.MistyRose)
|
||||
c.SetLineWidth(10)
|
||||
c.SetLineColor(generativeart.Orange)
|
||||
c.SetColorSchema(generativeart.Plasma)
|
||||
c.SetForeground(generativeart.Tomato)
|
||||
c.SetLineColor(common.Orange)
|
||||
c.SetColorSchema(common.Plasma)
|
||||
c.SetForeground(common.Tomato)
|
||||
c.FillBackground()
|
||||
c.Draw(generativeart.NewSpiralSquare(40, 400, 0.05, true))
|
||||
c.ToPNG("spiralsquare.png")
|
||||
|
|
|
@ -2,6 +2,7 @@ package main
|
|||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"image/color"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
@ -10,7 +11,7 @@ import (
|
|||
func main() {
|
||||
rand.Seed(time.Now().Unix())
|
||||
c := generativeart.NewCanva(1600, 1600)
|
||||
c.SetBackground(generativeart.Azure)
|
||||
c.SetBackground(common.Azure)
|
||||
c.FillBackground()
|
||||
c.SetForeground(color.RGBA{113, 3, 0, 140})
|
||||
c.SetIterations(4000000)
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package generativeart
|
||||
|
||||
import (
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"image"
|
||||
"image/color"
|
||||
"image/draw"
|
||||
|
@ -37,11 +38,11 @@ func NewCanva(h, w int) *canva {
|
|||
img: image.NewRGBA(image.Rect(0, 0, h, w)),
|
||||
// Set some defaults value
|
||||
opts: Options{
|
||||
background: Azure,
|
||||
foreground: MistyRose,
|
||||
lineColor: Tomato,
|
||||
background: common.Azure,
|
||||
foreground: common.MistyRose,
|
||||
lineColor: common.Tomato,
|
||||
lineWidth: 3,
|
||||
colorSchema: Plasma,
|
||||
colorSchema: common.Plasma,
|
||||
nIters: 20,
|
||||
alpha: 255,
|
||||
},
|
||||
|
|
BIN
images/pixelhole.png
Normal file
BIN
images/pixelhole.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 452 KiB |
|
@ -23,7 +23,7 @@ func (nl *noiseLine) Generative(c *canva) {
|
|||
ctex := gg.NewContextForRGBA(c.img)
|
||||
noise := common.NewPerlinNoise()
|
||||
|
||||
ctex.SetColor(Black)
|
||||
ctex.SetColor(common.Black)
|
||||
for i := 0; i < 80; i++ {
|
||||
x := rand.Float64() * float64(c.width)
|
||||
y := rand.Float64() * float64(c.height)
|
||||
|
|
55
pixelhole.go
Normal file
55
pixelhole.go
Normal file
|
@ -0,0 +1,55 @@
|
|||
package generativeart
|
||||
|
||||
import (
|
||||
"github.com/fogleman/gg"
|
||||
"github.com/jdxyw/generativeart/common"
|
||||
"math"
|
||||
"math/rand"
|
||||
)
|
||||
|
||||
type pixelHole struct {
|
||||
dotN int
|
||||
noise *common.PerlinNoise
|
||||
}
|
||||
|
||||
// NewPixelHole returns a pixelHole object.
|
||||
func NewPixelHole(dotN int) *pixelHole {
|
||||
return &pixelHole{
|
||||
dotN: dotN,
|
||||
noise: common.NewPerlinNoise(),
|
||||
}
|
||||
}
|
||||
|
||||
// Generative draws a pixel hole images.
|
||||
func (p *pixelHole) Generative(c *canva) {
|
||||
ctex := gg.NewContextForRGBA(c.img)
|
||||
//ctex.Translate(float64(c.width)/2, float64(c.height)/2)
|
||||
for i := 0.0; i < float64(c.opts.nIters); i += 1.0 {
|
||||
ctex.Push()
|
||||
ctex.Translate(float64(c.width)/2, float64(c.height)/2)
|
||||
p.draw(ctex, c, i)
|
||||
ctex.Pop()
|
||||
}
|
||||
}
|
||||
|
||||
func (p *pixelHole) draw(ctex *gg.Context, c *canva, frameCount float64) {
|
||||
ctex.SetLineWidth(2.0)
|
||||
c1 := int(frameCount/100.0) % len(c.opts.colorSchema)
|
||||
c2 := (int(frameCount/100.0) + 1) % len(c.opts.colorSchema)
|
||||
ratio := frameCount/100 - math.Floor(frameCount/100)
|
||||
cl := common.LerpColor(c.opts.colorSchema[c1], c.opts.colorSchema[c2], ratio)
|
||||
for i := 0.0; i < float64(p.dotN); i += 1.0 {
|
||||
ctex.Push()
|
||||
ctex.SetColor(cl)
|
||||
ctex.Rotate(frameCount/(50+10*math.Log(frameCount+1)) + i/20)
|
||||
dd := frameCount/(5+i) + frameCount/5 + math.Sin(i)*50
|
||||
ctex.Translate(common.RandomRangeFloat64(dd/2, dd), 0)
|
||||
x := p.noise.Noise2D(frameCount/50+i/50, 5000)*float64(c.width)/10 + rand.Float64()*float64(c.width)/20
|
||||
y := p.noise.Noise2D(frameCount/50+i/50, 10000)*float64(c.height)/10 + rand.Float64()*float64(c.height)/20
|
||||
|
||||
rr := common.RandomRangeFloat64(1.0, 6-math.Log(frameCount+1)/10)
|
||||
ctex.DrawEllipse(x, y, rr, rr)
|
||||
ctex.Fill()
|
||||
ctex.Pop()
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue