fullerene/
dodecahedron.rs

1//! dodecahedron.rs
2//!
3//! Dodecahedron
4//! vertices 20
5//! 5 x 12 faces
6//! edges 30
7//!
8
9use num::Float;
10
11use ph_faces::{Polyhedron, center_indexed, divide_int, calc_cg_with_volume};
12
13use crate::icosahedron::Icosahedron;
14
15/// Dodecahedron
16#[derive(Debug)]
17pub struct Dodecahedron<F: Float> {
18  /// polyhedron tri: Vec 12 of Vec 3 indexed triangles
19  pub ph: Polyhedron<F>,
20  /// edges (duplex)
21  pub edges: Vec<(u16, [u16; 3])>
22}
23
24/// Dodecahedron
25impl<F: Float + std::fmt::Debug> Dodecahedron<F> where F: std::iter::Sum {
26  /// construct
27  pub fn new(r: F) -> Self {
28    let icosa_e = Icosahedron::<F>::new(r); // to keep lifetime
29    let icosa = icosa_e.ph;
30    let vtx: Vec<_> = icosa.tri.iter().map(|t|
31      center_indexed(&t[0], &icosa.vtx)).collect(); // 0-19
32    let edges = vec![];
33    let tri = vec![
34  vec![[0, 4, 3], [0, 3, 2], [0, 2, 1]], // 0 [0, [4, 3, 2, 1]]
35  vec![[4, 0, 7], [4, 7, 6], [4, 6, 5]], // 4 [4, [0, 7, 6, 5]]
36  vec![[0, 1, 9], [0, 9, 8], [0, 8, 7]], // 8 [0, [1, 9, 8, 7]]
37  vec![[1, 2, 11], [1, 11, 10], [1, 10, 9]], // 9 [1, [2, 11, 10, 9]]
38  vec![[2, 3, 13], [2, 13, 12], [2, 12, 11]], // 7 [2, [3, 13, 12, 11]]
39  vec![[3, 4, 5], [3, 5, 14], [3, 14, 13]], // 1 [3, [4, 5, 14, 13]]
40  vec![[15, 14, 5], [15, 5, 6], [15, 6, 16]], // 11 [15, [14, 5, 6, 16]]
41  vec![[16, 6, 7], [16, 7, 8], [16, 8, 17]], // 5 [16, [6, 7, 8, 17]]
42  vec![[17, 8, 9], [17, 9, 10], [17, 10, 18]], // 3 [17, [8, 9, 10, 18]]
43  vec![[18, 10, 11], [18, 11, 12], [18, 12, 19]], // 6 [18, [10, 11, 12, 19]]
44  vec![[19, 12, 13], [19, 13, 14], [19, 14, 15]], // 10 [19, [12, 13, 14, 15]]
45  vec![[19, 15, 16], [19, 16, 17], [19, 17, 18]] // 2 [19, [15, 16, 17, 18]]
46    ];
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/// Dodecahedron with center
55#[derive(Debug)]
56pub struct DodecahedronCenter<F: Float> {
57  /// polyhedron tri: Vec 12 of Vec 5 indexed triangles
58  pub ph: Polyhedron<F>,
59  /// edges (duplex)
60  pub edges: Vec<(u16, [u16; 3])>
61}
62
63/// Dodecahedron with center
64impl<F: Float + std::fmt::Debug> DodecahedronCenter<F> where F: std::iter::Sum {
65  /// construct
66  pub fn new(r: F) -> Self {
67    let icosa_e = Icosahedron::<F>::new(r); // to keep lifetime
68    let icosa = icosa_e.ph;
69    let iv = &icosa.vtx;
70/*
71    let mut vtx: Vec<_> = icosa_e.edges.iter().map(|&(e, is)|
72      divide_int(&iv[e as usize], &center_indexed(&is, &iv), 2, 1)).collect();
73    let dodeca_e = Dodecahedron::<F>::new(); // to keep lifetime
74    let dodeca = dodeca_e.ph;
75    vtx.extend(dodeca.vtx.iter().map(|&p| p));
76*/
77    let dodeca_e = Dodecahedron::<F>::new(r); // to keep lifetime
78    let dodeca = dodeca_e.ph;
79    let mut vtx: Vec<_> = dodeca.vtx.iter().map(|&p| p).collect(); // 0-19
80    vtx.extend(icosa_e.edges.iter().map(|&(e, is)|
81      divide_int(&iv[e as usize], &center_indexed(&is, &iv), 2, 1))); // 20-31
82    let edges = vec![];
83    let tri: Vec<_> = (20..32).into_iter().map(|q: u16| {
84      let mut t = Vec::with_capacity(5); // vec![[0u16; 3]; 5];
85      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();
93/*
94    let tri: Vec<_> = (20..32).into_iter().flat_map(|q: u16| {
95      let mut t = Vec::with_capacity(5); // vec![[0u16; 3]; 5];
96      let o = (q as usize - 20) * 3;
97      t.push([q, dodeca.tri[o][0], dodeca.tri[o][1]]);
98      let _: Vec<_> = (0..3).into_iter().map(|p| {
99        t.push([q, dodeca.tri[o + p][1], dodeca.tri[o + p][2]]);
100      }).collect();
101      t.push([q, dodeca.tri[o + 2][2], dodeca.tri[o + 2][0]]);
102      t
103    }).collect();
104*/
105    // println!("{:?}", tri);
106    let 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}