support multiple images generation with time lapse for domainwrap
This commit is contained in:
parent
b3ee1f8c84
commit
590d870f56
3 changed files with 69 additions and 2 deletions
|
@ -1,9 +1,11 @@
|
||||||
package arts
|
package arts
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"github.com/jdxyw/generativeart"
|
"github.com/jdxyw/generativeart"
|
||||||
"github.com/jdxyw/generativeart/common"
|
"github.com/jdxyw/generativeart/common"
|
||||||
"image/color"
|
"image/color"
|
||||||
|
"log"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ColorMapping maps some parameters to color space.
|
// ColorMapping maps some parameters to color space.
|
||||||
|
@ -15,6 +17,12 @@ type domainWrap struct {
|
||||||
scale2 float64
|
scale2 float64
|
||||||
xOffset, yOffset float64
|
xOffset, yOffset float64
|
||||||
fn ColorMapping
|
fn ColorMapping
|
||||||
|
// How many images would be created in this generation.
|
||||||
|
numImages int
|
||||||
|
// Use these parameters to create images with time lapse.
|
||||||
|
xOffsetStep, yOffsetStep float64
|
||||||
|
// The imagPath for generative images.
|
||||||
|
imgPath string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewDomainWrap returns a domainWrap object.
|
// NewDomainWrap returns a domainWrap object.
|
||||||
|
@ -29,9 +37,34 @@ func NewDomainWrap(scale, scale2, xOffset, yOffset float64, cmap ColorMapping) *
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *domainWrap) SetDynamicParameter(xstep, ystep float64, n int, path string) {
|
||||||
|
d.xOffsetStep = xstep
|
||||||
|
d.yOffsetStep = ystep
|
||||||
|
d.numImages = n
|
||||||
|
d.imgPath = path
|
||||||
|
}
|
||||||
|
|
||||||
// Generative draws a domain warp image.
|
// Generative draws a domain warp image.
|
||||||
// Reference: https://www.iquilezles.org/www/articles/warp/warp.htm
|
// Reference: https://www.iquilezles.org/www/articles/warp/warp.htm
|
||||||
func (d *domainWrap) Generative(c *generativeart.Canva) {
|
func (d *domainWrap) Generative(c *generativeart.Canva) {
|
||||||
|
if d.numImages == 0 && len(d.imgPath) == 0 {
|
||||||
|
d.generative(c)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if d.numImages > 0 && len(d.imgPath) == 0 {
|
||||||
|
log.Fatal("Missing the parameters numImages or imgPath")
|
||||||
|
}
|
||||||
|
for i := 0; i < d.numImages; i++ {
|
||||||
|
imgfile := fmt.Sprintf("%v/domainwrap%03d.PNG", d.imgPath, i)
|
||||||
|
d.xOffset += d.xOffsetStep * float64(i)
|
||||||
|
d.yOffset += d.yOffsetStep * float64(i)
|
||||||
|
d.generative(c)
|
||||||
|
c.ToPNG(imgfile)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *domainWrap) generative(c *generativeart.Canva) {
|
||||||
for h := 0.0; h < float64(c.Height()); h += 1.0 {
|
for h := 0.0; h < float64(c.Height()); h += 1.0 {
|
||||||
for w := 0.0; w < float64(c.Width()); w += 1.0 {
|
for w := 0.0; w < float64(c.Width()); w += 1.0 {
|
||||||
r, m1, m2 := d.pattern(w*d.scale, h*d.scale, d.xOffset, d.yOffset)
|
r, m1, m2 := d.pattern(w*d.scale, h*d.scale, d.xOffset, d.yOffset)
|
||||||
|
|
30
example/example_domainwrap2.go
Normal file
30
example/example_domainwrap2.go
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/jdxyw/generativeart"
|
||||||
|
"github.com/jdxyw/generativeart/arts"
|
||||||
|
"github.com/jdxyw/generativeart/common"
|
||||||
|
"image/color"
|
||||||
|
"math/rand"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func cmap(r, m1, m2 float64) color.RGBA {
|
||||||
|
rgb := color.RGBA{
|
||||||
|
R: uint8(common.Constrain(m1*200*r, 0, 255)),
|
||||||
|
G: uint8(common.Constrain(r*200, 0, 255)),
|
||||||
|
B: uint8(common.Constrain(m2*255*r, 70, 255)),
|
||||||
|
A: 255,
|
||||||
|
}
|
||||||
|
return rgb
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
rand.Seed(time.Now().Unix())
|
||||||
|
c := generativeart.NewCanva(500, 500)
|
||||||
|
c.SetBackground(common.Black)
|
||||||
|
c.FillBackground()
|
||||||
|
d := arts.NewDomainWrap(0.01, 4, 4, 20, cmap)
|
||||||
|
d.SetDynamicParameter(0.005, 0, 100, "./temp")
|
||||||
|
c.Draw(d)
|
||||||
|
}
|
|
@ -131,6 +131,10 @@ func (c *Canva) Draw(e Engine) {
|
||||||
e.Generative(c)
|
e.Generative(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Canva) DrawTimelapse(e Engine) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// FillBackground fills the background of the Canva.
|
// FillBackground fills the background of the Canva.
|
||||||
func (c *Canva) FillBackground() {
|
func (c *Canva) FillBackground() {
|
||||||
draw.Draw(c.Img(), c.Img().Bounds(), &image.Uniform{c.Opts().Background()}, image.ZP, draw.Src)
|
draw.Draw(c.Img(), c.Img().Bounds(), &image.Uniform{c.Opts().Background()}, image.ZP, draw.Src)
|
||||||
|
@ -142,12 +146,12 @@ func (c *Canva) ToPNG(fpath string) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := png.Encode(f, c.Img()); err != nil {
|
if err = png.Encode(f, c.Img()); err != nil {
|
||||||
f.Close()
|
f.Close()
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := f.Close(); err != nil {
|
if err = f.Close(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue