use geometry_rs::Point;
#[allow(clippy::similar_names)]
pub(crate) fn raycast_seg(a: Point, b: Point, p: Point) -> (bool, bool) {
let mut py = p.y;
if a.y < b.y {
if py < a.y || py > b.y {
return (false, false);
}
} else if a.y > b.y && (py < b.y || py > a.y) {
return (false, false);
}
if a.y == b.y {
if a.x == b.x {
if p.x == a.x && py == a.y {
return (false, true);
}
return (false, false);
}
if py == b.y {
if a.x < b.x {
if p.x >= a.x && p.x <= b.x {
return (false, true);
}
} else if p.x >= b.x && p.x <= a.x {
return (false, true);
}
}
}
if a.x == b.x && p.x == b.x {
if a.y < b.y {
if py >= a.y && py <= b.y {
return (false, true);
}
} else if py >= b.y && py <= a.y {
return (false, true);
}
}
if (p.x - a.x) / (b.x - a.x) == (py - a.y) / (b.y - a.y) {
return (false, true);
}
while py == a.y || py == b.y {
py = py.next_up();
}
if a.y < b.y {
if py < a.y || py > b.y {
return (false, false);
}
} else if py < b.y || py > a.y {
return (false, false);
}
if a.x > b.x {
if p.x >= a.x {
return (false, false);
}
if p.x <= b.x {
return (true, false);
}
} else {
if p.x >= b.x {
return (false, false);
}
if p.x <= a.x {
return (true, false);
}
}
if a.y < b.y {
if (py - a.y) / (p.x - a.x) >= (b.y - a.y) / (b.x - a.x) {
return (true, false);
}
} else if (py - b.y) / (p.x - b.x) >= (a.y - b.y) / (a.x - b.x) {
return (true, false);
}
(false, false)
}