use crate::{
elements::{view::ColChar, Vec2D},
elements3d::Vec3D,
};
pub struct ProjectedFace {
pub screen_points: Vec<Vec2D>,
pub original_vertices: Vec<Vec3D>,
pub z_index: Option<f64>,
pub fill_char: ColChar,
}
impl ProjectedFace {
pub fn new(
screen_points: Vec<Vec2D>,
original_vertices: Vec<Vec3D>,
z_index: Option<f64>,
fill_char: ColChar,
) -> Self {
Self {
screen_points,
original_vertices,
z_index,
fill_char,
}
}
pub fn get_average_centre(&self) -> Vec3D {
self.original_vertices.iter().copied().sum::<Vec3D>() / self.original_vertices.len() as f64
}
pub fn get_normal(&self) -> Option<Vec3D> {
if self.original_vertices.len() >= 3 {
let v0 = self.original_vertices[0] - self.original_vertices[2];
let v1 = self.original_vertices[1] - self.original_vertices[2];
Some(v0.cross(v1).normal())
} else {
None
}
}
}