offroad 0.0.1-alpha

2D offsetting for arc polylines.
Documentation
#![allow(dead_code)]

use std::fmt::Display;

use crate::Point;

#[derive(Debug, Copy, Clone, PartialEq)]
pub struct PVertex {
    pub p: Point,
    pub g: f64,
}

impl Display for PVertex {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        write!(f, "[{}, {}]", self.p, self.g)
    }
}

impl PVertex {
    #[inline]
    pub fn new(p: Point, g: f64) -> Self {
        PVertex { p, g }
    }
}

#[inline]
pub fn pvertex(p: Point, g: f64) -> PVertex {
    PVertex::new(p, g)
}

pub type Polyline = Vec<PVertex>;

pub fn polyline_reverse(poly: &Polyline) -> Polyline {
    let last = poly.last().unwrap();
    let mut rev = poly.clone();
    rev.reverse();
    let mut res: Polyline = Vec::with_capacity(poly.len());
    for i in 0..rev.len() - 1 {
        let e = pvertex(rev[i].p, -rev[i + 1].g);
        res.push(e);
    }
    let e = pvertex(rev.last().unwrap().p, -last.g);
    res.push(e);

    res
}

pub fn polylines_reverse(poly: &Vec<Polyline>) -> Vec<Polyline> {
    let mut res: Vec<Polyline> = Vec::with_capacity(poly.len());
    for p in poly.iter() {
        res.push(polyline_reverse(p));
    }
    res
}

pub fn polyline_scale(poly: &Polyline, scale: f64) -> Polyline {
    let mut res: Polyline = Vec::with_capacity(poly.len());
    for e in poly.iter() {
        let e = pvertex(e.p * scale, e.g);
        res.push(e);
    }
    res
}

pub fn polyline_translate(poly: &Polyline, translate: Point) -> Polyline {
    let mut res: Polyline = Vec::with_capacity(poly.len());
    for e in poly.iter() {
        let e = pvertex(e.p + translate, e.g);
        res.push(e);
    }
    res
}

#[cfg(test)]
mod test_pvertex {
    use super::*;
    use crate::point::point;

    #[test]
    fn test_new() {
        let p0 = PVertex::new(point(1.0, 2.0), 5.5);
        let p1 = pvertex(point(1.0, 2.0), 5.5);
        assert_eq!(p0, p1);
    }

    #[test]
    fn test_display() {
        let p = pvertex(point(1.0, 2.0), 5.5);

        assert_eq!(
            "[[1.00000000000000000000, 2.00000000000000000000], 5.5]",
            format!("{}", p)
        );
    }
}