mod contours;
mod drawing;
mod math;
mod poly_algos;
mod shapes;
pub use contours::{find_contours, RetrievalMode};
pub use drawing::{draw_line, draw_polygon, fill_rect, stroke_rect, FillIter, Painter, Rgb};
pub use math::Vec2;
pub use poly_algos::{convex_hull, min_area_rect, simplify_polygon, simplify_polyline};
pub use shapes::{
bounding_rect, BoundingRect, Coord, Line, LineF, Point, PointF, Polygon, PolygonF, Polygons,
Rect, RectF, RotatedRect,
};
#[cfg(test)]
mod tests {
use std::fmt::Display;
use rten_tensor::{MatrixLayout, NdTensorView, NdTensorViewMut};
use super::{Coord, Point, Rect};
pub fn border_points(rect: Rect, omit_corners: bool) -> Vec<Point> {
let mut points = Vec::new();
let left_range = if omit_corners {
rect.top() + 1..rect.bottom() - 1
} else {
rect.top()..rect.bottom()
};
for y in left_range.clone() {
points.push(Point::from_yx(y, rect.left()));
}
for x in rect.left() + 1..rect.right() - 1 {
points.push(Point::from_yx(rect.bottom() - 1, x));
}
for y in left_range.rev() {
points.push(Point::from_yx(y, rect.right() - 1));
}
for x in (rect.left() + 1..rect.right() - 1).rev() {
points.push(Point::from_yx(rect.top(), x));
}
points
}
#[allow(dead_code)]
pub fn plot_points<T: Copy>(mut grid: NdTensorViewMut<T, 2>, points: &[Point], value: T) {
for point in points {
grid[point.coord()] = value;
}
}
#[allow(dead_code)]
fn plot_point_indices<T: std::ops::AddAssign + Copy + Default>(
mut grid: NdTensorViewMut<T, 2>,
points: &[Point],
step: T,
) {
let mut value = T::default();
value += step;
for point in points {
grid[point.coord()] = value;
value += step;
}
}
pub fn points_from_coords<T: Coord>(coords: &[[T; 2]]) -> Vec<Point<T>> {
coords.iter().map(|[y, x]| Point::from_yx(*y, *x)).collect()
}
pub fn points_from_n_coords<T: Coord, const N: usize>(coords: [[T; 2]; N]) -> [Point<T>; N] {
coords.map(|[y, x]| Point::from_yx(y, x))
}
#[allow(dead_code)]
pub fn print_grid<T: Display>(grid: NdTensorView<T, 2>) {
for y in 0..grid.rows() {
for x in 0..grid.cols() {
print!("{:2} ", grid[[y, x]]);
}
println!();
}
println!();
}
}