use super::path::*;
pub struct BezierPathBuilder<P: BezierPath> {
start_point: P::Point,
points: Vec<(P::Point, P::Point, P::Point)>
}
impl<P: BezierPathFactory> BezierPathBuilder<P> {
pub fn start(start: P::Point) -> BezierPathBuilder<P> {
BezierPathBuilder {
start_point: start,
points: vec![]
}
}
pub fn build(self) -> P {
P::from_points(self.start_point, self.points)
}
pub fn line_to(mut self, point: P::Point) -> Self {
let distance = if self.points.is_empty() {
point - self.start_point
} else {
point - self.points[self.points.len()-1].2
};
let cp1 = point - (distance*0.6666);
let cp2 = point - (distance*0.3333);
self.points.push((cp1, cp2, point));
self
}
pub fn curve_to(mut self, (cp1, cp2): (P::Point, P::Point), end_point: P::Point) -> Self {
self.points.push((cp1, cp2, end_point));
self
}
}