use crate::Bezier;
use geo_nd::Float;
pub struct BezierLineIter<F: Float, const D: usize> {
straightness: F,
stack: Vec<Bezier<F, D>>,
}
impl<F, const D: usize> BezierLineIter<F, D>
where
F: Float,
{
pub fn new(bezier: &Bezier<F, D>, straightness: F) -> Self {
let stack = vec![*bezier];
Self {
straightness,
stack,
}
}
}
impl<F, const D: usize> Iterator for BezierLineIter<F, D>
where
F: Float,
{
type Item = ([F; D], [F; D]);
fn next(&mut self) -> Option<Self::Item> {
match self.stack.pop() {
None => None,
Some(b) => {
if b.is_straight(self.straightness) {
Some(b.endpoints())
} else {
let (b0, b1) = b.bisect();
self.stack.push(b1);
self.stack.push(b0);
self.next()
}
}
}
}
}