use na;
use na::{Translate, Rotate, Transform};
use math::{Point, Vect};
#[derive(Clone)]
pub struct Polyline<P: Point> {
pub coords: Vec<P>,
pub normals: Option<Vec<P::Vect>>,
}
impl<P: Point> Polyline<P> {
pub fn new(coords: Vec<P>, normals: Option<Vec<P::Vect>>) -> Polyline<P> {
Polyline {
coords: coords,
normals: normals,
}
}
}
impl<P: Point> Polyline<P> {
pub fn translate_by<T: Translate<P>>(&mut self, t: &T) {
for c in self.coords.iter_mut() {
*c = t.translate(c);
}
}
pub fn rotate_by<R: Rotate<P::Vect>>(&mut self, r: &R) {
for c in self.coords.iter_mut() {
let rc = r.rotate(c.as_vec());
c.set_coords(rc);
}
for n in self.normals.iter_mut() {
for n in n.iter_mut() {
*n = r.rotate(n);
}
}
}
pub fn transform_by<T: Transform<P> + Rotate<P::Vect>>(&mut self, t: &T) {
for c in self.coords.iter_mut() {
*c = t.transform(c);
}
for n in self.normals.iter_mut() {
for n in n.iter_mut() {
*n = t.rotate(n);
}
}
}
pub fn scale_by_scalar(&mut self, s: &<P::Vect as Vect>::Scalar) {
for c in self.coords.iter_mut() {
*c = *c * *s
}
}
}
impl<P> Polyline<P>
where P: Point {
#[inline]
pub fn scale_by(&mut self, s: &P::Vect) {
for c in self.coords.iter_mut() {
for i in 0 .. na::dim::<P::Vect>() {
c[i] = (*c)[i] * s[i];
}
}
}
}