Skip to content

Commit f01a475

Browse files
committed
feat: Voronoi diagram example
1 parent 42f9e03 commit f01a475

File tree

1 file changed

+113
-0
lines changed

1 file changed

+113
-0
lines changed

examples/voronoi-diagram.buzz

+113
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import "std";
2+
import "examples/sdl-wrapped" as _;
3+
import "math";
4+
5+
fun hypot(int x, int y) > int {
6+
return std.toInt(math.sqrt(std.toFloat(x * x + y * y)));
7+
}
8+
9+
fun generateVoronoi(Renderer renderer, int width, int height, int numCells) > void !> SDLError {
10+
[int] nx = [];
11+
[int] ny = [];
12+
[int] nr = [];
13+
[int] ng = [];
14+
[int] nb = [];
15+
16+
foreach (int _ in 0..numCells) {
17+
nx.append(std.random(min: 0, max: width));
18+
ny.append(std.random(min: 0, max: height));
19+
nr.append(std.random(min: 0, max: 255));
20+
ng.append(std.random(min: 0, max: 255));
21+
nb.append(std.random(min: 0, max: 255));
22+
}
23+
24+
renderer.setRenderDrawColor(
25+
Color{
26+
red = 255,
27+
green = 255,
28+
blue = 255,
29+
}
30+
);
31+
32+
foreach (int y in 0..width) {
33+
foreach (int x in 0..height) {
34+
int dmin = hypot(x: width - 1, y: height - 1);
35+
int j = -1;
36+
foreach (int i in 0..numCells) {
37+
int d = hypot(x: nx[i] - x, y: ny[i] - y);
38+
if (d < dmin) {
39+
dmin = d;
40+
j = i;
41+
}
42+
}
43+
44+
renderer.setRenderDrawColor(
45+
Color{
46+
red = nr[j],
47+
green = ng[j],
48+
blue = nb[j],
49+
}
50+
);
51+
52+
renderer.drawPoint(x, y);
53+
}
54+
}
55+
56+
renderer.setRenderDrawColor(
57+
Color{
58+
red = 255,
59+
green = 255,
60+
blue = 255,
61+
}
62+
);
63+
64+
foreach (int b in 0..numCells) {
65+
renderer.drawPoint(x: nx[b], y: ny[b]);
66+
}
67+
}
68+
69+
fun main([str] _) > void !> SDLError {
70+
const width = 400;
71+
const height = 400;
72+
const numCells = 50;
73+
74+
var sdl = SDL.init([Subsystem.Video]);
75+
76+
var window = Window.init(
77+
"buzz example: Voronoi Diagram",
78+
width,
79+
height,
80+
flags: [WindowFlag.OpenGL, WindowFlag.AllowHighDPI],
81+
);
82+
83+
var renderer = window.createRenderer(
84+
index: -1,
85+
flags: [RendererFlag.Accelerated, RendererFlag.TargetTexture],
86+
);
87+
88+
var texture = renderer.createTexture(
89+
format: PixelFormat.RGBA8888,
90+
access: TextureAccess.Target,
91+
width,
92+
height,
93+
);
94+
95+
renderer.setRenderTarget(texture);
96+
generateVoronoi(renderer, width, height, numCells);
97+
renderer.setRenderTarget(null);
98+
99+
while (true) {
100+
if (sdl.pollEvent() -> event) {
101+
if (event.@"type" == EventType.Quit.value) {
102+
break;
103+
}
104+
}
105+
106+
renderer.renderCopy(texture);
107+
renderer.renderPresent();
108+
109+
sdl.delay(100.0);
110+
}
111+
112+
sdl.quit();
113+
}

0 commit comments

Comments
 (0)