Skip to content

Commit 5dcbf39

Browse files
committed
bezier example
1 parent 27f731a commit 5dcbf39

File tree

6 files changed

+285
-3
lines changed

6 files changed

+285
-3
lines changed

examples/bezier/main.go

Lines changed: 217 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,217 @@
1+
package main
2+
3+
import (
4+
"flag"
5+
"github.com/aldernero/gaul"
6+
"github.com/tdewolff/canvas"
7+
"log"
8+
"math"
9+
"os"
10+
"runtime/pprof"
11+
12+
"github.com/aldernero/sketchy"
13+
"github.com/hajimehoshi/ebiten/v2"
14+
)
15+
16+
var triangles []gaul.Triangle
17+
var curves1 []gaul.Curve
18+
var curves2 []gaul.Curve
19+
var curves3 []gaul.Curve
20+
var presses int
21+
var rng gaul.LFSRLarge
22+
23+
func genCurves(num int, triangle gaul.Triangle) ([]gaul.Curve, []gaul.Curve, []gaul.Curve) {
24+
AB := gaul.Line{P: triangle.A, Q: triangle.B}
25+
BC := gaul.Line{P: triangle.B, Q: triangle.C}
26+
CA := gaul.Line{P: triangle.C, Q: triangle.A}
27+
c1 := make([]gaul.Curve, num)
28+
c2 := make([]gaul.Curve, num)
29+
c3 := make([]gaul.Curve, num)
30+
for i := 0; i < num; i++ {
31+
p := rng.Float64()
32+
q := rng.Float64()
33+
side1 := rng.Uint64n(3)
34+
side2 := rng.Float64()
35+
switch side1 {
36+
case 0: // AB
37+
if side2 < 0.5 { // BC
38+
P := AB.Lerp(p)
39+
Q := BC.Lerp(q)
40+
c1[i] = gaul.QuadBezier(P, Q, triangle.B)
41+
c2[i] = gaul.CubicBezier(P, Q, triangle.A, triangle.C)
42+
c3[i] = gaul.QuarticBezier(P, Q, triangle.B, triangle.A, triangle.C)
43+
} else { // CA
44+
P := AB.Lerp(p)
45+
Q := CA.Lerp(q)
46+
c1[i] = gaul.QuadBezier(P, Q, triangle.A)
47+
c2[i] = gaul.CubicBezier(P, Q, triangle.B, triangle.C)
48+
c3[i] = gaul.QuarticBezier(P, Q, triangle.A, triangle.B, triangle.C)
49+
}
50+
case 1: // BC
51+
if side2 < 0.5 { // CA
52+
P := BC.Lerp(p)
53+
Q := CA.Lerp(q)
54+
c1[i] = gaul.QuadBezier(P, Q, triangle.C)
55+
c2[i] = gaul.CubicBezier(P, Q, triangle.B, triangle.A)
56+
c3[i] = gaul.QuarticBezier(P, Q, triangle.C, triangle.B, triangle.A)
57+
} else { // AB
58+
P := BC.Lerp(p)
59+
Q := AB.Lerp(q)
60+
c1[i] = gaul.QuadBezier(P, Q, triangle.B)
61+
c2[i] = gaul.CubicBezier(P, Q, triangle.C, triangle.A)
62+
c3[i] = gaul.QuarticBezier(P, Q, triangle.B, triangle.C, triangle.A)
63+
}
64+
case 2: // CA
65+
if side2 < 0.5 { // AB
66+
P := CA.Lerp(p)
67+
Q := AB.Lerp(q)
68+
c1[i] = gaul.QuadBezier(P, Q, triangle.A)
69+
c2[i] = gaul.CubicBezier(P, Q, triangle.C, triangle.B)
70+
c3[i] = gaul.QuarticBezier(P, Q, triangle.A, triangle.C, triangle.B)
71+
} else { // BC
72+
P := CA.Lerp(p)
73+
Q := BC.Lerp(q)
74+
c1[i] = gaul.QuadBezier(P, Q, triangle.C)
75+
c2[i] = gaul.CubicBezier(P, Q, triangle.A, triangle.B)
76+
c3[i] = gaul.QuarticBezier(P, Q, triangle.C, triangle.A, triangle.B)
77+
78+
}
79+
}
80+
}
81+
return c1, c2, c3
82+
}
83+
84+
func setup(s *sketchy.Sketch) {
85+
// Setup logic goes here
86+
num := int(s.Slider("num"))
87+
radius := s.Slider("radius")
88+
W := s.Width()
89+
H := s.Height()
90+
xoffset := s.Slider("xoffset") * W
91+
yoffset := s.Slider("yoffset") * H
92+
R := radius * W
93+
rng = gaul.NewLFSRLargeWithSeed(uint64(s.RandomSeed))
94+
curves1 = []gaul.Curve{}
95+
curves2 = []gaul.Curve{}
96+
curves3 = []gaul.Curve{}
97+
angle1 := gaul.Pi / 2
98+
angle2 := -gaul.Pi / 2
99+
triangle2 := gaul.Triangle{
100+
A: gaul.Point{
101+
X: W/2 + R*math.Cos(angle2-gaul.Tau/3),
102+
Y: yoffset + R*math.Sin(angle2-gaul.Tau/3),
103+
},
104+
B: gaul.Point{
105+
X: W/2 + R*math.Cos(angle2),
106+
Y: yoffset + R*math.Sin(angle2),
107+
},
108+
C: gaul.Point{
109+
X: W/2 + R*math.Cos(angle2+gaul.Tau/3),
110+
Y: yoffset + R*math.Sin(angle2+gaul.Tau/3),
111+
},
112+
}
113+
triangle1 := gaul.Triangle{
114+
A: gaul.Point{
115+
X: W/2 - xoffset + R*math.Cos(angle1-gaul.Tau/3),
116+
Y: yoffset + R*math.Sin(angle1-gaul.Tau/3),
117+
},
118+
B: gaul.Point{
119+
X: W/2 - xoffset + R*math.Cos(angle1),
120+
Y: yoffset + R*math.Sin(angle1),
121+
},
122+
C: gaul.Point{
123+
X: W/2 - xoffset + R*math.Cos(angle1+gaul.Tau/3),
124+
Y: yoffset + R*math.Sin(angle1+gaul.Tau/3),
125+
},
126+
}
127+
triangle3 := gaul.Triangle{
128+
A: gaul.Point{
129+
X: W/2 + xoffset + R*math.Cos(angle1-gaul.Tau/3),
130+
Y: yoffset + R*math.Sin(angle1-gaul.Tau/3),
131+
},
132+
B: gaul.Point{
133+
X: W/2 + xoffset + R*math.Cos(angle1),
134+
Y: yoffset + R*math.Sin(angle1),
135+
},
136+
C: gaul.Point{
137+
X: W/2 + xoffset + R*math.Cos(angle1+gaul.Tau/3),
138+
Y: yoffset + R*math.Sin(angle1+gaul.Tau/3),
139+
},
140+
}
141+
triangles = []gaul.Triangle{triangle1, triangle2, triangle3}
142+
curves1, _, _ = genCurves(num, triangle1)
143+
_, curves2, _ = genCurves(num, triangle2)
144+
_, _, curves3 = genCurves(num, triangle3)
145+
}
146+
147+
func update(s *sketchy.Sketch) {
148+
// Update logic goes here
149+
if s.Toggle("next") {
150+
presses++
151+
return
152+
}
153+
if s.DidControlsChange {
154+
setup(s)
155+
}
156+
}
157+
158+
func draw(s *sketchy.Sketch, c *canvas.Context) {
159+
// Drawing code goes here
160+
c.SetFillColor(canvas.Transparent)
161+
c.SetStrokeColor(canvas.White)
162+
c.SetStrokeWidth(0.25)
163+
if s.Toggle("show triangles") {
164+
for _, triangle := range triangles {
165+
triangle.Draw(c)
166+
}
167+
}
168+
for _, curve := range curves1 {
169+
curve.Draw(c)
170+
}
171+
172+
for _, curve := range curves2 {
173+
curve.Draw(c)
174+
}
175+
for _, curve := range curves3 {
176+
curve.Draw(c)
177+
}
178+
}
179+
180+
func main() {
181+
var configFile string
182+
var prefix string
183+
var randomSeed int64
184+
var cpuprofile = flag.String("pprof", "", "Collect CPU profile")
185+
flag.StringVar(&configFile, "c", "sketch.json", "Sketch config file")
186+
flag.StringVar(&prefix, "p", "", "Output file prefix")
187+
flag.Int64Var(&randomSeed, "s", 0, "Random number generator seed")
188+
flag.Parse()
189+
if *cpuprofile != "" {
190+
f, err := os.Create(*cpuprofile)
191+
if err != nil {
192+
log.Fatal(err)
193+
}
194+
pprof.StartCPUProfile(f)
195+
defer pprof.StopCPUProfile()
196+
}
197+
s, err := sketchy.NewSketchFromFile(configFile)
198+
if err != nil {
199+
log.Fatal(err)
200+
}
201+
if prefix != "" {
202+
s.Prefix = prefix
203+
}
204+
s.RandomSeed = randomSeed
205+
s.Updater = update
206+
s.Drawer = draw
207+
s.Init()
208+
setup(s)
209+
ebiten.SetWindowSize(int(s.ControlWidth+s.SketchWidth), int(s.SketchHeight))
210+
ebiten.SetWindowTitle("Sketchy - " + s.Title)
211+
ebiten.SetWindowResizingMode(ebiten.WindowResizingModeDisabled)
212+
ebiten.SetVsyncEnabled(true)
213+
ebiten.SetTPS(ebiten.SyncWithFPS)
214+
if err := ebiten.RunGame(s); err != nil {
215+
log.Fatal(err)
216+
}
217+
}

examples/bezier/sketch.json

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
{
2+
"SketchWidth": 1920,
3+
"SketchHeight": 1080,
4+
"ControlWidth": 240,
5+
"Sliders": [
6+
{
7+
"Name": "num",
8+
"MinVal": 1,
9+
"MaxVal": 400,
10+
"Val": 200,
11+
"Incr": 1
12+
},
13+
{
14+
"Name": "radius",
15+
"MinVal": 0,
16+
"MaxVal": 1,
17+
"Val": 0.16,
18+
"Incr": 0.01
19+
},
20+
{
21+
"Name": "xoffset",
22+
"MinVal": 0,
23+
"MaxVal": 1,
24+
"Val": 0.30,
25+
"Incr": 0.01
26+
},
27+
{
28+
"Name": "yoffset",
29+
"MinVal": 0,
30+
"MaxVal": 1,
31+
"Val": 0.45,
32+
"Incr": 0.01
33+
}
34+
],
35+
"Toggles": [
36+
{
37+
"Name": "show triangles",
38+
"Checked": false
39+
},
40+
{
41+
"Name": "symmetric",
42+
"Checked": false
43+
},
44+
{
45+
"Name": "next",
46+
"IsButton": true
47+
}
48+
],
49+
"SketchBackgroundColor": "#1e1e1e",
50+
"SketchOutlineColor": "",
51+
"ControlBackgroundColor": "#1e1e1e",
52+
"ControlOutlineColor": "#ffdb00"
53+
}

examples/bezier/sketch_20231001_114749.svg

Lines changed: 1 addition & 0 deletions
Loading
705 KB
Loading

go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ module github.com/aldernero/sketchy
33
go 1.18
44

55
require (
6-
github.com/aldernero/gaul v0.0.0-20230925011242-c003952de61d
6+
github.com/aldernero/gaul v0.0.0-20231001154347-6874db693ae8
77
github.com/hajimehoshi/ebiten/v2 v2.6.0
88
github.com/lucasb-eyer/go-colorful v1.2.0
9-
github.com/tdewolff/canvas v0.0.0-20230925184154-c651fde88374
9+
github.com/tdewolff/canvas v0.0.0-20230929121632-db7265801182
1010
)
1111

1212
require (
1313
github.com/ByteArena/poly2tri-go v0.0.0-20170716161910-d102ad91854f // indirect
14-
github.com/adrg/strutil v0.3.0 // indirect
14+
github.com/adrg/strutil v0.3.1 // indirect
1515
github.com/adrg/sysfont v0.1.2 // indirect
1616
github.com/adrg/xdg v0.4.0 // indirect
1717
github.com/aldernero/go-noise v0.0.0-20230828020352-dac1e55fbf1a // indirect

go.sum

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ github.com/ByteArena/poly2tri-go v0.0.0-20170716161910-d102ad91854f/go.mod h1:vI
55
github.com/adrg/strutil v0.2.2/go.mod h1:EF2fjOFlGTepljfI+FzgTG13oXthR7ZAil9/aginnNQ=
66
github.com/adrg/strutil v0.3.0 h1:bi/HB2zQbDihC8lxvATDTDzkT4bG7PATtVnDYp5rvq4=
77
github.com/adrg/strutil v0.3.0/go.mod h1:Jz0wzBVE6Uiy9wxo62YEqEY1Nwto3QlLl1Il5gkLKWU=
8+
github.com/adrg/strutil v0.3.1/go.mod h1:8h90y18QLrs11IBffcGX3NW/GFBXCMcNg4M7H6MspPA=
89
github.com/adrg/sysfont v0.1.2 h1:MSU3KREM4RhsQ+7QgH7wPEPTgAgBIz0Hw6Nd4u7QgjE=
910
github.com/adrg/sysfont v0.1.2/go.mod h1:6d3l7/BSjX9VaeXWJt9fcrftFaD/t7l11xgSywCPZGk=
1011
github.com/adrg/xdg v0.3.0/go.mod h1:7I2hH/IT30IsupOpKZ5ue7/qNi3CoKzD6tL3HwpaRMQ=
@@ -29,6 +30,8 @@ github.com/aldernero/gaul v0.0.0-20230917162250-62cb9a46fb21 h1:MgboW91YUSfcq8ik
2930
github.com/aldernero/gaul v0.0.0-20230917162250-62cb9a46fb21/go.mod h1:a9NEuN2XmNHxKWKhLcTwEVVABTQoCJegtzWNKu3XM0A=
3031
github.com/aldernero/gaul v0.0.0-20230925011242-c003952de61d h1:AQ/wb/Cs9bcJAVou9vS3Xxx4XFPTRyUg6+sv0JBunfA=
3132
github.com/aldernero/gaul v0.0.0-20230925011242-c003952de61d/go.mod h1:a9NEuN2XmNHxKWKhLcTwEVVABTQoCJegtzWNKu3XM0A=
33+
github.com/aldernero/gaul v0.0.0-20231001154347-6874db693ae8 h1:HrZkRErixksPBUJazIvKI2DpynppjmU4cvtplPDdkDw=
34+
github.com/aldernero/gaul v0.0.0-20231001154347-6874db693ae8/go.mod h1:Hjb1KGyRtSTQVMdHW3u5PPZTd7U6nUf6mUt/pYiElY4=
3235
github.com/aldernero/go-noise v0.0.0-20230827202328-a17ef70bb870 h1:bTw9NERQvz2vMzTXgS7NFRE/iQvDOHtgsR2mQfYAWZU=
3336
github.com/aldernero/go-noise v0.0.0-20230827202328-a17ef70bb870/go.mod h1:aVxtL8PCtDYC/xqnKnt+19s92kDkkE52jJBFjr6XKBo=
3437
github.com/aldernero/go-noise v0.0.0-20230827204149-0806943c2f79 h1:pyN/RAfHwqYRPRWhBmdCQc9aI/gjQv2QH4EObu6v37w=
@@ -44,6 +47,7 @@ github.com/benoitkugler/textprocessing v0.0.3/go.mod h1:/4bLyCf1QYywunMK3Gf89Nhb
4447
github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U=
4548
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4649
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
50+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
4751
github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE=
4852
github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q=
4953
github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo=
@@ -99,10 +103,14 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
99103
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
100104
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
101105
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
106+
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
107+
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
102108
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
103109
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
104110
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
111+
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
105112
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
113+
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
106114
github.com/tdewolff/canvas v0.0.0-20230520194752-d2aa2646d6a4 h1:jszaJ3OntfmvkPcBeV3sg3+kGcNQ7cjxXfoaSlD1nJ8=
107115
github.com/tdewolff/canvas v0.0.0-20230520194752-d2aa2646d6a4/go.mod h1:8Q1WI1rGdKIRWCoHnYZS6Ce0SszgX4SuFGfW3JIZ1jU=
108116
github.com/tdewolff/canvas v0.0.0-20230725155945-641901f69684 h1:zvYsrmuaCpJa5Uw2zL2yEA28wfehNbe8Vvfl3/ttf5o=
@@ -113,6 +121,8 @@ github.com/tdewolff/canvas v0.0.0-20230917124520-e6ea538e3e50 h1:pyaVhhmgOQ2tlPO
113121
github.com/tdewolff/canvas v0.0.0-20230917124520-e6ea538e3e50/go.mod h1:KaZWLWHSMsHqU90hoZ5rz6ZFmZg5Y2cVw87PCEEndCQ=
114122
github.com/tdewolff/canvas v0.0.0-20230925184154-c651fde88374 h1:wO57Uyh9QGi0EhexYSHHJ52aASvdHTvWY0uKPBNFuYQ=
115123
github.com/tdewolff/canvas v0.0.0-20230925184154-c651fde88374/go.mod h1:KaZWLWHSMsHqU90hoZ5rz6ZFmZg5Y2cVw87PCEEndCQ=
124+
github.com/tdewolff/canvas v0.0.0-20230929121632-db7265801182 h1:kyOOA2gwSFEibNJgpfSj3x8ul3+L5aY/lygx8thRjlk=
125+
github.com/tdewolff/canvas v0.0.0-20230929121632-db7265801182/go.mod h1:KaZWLWHSMsHqU90hoZ5rz6ZFmZg5Y2cVw87PCEEndCQ=
116126
github.com/tdewolff/minify/v2 v2.12.6 h1:kw5FU0ErJyd7fs+TMojIlBvLyEjsN93wP1n8NUOs320=
117127
github.com/tdewolff/minify/v2 v2.12.6/go.mod h1:ZRKTheiOGyLSK8hOZWWv+YoJAECzDivNgAlVYDHp/Ws=
118128
github.com/tdewolff/minify/v2 v2.12.7 h1:pBzz2tAfz5VghOXiQIsSta6srhmTeinQPjRDHWoumCA=
@@ -228,6 +238,7 @@ gonum.org/v1/plot v0.14.0/go.mod h1:MLdR9424SJed+5VqC6MsouEpig9pZX2VZ57H9ko2bXU=
228238
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
229239
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
230240
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
241+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
231242
rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4=
232243
star-tex.org/x/tex v0.4.0 h1:AXUwgpnHLCxZUWW3qrmjv6ezNhH3PjUVBuLLejz2cgU=
233244
star-tex.org/x/tex v0.4.0/go.mod h1:w91ycsU/DkkCr7GWr60GPWqp3gn2U+6VX71T0o8k8qE=

0 commit comments

Comments
 (0)