add the dot line
This commit is contained in:
parent
4cf80677c7
commit
ee719fc631
5 changed files with 107 additions and 1 deletions
22
README.md
22
README.md
|
@ -4,7 +4,7 @@
|
||||||
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/jdxyw/generativeart/master/LICENSE)
|
[![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 code is collecting some excellent generative art (implemented in `R` or `Processing`), and implement them in `Go` again. Currently, it supports the following type.
|
`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 miss something.). Currently, it supports the following type.
|
||||||
|
|
||||||
- Maze
|
- Maze
|
||||||
- Julia Set
|
- Julia Set
|
||||||
|
@ -15,6 +15,7 @@ generativeart is a `Go` package to generate many kinds of generative art. The co
|
||||||
- Circle Line
|
- Circle Line
|
||||||
- Circle Loop
|
- Circle Loop
|
||||||
- Silk Sky
|
- Silk Sky
|
||||||
|
- Dot Line
|
||||||
|
|
||||||
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.
|
||||||
|
|
||||||
|
@ -115,6 +116,24 @@ func main() {
|
||||||
|
|
||||||
![](images/circleloop.png)
|
![](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
|
### Julia Set
|
||||||
|
|
||||||
```go
|
```go
|
||||||
|
@ -226,3 +245,4 @@ Thanks for the following sites and repos, I got lots of ideas, inspiration, code
|
||||||
- https://github.com/cdr6934/Generative-Processing-Experiments
|
- https://github.com/cdr6934/Generative-Processing-Experiments
|
||||||
- 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
|
||||||
|
|
61
dotLine.go
Normal file
61
dotLine.go
Normal file
|
@ -0,0 +1,61 @@
|
||||||
|
package generativeart
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/fogleman/gg"
|
||||||
|
"math/rand"
|
||||||
|
)
|
||||||
|
|
||||||
|
// TODO: figure out what the meaning of these parameters.
|
||||||
|
type dotLine struct {
|
||||||
|
n int
|
||||||
|
ras float64
|
||||||
|
canv float64
|
||||||
|
randColor bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDotLine(n int, ras, canv float64, randColor bool) *dotLine {
|
||||||
|
return &dotLine{
|
||||||
|
n: n,
|
||||||
|
ras: ras,
|
||||||
|
canv: canv,
|
||||||
|
randColor: randColor,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dotLine) Generative(c *canva) {
|
||||||
|
ctex := gg.NewContextForRGBA(c.img)
|
||||||
|
|
||||||
|
ctex.SetLineWidth(c.opts.lineWidth)
|
||||||
|
var dir []int = []int{-1, 1}
|
||||||
|
for i := 0; i < c.opts.nIters; i++ {
|
||||||
|
oldx := rand.Intn(d.n - 1)
|
||||||
|
oldy := rand.Intn(d.n - 1)
|
||||||
|
|
||||||
|
n := rand.Intn(7)
|
||||||
|
if d.randColor {
|
||||||
|
ctex.SetColor(c.opts.colorSchema[rand.Intn(len(c.opts.colorSchema))])
|
||||||
|
} else {
|
||||||
|
ctex.SetRGBA255(RandomRangeInt(222, 255), RandomRangeInt(20, 222), 0, 255)
|
||||||
|
}
|
||||||
|
for j := 0; j < n; j++ {
|
||||||
|
newx := oldx + dir[rand.Intn(2)]
|
||||||
|
newy := oldy + dir[rand.Intn(2)]
|
||||||
|
|
||||||
|
if Distance(float64(newx), float64(newy), float64(d.n/2), float64(d.n/2)) > float64(d.n/2-10) {
|
||||||
|
newx = oldx
|
||||||
|
newy = oldy
|
||||||
|
}
|
||||||
|
if newx == oldx && rand.Intn(3) > 1 {
|
||||||
|
ctex.DrawEllipse(float64(oldx)*d.ras+d.canv, float64(oldy)*d.ras+d.canv, c.opts.lineWidth, c.opts.lineWidth)
|
||||||
|
ctex.Fill()
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
ctex.DrawLine(float64(oldx)*d.ras+d.canv, float64(oldy)*d.ras+d.canv, float64(newx)*d.ras+d.canv, float64(newy)*d.ras+d.canv)
|
||||||
|
oldx = newx
|
||||||
|
oldy = newy
|
||||||
|
|
||||||
|
ctex.Stroke()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
20
example/example_dotline.go
Normal file
20
example/example_dotline.go
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/jdxyw/generativeart"
|
||||||
|
"image/color"
|
||||||
|
"math/rand"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
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")
|
||||||
|
}
|
BIN
images/dotline.png
Normal file
BIN
images/dotline.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 760 KiB |
5
utils.go
5
utils.go
|
@ -3,6 +3,7 @@ package generativeart
|
||||||
import (
|
import (
|
||||||
"image/color"
|
"image/color"
|
||||||
"math"
|
"math"
|
||||||
|
"math/rand"
|
||||||
)
|
)
|
||||||
|
|
||||||
type HSV struct {
|
type HSV struct {
|
||||||
|
@ -113,3 +114,7 @@ func ConvertPolarToPixel(r, theta, xaixs, yaixs float64, h, w int) (int, int) {
|
||||||
func Distance(x1, y1, x2, y2 float64) float64 {
|
func Distance(x1, y1, x2, y2 float64) float64 {
|
||||||
return math.Sqrt(math.Pow(x1-x2, 2.0) + math.Pow(y1-y2, 2.0))
|
return math.Sqrt(math.Pow(x1-x2, 2.0) + math.Pow(y1-y2, 2.0))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RandomRangeInt(min, max int) int {
|
||||||
|
return rand.Intn(max-min) + min
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue