use num::Float;
use crate::{PHF, TUV, center_indexed, divide_int};
use crate::icosahedron::Icosahedron;
#[derive(Debug)]
pub struct Dodecahedron<F: Float> {
pub vtx: Vec<[F; 3]>,
pub edges: Vec<(u8, [u8; 3])>,
pub tri: Vec<Vec<[u8; 3]>>
}
impl<F: Float> TUV<F> for Dodecahedron<F> {
fn get_uv_t(&self, _f: usize, _v: usize, _i: usize,
_r: f64, _s: f64, o: [f64; 2]) -> [F; 2] { [<F>::from(o[0] + 0.0).unwrap(), <F>::from(o[1] + 0.0).unwrap()]
}
fn ref_vtx(&self) -> &Vec<[F; 3]> { &self.vtx }
fn ref_tri(&self) -> &Vec<Vec<[u8; 3]>> { &self.tri }
fn with_uv(&self, tf: bool) -> PHF<F> { self.phf(tf, false) }
}
impl<F: Float> Dodecahedron<F> {
pub fn new(r: F) -> Self {
let icosa = Icosahedron::<F>::new(r);
let vtx: Vec<_> = icosa.tri.iter().map(|t|
center_indexed(&t[0], &icosa.vtx)).collect(); let edges = vec![];
let tri = vec![
vec![[0, 4, 3], [0, 3, 2], [0, 2, 1]], vec![[4, 0, 7], [4, 7, 6], [4, 6, 5]], vec![[0, 1, 9], [0, 9, 8], [0, 8, 7]], vec![[1, 2, 11], [1, 11, 10], [1, 10, 9]], vec![[2, 3, 13], [2, 13, 12], [2, 12, 11]], vec![[3, 4, 5], [3, 5, 14], [3, 14, 13]], vec![[15, 14, 5], [15, 5, 6], [15, 6, 16]], vec![[16, 6, 7], [16, 7, 8], [16, 8, 17]], vec![[17, 8, 9], [17, 9, 10], [17, 10, 18]], vec![[18, 10, 11], [18, 11, 12], [18, 12, 19]], vec![[19, 12, 13], [19, 13, 14], [19, 14, 15]], vec![[19, 15, 16], [19, 16, 17], [19, 17, 18]] ];
Dodecahedron{vtx, edges, tri}
}
}
#[derive(Debug)]
pub struct DodecahedronCenter<F: Float> {
pub vtx: Vec<[F; 3]>,
pub edges: Vec<(u8, [u8; 3])>,
pub tri: Vec<Vec<[u8; 3]>>
}
impl<F: Float> TUV<F> for DodecahedronCenter<F> {
fn get_uv_t(&self, _f: usize, _v: usize, _i: usize,
_r: f64, _s: f64, o: [f64; 2]) -> [F; 2] { [<F>::from(o[0] + 0.0).unwrap(), <F>::from(o[1] + 0.0).unwrap()]
}
fn ref_vtx(&self) -> &Vec<[F; 3]> { &self.vtx }
fn ref_tri(&self) -> &Vec<Vec<[u8; 3]>> { &self.tri }
fn with_uv(&self, tf: bool) -> PHF<F> { self.phf(tf, true) }
}
impl<F: Float> DodecahedronCenter<F> {
pub fn new(r: F) -> Self {
let icosa = Icosahedron::<F>::new(r);
let iv = &icosa.vtx;
let dodeca = Dodecahedron::<F>::new(r);
let mut vtx: Vec<_> = dodeca.vtx.iter().map(|&p| p).collect(); vtx.extend(icosa.edges.iter().map(|&(e, is)|
divide_int(&iv[e as usize], ¢er_indexed(&is, &iv), 2, 1))); let edges = vec![];
let tri: Vec<_> = (20..32).into_iter().map(|q: u8| {
let mut t = Vec::with_capacity(5); let o = q as usize - 20;
t.push([q, dodeca.tri[o][0][0], dodeca.tri[o][0][1]]);
let _: Vec<_> = (0..3).into_iter().map(|p| {
t.push([q, dodeca.tri[o][p][1], dodeca.tri[o][p][2]]);
}).collect();
t.push([q, dodeca.tri[o][2][2], dodeca.tri[o][2][0]]);
t
}).collect();
DodecahedronCenter{vtx, edges, tri}
}
}