use num::Float;
use ph_faces::{Polyhedron, center_indexed, divide_int};
use crate::icosahedron::Icosahedron;
#[derive(Debug)]
pub struct Dodecahedron<F: Float> {
pub ph: Polyhedron<F>,
pub edges: Vec<(u8, [u8; 3])>
}
impl<F: Float> Dodecahedron<F> {
pub fn new(r: F) -> Self {
let icosa_e = Icosahedron::<F>::new(r); let icosa = icosa_e.ph;
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{ph: Polyhedron{vtx, tri}, edges}
}
}
#[derive(Debug)]
pub struct DodecahedronCenter<F: Float> {
pub ph: Polyhedron<F>,
pub edges: Vec<(u8, [u8; 3])>
}
impl<F: Float> DodecahedronCenter<F> {
pub fn new(r: F) -> Self {
let icosa_e = Icosahedron::<F>::new(r); let icosa = icosa_e.ph;
let iv = &icosa.vtx;
let dodeca_e = Dodecahedron::<F>::new(r); let dodeca = dodeca_e.ph;
let mut vtx: Vec<_> = dodeca.vtx.iter().map(|&p| p).collect(); vtx.extend(icosa_e.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{ph: Polyhedron{vtx, tri}, edges}
}
}