use core::ops::{Add, Mul};
#[allow(unused_imports)]
use num_traits::Float;
#[derive(Debug, Clone)]
pub struct ArcStepIterator<Item> {
origin: Item,
cos_scalar: Item,
sin_scalar: Item,
start_angle_in_radians: f32,
end_angle_in_radians: f32,
index: usize,
length: usize,
}
impl<Item> ArcStepIterator<Item> {
pub const fn new(
origin: Item,
cos_scalar: Item,
sin_scalar: Item,
start_angle_in_radians: f32,
end_angle_in_radians: f32,
length: usize,
) -> Self {
Self {
origin,
cos_scalar,
sin_scalar,
start_angle_in_radians,
end_angle_in_radians,
index: 0,
length,
}
}
}
impl<Item> Iterator for ArcStepIterator<Item>
where
Item: Add<Output = Item> + Copy,
f32: Mul<Item, Output = Item> + Mul<f32, Output = f32>,
{
type Item = Item;
fn next(&mut self) -> Option<Self::Item> {
if self.index >= self.length {
return None;
}
let denom = if self.length > 1 {
(self.length - 1) as f32
} else {
1.0
};
let t: f32 = (self.index as f32) / denom;
let sweep: f32 = self.end_angle_in_radians - self.start_angle_in_radians;
let theta: f32 = self.start_angle_in_radians + t * sweep;
let point = self.origin + theta.cos() * self.cos_scalar + theta.sin() * self.sin_scalar;
self.index += 1;
Some(point)
}
}