fullerene/icosahedron.rs
1//! icosahedron.rs
2//!
3//! Icosahedron
4//! vertices (3 x 4) = 12
5//! 3 x 20 faces (vertices 60 / 5 = 12)
6//! edges 20 x 3 / 2 = 30
7//!
8
9// use num::{Float, zero, one};
10use num::Float;
11
12use ph_faces::{Polyhedron, calc_cg_with_volume};
13
14/// Icosahedron
15#[derive(Debug)]
16pub struct Icosahedron<F: Float> {
17 /// polyhedron tri: Vec 20 of Vec 1 indexed triangles
18 pub ph: Polyhedron<F>,
19 /// edges (duplex)
20 pub edges: Vec<(u16, [u16; 5])>
21}
22
23/// Icosahedron
24impl<F: Float + std::fmt::Debug> Icosahedron<F> where F: std::iter::Sum {
25 /// construct
26 pub fn new(r: F) -> Self {
27 let o = <F>::from(0).unwrap(); // = zero(); // = zero::<F>();
28 let i = <F>::from(1).unwrap() * r; // = one(); // = one::<F>();
29/*
30 let d = <F>::from(2).unwrap();
31 let r5 = <F>::from(5).unwrap().sqrt() * r;
32 let p = (r5 + i) / d; // golden ratio
33*/
34 let p = <F>::from((5.0.sqrt() + 1.0) / 2.0).unwrap() * r; // golden ratio
35 let mut ph = Polyhedron{
36 vtx: vec![
37 [o, -i, -p], [o, i, -p], [o, i, p], [o, -i, p],
38 [-p, o, -i], [-p, o, i], [p, o, i], [p, o, -i],
39 [-i, -p, o], [i, -p, o], [i, p, o], [-i, p, o]
40 ],
41 tri: vec![
42/*
43 [0, 8, 4], // triple x 1
44 [0, 9, 8], [4, 1, 0], [8, 5, 4], // double x 3
45 [0, 1, 7], [0, 7, 9], // single x 2 (x = 0)
46 [4, 5, 11], [4, 11, 1], // single x 2 (y = 0)
47 [8, 9, 3], [8, 3, 5], // single x 2 (z = 0)
48 [6, 9, 7], [6, 3, 9], // single x 2 (y = 0)
49 [10, 1, 11], [10, 7, 1], // single x 2 (z = 0)
50 [2, 5, 3], [2, 11, 5], // single x 2 (x = 0)
51 [2, 3, 6], [6, 7, 10], [10, 11, 2], // double x 3
52 [2, 6, 10] // triple x 1
53*/
54 vec![[0, 8, 4]],
55 vec![[0, 9, 8]],
56 vec![[0, 7, 9]],
57 vec![[0, 1, 7]],
58 vec![[4, 1, 0]],
59 vec![[4, 11, 1]],
60 vec![[4, 5, 11]],
61 vec![[8, 5, 4]],
62 vec![[8, 3, 5]],
63 vec![[8, 9, 3]],
64 vec![[6, 3, 9]],
65 vec![[6, 9, 7]],
66 vec![[6, 7, 10]],
67 vec![[10, 7, 1]],
68 vec![[10, 1, 11]],
69 vec![[10, 11, 2]],
70 vec![[2, 11, 5]],
71 vec![[2, 5, 3]],
72 vec![[2, 3, 6]],
73 vec![[2, 6, 10]]
74 ],
75 uv: vec![],
76 vol: o,
77 center: false
78 };
79 let q = <F>::from(1e-6).unwrap();
80 let (_cg, vol) = calc_cg_with_volume(&ph.tri, &ph.vtx, q);
81 ph.vol = vol;
82 let edges = vec![ // (duplex)
83 (0, [1, 7, 9, 8, 4]), // 6 2 11 8 9 (x = 0) 6 + 8 9 9 1 9
84 (4, [5, 11, 1, 0, 8]), // (y = 0)
85 (8, [9, 3, 5, 4, 0]), // (z = 0)
86 (9, [8, 0, 7, 6, 3]), // (z = 0)
87 (7, [6, 9, 0, 1, 10]), // (y = 0)
88 (1, [0, 4, 11, 10, 7]), // 4 7 11 9 5 (x = 0) 4 + 3 4 10 8 11
89 (11, [10, 1, 4, 5, 2]), // (z = 0)
90 (5, [4, 8, 3, 2, 11]), // (y = 0)
91 (3, [2, 5, 8, 9, 6]), // 3 3 1 9 8 (x = 0) 3 + 0 10 8 11 7
92 (6, [7, 10, 2, 3, 9]), // (y = 0)
93 (10, [11, 2, 6, 7, 1]), // (z = 0)
94 (2, [3, 6, 10, 11, 5]) // 3 4 1 6 10 (x = 0) 3 + 1 9 5 4 5
95 ];
96 Icosahedron{ph, edges}
97 }
98}