zigが流行ってると聞いて。人類に手動メモリ管理はまだ早いんだよな。もっと脳が進化してくれないと難しい。足りない脳でやってくしかないのだ現代人たる我(々?)は。
SDLのビルドでつまづいたりした。自分でbuild.zigいじるのいやだったので、パッケージマネージャーであるところのgyroを使ってみたけどうまく動かなかった。直接git cloneして/libs
にでも突っ込んどけばなんとかなるっぽい。SDL2-develもルートに置いとけば勝手に見てくれるっぽい。SDL.zigがビルド用のSdkを用意してくれてるのでそれ任せ。
const std = @import("std"); const SDL = @import("sdl2"); const math = std.math; const complex = math.complex; pub fn main() !void { try SDL.init(.{ .video = true, .events = true, .audio = true, }); defer SDL.quit(); const height = 800; const width = 800; var window = try SDL.createWindow( "SDL.zig", .{ .centered = {} }, .{ .centered = {} }, width, height, .{ .vis = .shown }, ); defer window.destroy(); var renderer = try SDL.createRenderer(window, null, .{ .accelerated = true }); defer renderer.destroy(); var texture = try SDL.createTexture(renderer, .rgba8888, .streaming, width, height); defer texture.destroy(); var buf = std.mem.zeroes([width * height * 4]u8); var y: f32 = -2; var x: f32 = -2; var i: usize = 0; while (i < width * height * 4) : (i += 4) { const m = mandelbrot(x, y, 255); const c = @intCast(u8, m); const b = @floatToInt(u8, @fabs(@floor(x * @intToFloat(f32, m))) / 255); buf[i + 0] = c; buf[i + 1] = b; buf[i + 2] = c; buf[i + 3] = c; x += 0.005; if ((i / 4) % width == 0) { x = -2; y += 0.005; } } try texture.update(&buf, 4 * width, null); mainLoop: while (true) { while (SDL.pollEvent()) |ev| { switch (ev) { .quit => { break :mainLoop; }, .key_down => |key| { switch (key.scancode) { .q => break :mainLoop, else => {}, } }, else => {}, } } try renderer.setColorRGB(0, 0, 0); try renderer.clear(); try renderer.copy(texture, null, null); renderer.present(); } } fn mandelbrot(x: f32, y: f32, limit: u32) u32 { const c = math.Complex(f32).init(x, y); var z = math.Complex(f32).init(0.0, 0.0); var n: u32 = 0; while (n < limit) : (n += 1) { z = z.mul(z).add(c); if (complex.abs(z) > 2) { return n; } } return 0; }