commit 2109bb5bf83c79c9c0de774e0fd3c777f8f3e54d Author: Marto Date: Wed Feb 12 20:55:26 2025 +0100 initial commit diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..c22fcb0 --- /dev/null +++ b/build.zig @@ -0,0 +1,47 @@ +const std = @import("std"); +const rlz = @import("raylib-zig"); + +pub fn build(b: *std.Build) !void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + const raylib_dep = b.dependency("raylib-zig", .{ + .target = target, + .optimize = optimize, + }); + + const raylib = raylib_dep.module("raylib"); + const raylib_artifact = raylib_dep.artifact("raylib"); + + //web exports are completely separate + if (target.query.os_tag == .emscripten) { + const exe_lib = try rlz.emcc.compileForEmscripten(b, "integral-display-calculation", "src/main.zig", target, optimize); + + exe_lib.linkLibrary(raylib_artifact); + exe_lib.root_module.addImport("raylib", raylib); + + // Note that raylib itself is not actually added to the exe_lib output file, so it also needs to be linked with emscripten. + const link_step = try rlz.emcc.linkWithEmscripten(b, &[_]*std.Build.Step.Compile{ exe_lib, raylib_artifact }); + //this lets your program access files like "resources/my-image.png": + link_step.addArg("--embed-file"); + link_step.addArg("resources/"); + + b.getInstallStep().dependOn(&link_step.step); + const run_step = try rlz.emcc.emscriptenRunStep(b); + run_step.step.dependOn(&link_step.step); + const run_option = b.step("run", "Run integral-display-calculation"); + run_option.dependOn(&run_step.step); + return; + } + + const exe = b.addExecutable(.{ .name = "integral-display-calculation", .root_source_file = b.path("src/main.zig"), .optimize = optimize, .target = target }); + + exe.linkLibrary(raylib_artifact); + exe.root_module.addImport("raylib", raylib); + + const run_cmd = b.addRunArtifact(exe); + const run_step = b.step("run", "Run integral-display-calculation"); + run_step.dependOn(&run_cmd.step); + + b.installArtifact(exe); +} diff --git a/build.zig.zon b/build.zig.zon new file mode 100644 index 0000000..de8f467 --- /dev/null +++ b/build.zig.zon @@ -0,0 +1,11 @@ +.{ + .name = "integral-display-calculation", + .version = "0.0.1", + .dependencies = .{ + .@"raylib-zig" = .{ + .url = "git+https://github.com/Not-Nik/raylib-zig?ref=devel#5004bb2316fc34a416644f3910c8c79dd08d7c63", + .hash = "1220223e9881fc9510eeb30fc2ee73fb49ee645bf1859cc46a92b649d35ecfd3351a", + }, + }, + .paths = .{""}, +} diff --git a/src/main.zig b/src/main.zig new file mode 100644 index 0000000..4d49e31 --- /dev/null +++ b/src/main.zig @@ -0,0 +1,69 @@ +const rl = @import("raylib"); +const std = @import("std"); +const math = @import("math.zig"); + +const SCREENWIDTH = 1920; +const SCREENHEIGHT = 1080; + +pub fn main() !void { + rl.setConfigFlags(.{ .msaa_4x_hint = true }); + rl.initWindow(SCREENWIDTH, SCREENHEIGHT, "Koordinatni sistem"); + defer rl.closeWindow(); + + rl.setTargetFPS(60); + + while (!rl.windowShouldClose()) { + rl.beginDrawing(); + defer rl.endDrawing(); + + rl.clearBackground(rl.Color.white); + drawAxis(); + // markAxis(); + plotGraph(0.01); + } +} + +fn drawAxis() void { + const endy_on_abscis: i32 = @divTrunc(SCREENHEIGHT, 2); + const endx_on_ordinat: i32 = @divTrunc(SCREENWIDTH, 2); + // x + rl.drawLine(0, endy_on_abscis, SCREENWIDTH, endy_on_abscis, rl.Color.black); + // y + rl.drawLine(endx_on_ordinat, 0, endx_on_ordinat, SCREENHEIGHT, rl.Color.black); +} + +// todo in the future we will do calculations only once and just repeat displaying +fn plotGraph(diff: f32) void { + // diff is currently 0.01 + const thickness = 2.5; + var x_value: f32 = -SCREENWIDTH / 2; + + while (x_value <= SCREENWIDTH) : (x_value += diff) { + const cur_pos = adjustForGridSystem(rl.Vector2{ + .x = x_value, + .y = getY(x_value), + }); + + const next_pos = adjustForGridSystem(rl.Vector2{ + .x = x_value + diff, + .y = getY(x_value + diff), + }); + + rl.drawLineEx(cur_pos, next_pos, thickness, rl.Color.dark_blue); + } +} + +fn getY(x: f32) f32 { + const a = math.abs(x) - 2; + const b = 1; + return @divTrunc(a, b); +} + +fn adjustForGridSystem(input_vector: rl.Vector2) rl.Vector2 { + const new_vector = rl.Vector2{ + .x = input_vector.x + SCREENWIDTH / 2, + .y = -input_vector.y + SCREENHEIGHT / 2, + }; + + return new_vector; +} diff --git a/src/math.zig b/src/math.zig new file mode 100644 index 0000000..6aa5294 --- /dev/null +++ b/src/math.zig @@ -0,0 +1,27 @@ +pub fn abs(a: f32) f32 { + if (a < 0) { + return -a; + } + + return a; +} + +pub fn pow(a: f32, b: i32) f32 { + var res: f32 = 1.0; + var n: usize = undefined; + var f: f32 = undefined; + + if (b < 0) { + f = 1 / a; + n = @intCast(-b); + } else { + f = a; + n = @intCast(b); + } + + for (0..n) |_| { + res *= f; + } + + return res; +}