generativeart/README.md

270 lines
6.3 KiB
Markdown
Raw Normal View History

2021-02-26 03:55:17 +00:00
# generativeart
2021-03-03 05:24:54 +00:00
[![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)
2021-03-04 04:06:45 +00:00
`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.
2021-03-03 05:24:54 +00:00
- Maze
- Julia Set
- Random Circle Trails
- Silk Smoke
- Spiral Square
- Square Grid
- Circle Line
2021-03-03 09:38:34 +00:00
- Circle Loop
- Silk Sky
2021-03-04 04:06:45 +00:00
- Dot Line
2021-03-04 05:59:46 +00:00
- Swirl
2021-03-03 05:24:54 +00:00
For these kinds of art, the package provides as many as parameters to control the appearance.
## Install
2021-03-04 02:46:41 +00:00
The go version I used is go 1.16.
2021-03-03 05:24:54 +00:00
```bash
go get github.com/jdxyw/generativeart
```
2021-03-03 09:38:34 +00:00
## Art Type
```go
2021-03-04 02:46:41 +00:00
NewCircleLine(step float64, lineNum int, radius, xaixs, yaixs float64)
2021-03-03 09:38:34 +00:00
NewCircleLoop(radius float64)
2021-03-04 02:46:41 +00:00
NewMaze(step int)
2021-03-03 09:38:34 +00:00
NewRandCicle(mc, msp int, minStep, maxStep, minr, maxr float64, isRandColor bool)
NewSilkSky(circleNum int, sunRadius float64)
NewSilkSmoke(mc, msp int, minStep, maxStep, minRadius, maxRadius float64, isRandColor bool)
NewSpiralSquare(squareNum int, rectSide, decay float64, randColor bool)
2021-03-04 05:59:46 +00:00
NewSwirl(a, b, c, d, xaixs, yaixs float64)
NewDotLine(n int, ras, canv float64, randColor bool)
2021-03-03 09:38:34 +00:00
```
2021-03-04 02:46:41 +00:00
## General Options
```go
type Options struct {
background color.RGBA
foreground color.RGBA
lineColor color.RGBA
lineWidth float64
colorSchema []color.RGBA
nIters int
alpha int
}
```
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 type, they have their own `struct`.
2021-03-03 05:24:54 +00:00
## Usage and example
2021-03-03 09:38:34 +00:00
### Silk Smoke
```go
func main() {
rand.Seed(time.Now().Unix())
2021-03-04 02:46:41 +00:00
c := generativeart.NewCanva(500, 500)
2021-03-03 09:38:34 +00:00
c.SetBackground(generativeart.Black)
c.SetLineWidth(1.0)
c.SetLineColor(generativeart.MediumAquamarine)
c.SetAlpha(30)
c.SetColorSchema(generativeart.Plasma)
c.SetIterations(4)
c.FillBackground()
c.Draw(generativeart.NewSilkSmoke(400, 20, 0.2, 2, 10, 30, false))
c.ToPNG("silksmoke.png")
}
```
![](images/silksmoke.png)
### Spiral Square
```go
func main() {
rand.Seed(time.Now().Unix())
2021-03-04 02:46:41 +00:00
c := generativeart.NewCanva(500, 500)
2021-03-03 09:38:34 +00:00
c.SetBackground(generativeart.MistyRose)
c.SetLineWidth(10)
c.SetLineColor(generativeart.Orange)
2021-03-04 02:46:41 +00:00
c.SetColorSchema(generativeart.Plasma)
2021-03-03 09:38:34 +00:00
c.SetForeground(generativeart.Tomato)
c.FillBackground()
c.Draw(generativeart.NewSpiralSquare(40, 400, 0.05, true))
c.ToPNG("spiralsquare.png")
}
```
![](images/spiralsquare.png)
### Circle Loop
```go
func main() {
rand.Seed(time.Now().Unix())
2021-03-04 02:46:41 +00:00
c := generativeart.NewCanva(500, 500)
2021-03-03 09:38:34 +00:00
c.SetBackground(generativeart.Black)
c.SetLineWidth(1)
c.SetLineColor(generativeart.Orange)
c.SetAlpha(30)
c.SetIterations(1000)
c.FillBackground()
c.Draw(generativeart.NewCircleLoop(100))
c.ToPNG("circleloop.png")
}
```
![](images/circleloop.png)
2021-03-04 04:06:45 +00:00
### 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)
2021-03-03 09:38:34 +00:00
### Julia Set
```go
func julia1(z complex128) complex128 {
c := complex(-0.1, 0.651)
z = z*z + c
return z
}
func main() {
rand.Seed(time.Now().Unix())
2021-03-04 02:46:41 +00:00
c := generativeart.NewCanva(500, 500)
2021-03-03 09:38:34 +00:00
c.SetIterations(800)
c.SetColorSchema(generativeart.Viridis)
c.FillBackground()
2021-03-04 02:46:41 +00:00
c.Draw(generativeart.NewJulia(julia1, 40, 1.5, 1.5))
2021-03-03 09:38:34 +00:00
c.ToPNG("julia.png")
}
```
![](images/julia.png)
2021-03-04 05:59:46 +00:00
### 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)
2021-03-03 09:38:34 +00:00
### Circle Line
```go
func main() {
rand.Seed(time.Now().Unix())
2021-03-04 02:46:41 +00:00
c := generativeart.NewCanva(600, 600)
2021-03-03 09:38:34 +00:00
c.SetBackground(generativeart.Tan)
c.SetLineWidth(1.0)
c.SetLineColor(generativeart.LightPink)
c.FillBackground()
2021-03-04 02:46:41 +00:00
c.Draw(generativeart.NewCircleLine(0.02, 600, 1.5, 2, 2))
2021-03-03 09:38:34 +00:00
c.ToPNG("circleline.png")
}
```
![](images/circleline.png)
### Silk Sky
```go
func main() {
rand.Seed(time.Now().Unix())
2021-03-04 02:46:41 +00:00
c := generativeart.NewCanva(600, 600)
2021-03-03 09:38:34 +00:00
c.SetAlpha(10)
c.Draw(generativeart.NewSilkSky(15, 5))
c.ToPNG("silksky.png")
}
```
![](images/silksky.png)
### Maze
```go
func main() {
rand.Seed(time.Now().Unix())
2021-03-04 02:46:41 +00:00
c := generativeart.NewCanva(600, 600)
2021-03-03 09:38:34 +00:00
c.SetBackground(generativeart.Azure)
c.SetLineWidth(3)
c.SetLineColor(generativeart.Orange)
c.FillBackground()
2021-03-04 02:46:41 +00:00
c.Draw(generativeart.NewMaze(20))
2021-03-03 09:38:34 +00:00
c.ToPNG("maze.png")
}
```
![](images/maze.png)
### Random Circle
```go
func main() {
rand.Seed(time.Now().Unix())
2021-03-04 02:46:41 +00:00
c := generativeart.NewCanva(500, 500)
2021-03-03 09:38:34 +00:00
c.SetBackground(generativeart.MistyRose)
c.SetLineWidth(1.0)
c.SetLineColor(color.RGBA{
R: 122,
G: 122,
B: 122,
A: 30,
})
c.SetColorSchema(generativeart.Plasma)
c.SetIterations(4)
c.FillBackground()
c.Draw(generativeart.NewRandCicle(30, 80, 0.2, 2, 10, 30, true))
c.ToPNG("randcircle.png")
}
```
![](images/randcircle.png)
2021-03-03 05:24:54 +00:00
## TODO
- Add more kinds of generative arts or types.
## Contribution
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
2021-03-03 05:49:00 +00:00
- https://github.com/cdr6934/Generative-Processing-Experiments
- https://github.com/pkd2512/inktober2017
2021-03-03 05:24:54 +00:00
- http://blog.dragonlab.de/2015/03/generative-art-week-1
2021-03-04 04:06:45 +00:00
- https://editor.p5js.org/kenekk1/sketches/Ly-5XYvKX
2021-03-04 05:59:46 +00:00
- http://paulbourke.net/fractals/peterdejong/