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}