rscad_csg_bsp/primitives/
circle.rs1use 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}