use super::*;
#[derive(Clone, Copy)]
pub(super) struct Frame {
pub(super) o: Vec3,
pub(super) u: Vec3,
pub(super) v: Vec3,
pub(super) w: Vec3,
}
impl Frame {
pub(super) fn from_placement(p: &[[f64; 3]; 4]) -> Self {
let v = |a: [f64; 3]| Vec3::new(a[0], a[1], a[2]);
Frame {
o: v(p[0]),
u: v(p[1]),
v: v(p[2]),
w: v(p[3]),
}
}
pub(super) fn point(&self, x: f64, y: f64, z: f64) -> Vec3 {
self.o
.add(self.u.scale(x))
.add(self.v.scale(y))
.add(self.w.scale(z))
}
pub(super) fn affine(&self) -> Result<AffineTransform, String> {
AffineTransform::new([
self.u.x, self.v.x, self.w.x, self.o.x, self.u.y, self.v.y, self.w.y, self.o.y, self.u.z, self.v.z, self.w.z, self.o.z, 0.0, 0.0, 0.0, 1.0,
])
}
}
pub(super) fn rotate_about(v: Vec3, k: Vec3, angle: f64) -> Vec3 {
v.rotate_about(k, angle)
}