1use num::Float;
10
11use ph_faces::{Polyhedron, center_indexed, divide_int, calc_cg_with_volume};
12
13use crate::icosahedron::Icosahedron;
14
15#[derive(Debug)]
17pub struct Dodecahedron<F: Float> {
18 pub ph: Polyhedron<F>,
20 pub edges: Vec<(u16, [u16; 3])>
22}
23
24impl<F: Float + std::fmt::Debug> Dodecahedron<F> where F: std::iter::Sum {
26 pub fn new(r: F) -> Self {
28 let icosa_e = Icosahedron::<F>::new(r); let icosa = icosa_e.ph;
30 let vtx: Vec<_> = icosa.tri.iter().map(|t|
31 center_indexed(&t[0], &icosa.vtx)).collect(); let edges = vec![];
33 let tri = vec![
34 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]] ];
47 let uv = vec![];
48 let p = <F>::from(1e-6).unwrap();
49 let (_cg, vol) = calc_cg_with_volume(&tri, &vtx, p);
50 Dodecahedron{ph: Polyhedron{vtx, tri, uv, vol, center: false}, edges}
51 }
52}
53
54#[derive(Debug)]
56pub struct DodecahedronCenter<F: Float> {
57 pub ph: Polyhedron<F>,
59 pub edges: Vec<(u16, [u16; 3])>
61}
62
63impl<F: Float + std::fmt::Debug> DodecahedronCenter<F> where F: std::iter::Sum {
65 pub fn new(r: F) -> Self {
67 let icosa_e = Icosahedron::<F>::new(r); let icosa = icosa_e.ph;
69 let iv = &icosa.vtx;
70let dodeca_e = Dodecahedron::<F>::new(r); let dodeca = dodeca_e.ph;
79 let mut vtx: Vec<_> = dodeca.vtx.iter().map(|&p| p).collect(); vtx.extend(icosa_e.edges.iter().map(|&(e, is)|
81 divide_int(&iv[e as usize], ¢er_indexed(&is, &iv), 2, 1))); let edges = vec![];
83 let tri: Vec<_> = (20..32).into_iter().map(|q: u16| {
84 let mut t = Vec::with_capacity(5); let o = q as usize - 20;
86 t.push([q, dodeca.tri[o][0][0], dodeca.tri[o][0][1]]);
87 let _: Vec<_> = (0..3).into_iter().map(|p| {
88 t.push([q, dodeca.tri[o][p][1], dodeca.tri[o][p][2]]);
89 }).collect();
90 t.push([q, dodeca.tri[o][2][2], dodeca.tri[o][2][0]]);
91 t
92 }).collect();
93let uv = vec![];
107 let p = <F>::from(1e-6).unwrap();
108 let (_cg, vol) = calc_cg_with_volume(&tri, &vtx, p);
109 DodecahedronCenter{ph: Polyhedron{vtx, tri, uv, vol, center: true}, edges}
110 }
111}