parry2d/transformation/to_polyline/
round_convex_polygon_to_polyline.rs

1use crate::math::Real;
2use crate::shape::RoundConvexPolygon;
3use crate::transformation::utils;
4use alloc::{vec, vec::Vec};
5use na::{self, Point2};
6
7impl RoundConvexPolygon {
8    /// Discretize the boundary of this round convex polygon as a polygonal line.
9    pub fn to_polyline(&self, border_subdivs: u32) -> Vec<Point2<Real>> {
10        let mut out_vtx = vec![];
11        let pts = self.inner_shape.points();
12        let ns = self.inner_shape.normals();
13        let br = self.border_radius;
14
15        out_vtx.push(pts[0] + **ns.last().unwrap() * br);
16
17        for ia in 0..pts.len() - 1 {
18            let ib = ia + 1;
19
20            let arc_start = *out_vtx.last().unwrap();
21            let arc_end = pts[ia] + *ns[ia] * br;
22            utils::push_arc(pts[ia], arc_start, arc_end, border_subdivs, &mut out_vtx);
23            out_vtx.push(arc_end);
24            out_vtx.push(pts[ib] + *ns[ia] * br);
25        }
26
27        let arc_center = *pts.last().unwrap();
28        let arc_start = *out_vtx.last().unwrap();
29        let arc_end = arc_center + **ns.last().unwrap() * br;
30        utils::push_arc(arc_center, arc_start, arc_end, border_subdivs, &mut out_vtx);
31        out_vtx.push(arc_end);
32
33        out_vtx
34    }
35}