add swirl
This commit is contained in:
parent
ee719fc631
commit
c85e0b7a5c
7 changed files with 138 additions and 2 deletions
21
README.md
21
README.md
|
@ -16,6 +16,7 @@
|
||||||
- Circle Loop
|
- Circle Loop
|
||||||
- Silk Sky
|
- Silk Sky
|
||||||
- Dot Line
|
- Dot Line
|
||||||
|
- Swirl
|
||||||
|
|
||||||
For these kinds of art, the package provides as many as parameters to control the appearance.
|
For these kinds of art, the package provides as many as parameters to control the appearance.
|
||||||
|
|
||||||
|
@ -37,6 +38,8 @@ NewRandCicle(mc, msp int, minStep, maxStep, minr, maxr float64, isRandColor bool
|
||||||
NewSilkSky(circleNum int, sunRadius float64)
|
NewSilkSky(circleNum int, sunRadius float64)
|
||||||
NewSilkSmoke(mc, msp int, minStep, maxStep, minRadius, maxRadius float64, isRandColor bool)
|
NewSilkSmoke(mc, msp int, minStep, maxStep, minRadius, maxRadius float64, isRandColor bool)
|
||||||
NewSpiralSquare(squareNum int, rectSide, decay float64, randColor bool)
|
NewSpiralSquare(squareNum int, rectSide, decay float64, randColor bool)
|
||||||
|
NewSwirl(a, b, c, d, xaixs, yaixs float64)
|
||||||
|
NewDotLine(n int, ras, canv float64, randColor bool)
|
||||||
```
|
```
|
||||||
|
|
||||||
## General Options
|
## General Options
|
||||||
|
@ -157,6 +160,23 @@ func main() {
|
||||||
|
|
||||||
![](images/julia.png)
|
![](images/julia.png)
|
||||||
|
|
||||||
|
### Swirl
|
||||||
|
|
||||||
|
```go
|
||||||
|
func main() {
|
||||||
|
rand.Seed(time.Now().Unix())
|
||||||
|
c := generativeart.NewCanva(1600, 1600)
|
||||||
|
c.SetBackground(generativeart.Azure)
|
||||||
|
c.FillBackground()
|
||||||
|
c.SetForeground(color.RGBA{113, 3, 0, 180})
|
||||||
|
c.SetIterations(8000000)
|
||||||
|
c.Draw(generativeart.NewSwirl(0.970, -1.899, -1.381, -1.506, 2.0, 2.0))
|
||||||
|
c.ToPNG("swirl.png")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
![](images/swirl.png)
|
||||||
|
|
||||||
### Circle Line
|
### Circle Line
|
||||||
|
|
||||||
```go
|
```go
|
||||||
|
@ -246,3 +266,4 @@ Thanks for the following sites and repos, I got lots of ideas, inspiration, code
|
||||||
- https://github.com/pkd2512/inktober2017
|
- https://github.com/pkd2512/inktober2017
|
||||||
- http://blog.dragonlab.de/2015/03/generative-art-week-1
|
- http://blog.dragonlab.de/2015/03/generative-art-week-1
|
||||||
- https://editor.p5js.org/kenekk1/sketches/Ly-5XYvKX
|
- https://editor.p5js.org/kenekk1/sketches/Ly-5XYvKX
|
||||||
|
- http://paulbourke.net/fractals/peterdejong/
|
||||||
|
|
|
@ -45,7 +45,7 @@ func (d *dotLine) Generative(c *canva) {
|
||||||
newx = oldx
|
newx = oldx
|
||||||
newy = oldy
|
newy = oldy
|
||||||
}
|
}
|
||||||
if newx == oldx && rand.Intn(3) > 1 {
|
if newx == oldx && rand.Intn(6) > 4 {
|
||||||
ctex.DrawEllipse(float64(oldx)*d.ras+d.canv, float64(oldy)*d.ras+d.canv, c.opts.lineWidth, c.opts.lineWidth)
|
ctex.DrawEllipse(float64(oldx)*d.ras+d.canv, float64(oldy)*d.ras+d.canv, c.opts.lineWidth, c.opts.lineWidth)
|
||||||
ctex.Fill()
|
ctex.Fill()
|
||||||
continue
|
continue
|
||||||
|
|
|
@ -12,7 +12,7 @@ func main() {
|
||||||
c := generativeart.NewCanva(2080, 2080)
|
c := generativeart.NewCanva(2080, 2080)
|
||||||
c.SetBackground(color.RGBA{230, 230, 230, 255})
|
c.SetBackground(color.RGBA{230, 230, 230, 255})
|
||||||
c.SetLineWidth(10)
|
c.SetLineWidth(10)
|
||||||
c.SetIterations(4000)
|
c.SetIterations(15000)
|
||||||
c.SetColorSchema(generativeart.Plasma)
|
c.SetColorSchema(generativeart.Plasma)
|
||||||
c.FillBackground()
|
c.FillBackground()
|
||||||
c.Draw(generativeart.NewDotLine(100, 20, 50, false))
|
c.Draw(generativeart.NewDotLine(100, 20, 50, false))
|
||||||
|
|
19
example/example_swirl.go
Normal file
19
example/example_swirl.go
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/jdxyw/generativeart"
|
||||||
|
"image/color"
|
||||||
|
"math/rand"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
rand.Seed(time.Now().Unix())
|
||||||
|
c := generativeart.NewCanva(1600, 1600)
|
||||||
|
c.SetBackground(generativeart.Azure)
|
||||||
|
c.FillBackground()
|
||||||
|
c.SetForeground(color.RGBA{113, 3, 0, 180})
|
||||||
|
c.SetIterations(8000000)
|
||||||
|
c.Draw(generativeart.NewSwirl(0.970, -1.899, -1.381, -1.506, 2.0, 2.0))
|
||||||
|
c.ToPNG("swirl.png")
|
||||||
|
}
|
Binary file not shown.
Before Width: | Height: | Size: 760 KiB After Width: | Height: | Size: 773 KiB |
BIN
images/swirl.png
Normal file
BIN
images/swirl.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 665 KiB |
96
swirl.go
Normal file
96
swirl.go
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
package generativeart
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/fogleman/gg"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
type swirl struct {
|
||||||
|
// These are some math parameters.
|
||||||
|
// http://paulbourke.net/fractals/peterdejong/
|
||||||
|
a, b, c, d, xaixs, yaixs float64
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewSwirl(a, b, c, d, xaixs, yaixs float64) *swirl {
|
||||||
|
return &swirl{
|
||||||
|
a: a,
|
||||||
|
b: b,
|
||||||
|
c: c,
|
||||||
|
d: d,
|
||||||
|
xaixs: xaixs,
|
||||||
|
yaixs: yaixs,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generative draws a swirl image.
|
||||||
|
func (s *swirl) Generative(c *canva) {
|
||||||
|
ctex := gg.NewContextForRGBA(c.img)
|
||||||
|
ctex.SetLineWidth(c.opts.lineWidth)
|
||||||
|
start := point{
|
||||||
|
x: 1.0,
|
||||||
|
y: 1.0,
|
||||||
|
}
|
||||||
|
cl := c.opts.foreground
|
||||||
|
|
||||||
|
for i := 0; i < c.opts.nIters; i++ {
|
||||||
|
next := s.swirlTransform(start)
|
||||||
|
x, y := ConvertCartesianToPixel(next.x, next.y, s.xaixs, s.yaixs, c.height, c.width)
|
||||||
|
c.img.Set(x, y, cl)
|
||||||
|
start = next
|
||||||
|
}
|
||||||
|
|
||||||
|
s.removeNoisy(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *swirl) swirlTransform(p point) point {
|
||||||
|
return point{
|
||||||
|
x: math.Sin(s.a*p.y) - math.Cos(s.b*p.x),
|
||||||
|
y: math.Sin(s.c*p.x) - math.Cos(s.d*p.y),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *swirl) removeNoisy(c *canva) {
|
||||||
|
for i := 1; i < c.width-1; i++ {
|
||||||
|
for j := 1; j < c.height-1; j++ {
|
||||||
|
if c.img.At(i, j) == c.opts.background {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
var n int
|
||||||
|
if c.img.At(i+1, j) == c.opts.background {
|
||||||
|
n += 1
|
||||||
|
}
|
||||||
|
if c.img.At(i+1, j+1) == c.opts.background {
|
||||||
|
n += 1
|
||||||
|
}
|
||||||
|
if c.img.At(i, j+1) == c.opts.background {
|
||||||
|
n += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.img.At(i-1, j) == c.opts.background {
|
||||||
|
n += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.img.At(i-1, j+1) == c.opts.background {
|
||||||
|
n += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.img.At(i-1, j-1) == c.opts.background {
|
||||||
|
n += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.img.At(i+1, j-1) == c.opts.background {
|
||||||
|
n += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.img.At(i, j-1) == c.opts.background {
|
||||||
|
n += 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if n > 5 {
|
||||||
|
c.img.Set(i, j, c.opts.background)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue