similari 0.22.6

Machine learning framework for building object trackers and similarity search engines
Documentation
use crate::utils::bbox::Universal2DBox;
use crate::utils::clipping::sutherland_hodgman_clip;
use geo::{Area, CoordsIter, Polygon};
use pyo3::prelude::*;

#[derive(Debug)]
#[pyclass]
#[pyo3(name = "Polygon")]
pub struct PyPolygon {
    polygon: Polygon<f64>,
}

#[pymethods]
impl PyPolygon {
    #[pyo3(text_signature = "($self)")]
    pub fn get_vertices(&self) -> Vec<(f64, f64)> {
        self.polygon.coords_iter().map(|c| (c.x, c.y)).collect()
    }

    #[classattr]
    const __hash__: Option<Py<PyAny>> = None;

    fn __repr__(&self) -> String {
        format!("{:?}", self)
    }

    fn __str__(&self) -> String {
        format!("{:#?}", self)
    }
}

#[pyfunction]
#[pyo3(
    name = "sutherland_hodgman_clip",
    text_signature = "(subject, clipping)"
)]
pub fn sutherland_hodgman_clip_py(subject: Universal2DBox, clipping: Universal2DBox) -> PyPolygon {
    let mut subject = subject;
    let mut clipping = clipping;

    if subject.angle.is_none() {
        subject.rotate_py(0.0);
    }

    if clipping.angle.is_none() {
        clipping.rotate_py(0.0);
    }

    if subject.get_vertices().is_none() {
        subject.gen_vertices_py();
    }

    if clipping.get_vertices().is_none() {
        clipping.gen_vertices_py();
    }

    let clip = sutherland_hodgman_clip(
        subject.get_vertices().as_ref().unwrap(),
        clipping.get_vertices().as_ref().unwrap(),
    );
    PyPolygon { polygon: clip }
}

#[pyfunction]
#[pyo3(name = "intersection_area", text_signature = "(subject, clipping)")]
pub fn intersection_area_py(subject: Universal2DBox, clipping: Universal2DBox) -> f64 {
    let poly = sutherland_hodgman_clip_py(subject, clipping);
    poly.polygon.unsigned_area()
}