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