From 40b847344481803e94e78ba2dacde8dc78636948 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Fri, 14 Feb 2025 16:51:07 +0100 Subject: graphics: make curve more smooth --- src/estd/graphics/curve.zig | 4 ++-- src/screen/main.zig | 32 +++++++++++++++++++++----------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/estd/graphics/curve.zig b/src/estd/graphics/curve.zig index 70569a3..6c591fa 100644 --- a/src/estd/graphics/curve.zig +++ b/src/estd/graphics/curve.zig @@ -29,7 +29,7 @@ pub const Curve = struct { const middle_y: f64 = @floatFromInt(self.middle.y); const end_x: f64 = @floatFromInt(self.end.x); const end_y: f64 = @floatFromInt(self.end.y); - const resolution = 2 + ( + const resolution = 1 + ( distance(self.start.x, self.end.x) + distance(self.start.y, self.end.y) ) / 8; @@ -37,7 +37,7 @@ pub const Curve = struct { canvas.buffer[last.x + last.y * canvas.width] = .{ .red = 0xff, .green = 0xff, .blue = 0xff }; - for (1..resolution) |index| { + for (1..resolution + 1) |index| { const t: f64 = @as(f64, @floatFromInt(index)) / @as(f64, @floatFromInt(resolution)); const x: u32 = @intFromFloat(@round( (1 - t) * ((1 - t) * start_x + t * middle_x) + t * ((1 - t) * middle_x + t * end_x) diff --git a/src/screen/main.zig b/src/screen/main.zig index 0ee7e17..2387f57 100644 --- a/src/screen/main.zig +++ b/src/screen/main.zig @@ -33,30 +33,40 @@ pub fn main() !void { var curve = graphics.Curve { .start = .{ .x = center_x, .y = center_y }, - .middle = .{ .x = center_x, .y = center_y + 150 }, - .end = .{ .x = center_x + 110 , .y = center_y + 100 }, + .middle = .{ .x = center_x + 200, .y = center_y - 150 }, + .end = .{ .x = center_x + 100 , .y = center_y + 100 }, .color = .{ .red = 0xff, .green = 0, .blue = 0 }, }; var last_duration: f64 = 0; var delta: f64 = 0; + var angle: f64 = 0; while (true) { const start = try std.time.Instant.now(); const canvas = buffer.canvas(); - canvas.fill(.{ .red = 0x5, .green = 0x5, .blue = 0x5 }); + canvas.fill(.{ .red = 0x25, .green = 0x25, .blue = 0x25 }); - //(graphics.Box { - // .x = center_x - 100, - // .y = center_y - 100, - // .width = 200, - // .height = 200, - // .radius = 100, - // .color = .{ .red = 0xff, .green = 0xff, .blue = 0xff }, - //}).render(&canvas); + (graphics.Box { + .x = center_x - 100, + .y = center_y - 100, + .width = 200, + .height = 200, + .radius = 100, + .color = .{ .red = 0xff, .green = 0xff, .blue = 0xff }, + }).render(&canvas); curve.render(&canvas); + const cos = @cos(std.math.degreesToRadians(angle)); + const sin = @sin(std.math.degreesToRadians(angle)); + curve.end.x = @intCast(@as(i64, @intCast(center_x)) + @as(i64, @intFromFloat(100 * cos))); + curve.end.y = @intCast(@as(i64, @intCast(center_y)) + @as(i64, @intFromFloat(100 * sin))); + + angle += delta; + if (angle > 360) { + angle = 0; + } const end = try std.time.Instant.now(); const duration: f64 = @floatFromInt(end.since(start)); -- cgit v1.2.3-70-g09d2