use geometry::*; pub enum Hitbox { Circle(CircleHitbox), Point(PointHitbox) } pub struct CircleHitbox { pub pos: Vec2d, pub radius: f64 } pub struct PointHitbox { pub pos: Vec2d } impl Hitbox { pub fn intersect(a: &Hitbox, b: &Hitbox) -> bool { use self::Hitbox::*; match (a, b) { (Circle(x), Circle(y)) => circles_intersect(x, y), (Circle(x), Point(y)) => circle_point_intersect(x, y), (Point(x), Circle(y)) => circle_point_intersect(y, x), (Point(x), Point(y)) => points_intersect(x, y) } } } fn circles_intersect(x: &CircleHitbox, y: &CircleHitbox) -> bool { x.pos.distance_squared(y.pos) <= (x.radius + y.radius).powi(2) } fn circle_point_intersect(x: &CircleHitbox, y: &PointHitbox) -> bool { x.pos.distance_squared(y.pos) <= x.radius.powi(2) } fn points_intersect(x: &PointHitbox, y: &PointHitbox) -> bool { x.pos == y.pos }