use num::Float;
use ph_faces::Polyhedron;
#[derive(Debug)]
pub struct Icosahedron<F: Float> {
pub ph: Polyhedron<F>,
pub edges: Vec<(u8, [u8; 5])>
}
impl<F: Float> Icosahedron<F> {
pub fn new(r: F) -> Self {
let o = <F>::from(0).unwrap(); let i = <F>::from(1).unwrap() * r;
let p = <F>::from((5.0.sqrt() + 1.0) / 2.0).unwrap() * r; let ph = Polyhedron{
vtx: vec![
[o, -i, -p], [o, i, -p], [o, i, p], [o, -i, p],
[-p, o, -i], [-p, o, i], [p, o, i], [p, o, -i],
[-i, -p, o], [i, -p, o], [i, p, o], [-i, p, o]
],
tri: vec![
vec![[0, 8, 4]],
vec![[0, 9, 8]],
vec![[0, 7, 9]],
vec![[0, 1, 7]],
vec![[4, 1, 0]],
vec![[4, 11, 1]],
vec![[4, 5, 11]],
vec![[8, 5, 4]],
vec![[8, 3, 5]],
vec![[8, 9, 3]],
vec![[6, 3, 9]],
vec![[6, 9, 7]],
vec![[6, 7, 10]],
vec![[10, 7, 1]],
vec![[10, 1, 11]],
vec![[10, 11, 2]],
vec![[2, 11, 5]],
vec![[2, 5, 3]],
vec![[2, 3, 6]],
vec![[2, 6, 10]]
]
};
let edges = vec![ (0, [1, 7, 9, 8, 4]), (4, [5, 11, 1, 0, 8]), (8, [9, 3, 5, 4, 0]), (9, [8, 0, 7, 6, 3]), (7, [6, 9, 0, 1, 10]), (1, [0, 4, 11, 10, 7]), (11, [10, 1, 4, 5, 2]), (5, [4, 8, 3, 2, 11]), (3, [2, 5, 8, 9, 6]), (6, [7, 10, 2, 3, 9]), (10, [11, 2, 6, 7, 1]), (2, [3, 6, 10, 11, 5]) ];
Icosahedron{ph, edges}
}
}