#![allow(dead_code)]
use crate::prelude::*;
use robust::{orient2d, Coord};
pub mod area;
pub mod bounding;
pub mod convex_hull;
pub mod convex_hull_arcs;
pub mod tangent;
pub mod self_intersect;
pub use area::{arcline_area, pointline_area};
pub use bounding::{arc_bounding_circle, arc_bounding_rect};
pub use convex_hull::{points_convex_hull, pointline_convex_hull};
pub use convex_hull_arcs::arcline_convex_hull;
pub use self_intersect::{
arcline_has_self_intersection, arcline_self_intersections, arcline_self_intersection_status,
arcline_has_self_intersection_aabb, arcline_self_intersections_aabb,
SelfIntersectionStatus,
};
pub fn is_convex_pointline(points: &Pointline) -> bool {
if points.len() < 3 {
return false;
}
let n = points.len();
let mut sign = 0;
for i in 0..n {
let p1 = points[i];
let p2 = points[(i + 1) % n];
let p3 = points[(i + 2) % n];
let orientation = orient2d(
Coord { x: p1.x, y: p1.y },
Coord { x: p2.x, y: p2.y },
Coord { x: p3.x, y: p3.y },
);
if orientation != 0.0 {
let current_sign = if orientation > 0.0 { 1 } else { -1 };
if sign == 0 {
sign = current_sign;
} else if sign != current_sign {
return false;
}
}
}
true
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_is_convex_pointline_square() {
let square = vec![
point(0.0, 0.0),
point(1.0, 0.0),
point(1.0, 1.0),
point(0.0, 1.0),
];
assert!(is_convex_pointline(&square));
}
#[test]
fn test_is_convex_polygon_concave() {
let concave = vec![
point(0.0, 0.0),
point(2.0, 0.0),
point(1.0, 1.0),
point(2.0, 2.0),
point(0.0, 2.0),
];
assert!(!is_convex_pointline(&concave));
}
#[test]
fn test_is_convex_polygon_with_collinear_segments() {
let polygon_with_collinear = vec![
point(0.0, 0.0),
point(1.0, 0.0), point(2.0, 0.0), point(2.0, 1.0),
point(2.0, 2.0),
point(0.0, 2.0),
];
assert!(is_convex_pointline(&polygon_with_collinear));
}
#[test]
fn test_is_convex_polygon_multiple_collinear() {
let polygon = vec![
point(0.0, 0.0),
point(1.0, 0.0), point(2.0, 0.0), point(3.0, 0.0),
point(3.0, 1.0), point(3.0, 2.0), point(3.0, 3.0),
point(2.0, 3.0), point(1.0, 3.0), point(0.0, 3.0),
];
assert!(is_convex_pointline(&polygon));
}
}