55 lines
1.5 KiB
Zig
55 lines
1.5 KiB
Zig
const std = @import("std");
|
|
|
|
const Point = @import("point.zig").Point;
|
|
|
|
pub const PointF = struct {
|
|
x: f32,
|
|
y: f32,
|
|
|
|
pub const Half = PointF{ .x = 0.5, .y = 0.5 };
|
|
pub const One = PointF{ .x = 1, .y = 1 };
|
|
pub const Zero = PointF{ .x = 0, .y = 0 };
|
|
|
|
pub fn init(x: f32, y: f32) PointF {
|
|
return PointF{ .x = x, .y = y };
|
|
}
|
|
|
|
pub fn add(self: PointF, other: PointF) PointF {
|
|
return PointF{ .x = self.x + other.x, .y = self.y + other.y };
|
|
}
|
|
|
|
pub fn ceil(self: PointF) PointF {
|
|
return PointF{ .x = std.math.ceil(self.x), .y = std.math.ceil(self.y) };
|
|
}
|
|
|
|
pub fn distance(self: PointF, to: PointF) f32 {
|
|
return std.math.sqrt(self.distance2(to));
|
|
}
|
|
|
|
pub fn distance2(self: PointF, to: PointF) f32 {
|
|
const dx = to.x - self.x;
|
|
const dy = to.y - self.y;
|
|
return dx * dx + dy * dy;
|
|
}
|
|
|
|
pub fn floor(self: PointF) PointF {
|
|
return PointF{ .x = std.math.floor(self.x), .y = std.math.floor(self.y) };
|
|
}
|
|
|
|
pub fn integer(self: PointF) Point {
|
|
return Point{ .x = @as(i64, @intFromFloat(self.x)), .y = @as(i64, @intFromFloat(self.y)) };
|
|
}
|
|
|
|
pub fn multiply(self: PointF, factor: f32) PointF {
|
|
return PointF{ .x = self.x * factor, .y = self.y * factor };
|
|
}
|
|
|
|
pub fn round(self: PointF) PointF {
|
|
return PointF{ .x = std.math.round(self.x), .y = std.math.round(self.y) };
|
|
}
|
|
|
|
pub fn subtract(self: PointF, other: PointF) PointF {
|
|
return PointF{ .x = self.x - other.x, .y = self.y - other.y };
|
|
}
|
|
};
|