Skip to main content

rscad_csg_bsp/primitives/
circle.rs

1use nalgebra::Point;
2use num_traits::real::Real;
3
4use crate::{Csg, Number, Polygon};
5
6pub fn circle<T: Number>(radius: T, segments: usize) -> Csg<T> {
7    let segments_t = T::from(segments).expect("Failed to convert segments to generic T");
8    let pi = T::PI();
9    let two = T::one() + T::one();
10    let two_pi = two * pi;
11    Csg::from_polygons([
12        Polygon::from_points((0..segments).filter_map(|v| T::from(v)).map(|segment| {
13            let frac_segment = segment / segments_t;
14            let angle = two_pi * frac_segment;
15            Point::from([
16                radius * Real::sin(angle),
17                T::zero(),
18                radius * Real::cos(angle),
19            ])
20        }))
21        .expect("Impossible"),
22    ])
23}