ph_faces/polyhedron/
cube.rs

1//! Cube on polyhedron faces for Rust
2//!
3
4use num::Float;
5
6use crate::calc_cg_with_volume;
7use crate::{Polyhedron, center_indexed, center_indexed_uv};
8
9/// Cuboid
10#[derive(Debug)]
11pub struct Cuboid<F: Float> {
12  /// polyhedron tri: Vec 6 of Vec 2 indexed triangles
13  pub ph: Polyhedron<F>,
14  /// edges (duplex)
15  pub edges: Vec<(u16, [u16; 3])>
16}
17
18/// Cuboid
19impl<F: Float + std::fmt::Debug> Cuboid<F> where F: std::iter::Sum {
20  /// construct
21  pub fn new(lxyz: [F; 3]) -> Self {
22    let h = <F>::from(2).unwrap();
23    let (x, y, z) = (lxyz[0] / h, lxyz[1] / h, lxyz[2] / h);
24    let vtx = vec![
25      [x, -y, z], [x, -y, -z], [x, y, -z], [x, y, z], // +X (1 0 0) right
26      [-x, -y, z], [-x, y, z], [-x, y, -z], [-x, -y, -z], // -X (-1 0 0) left
27      [x, y, -z], [-x, y, -z], [-x, y, z], [x, y, z], // +Y (0 1 0) back
28      [x, -y, -z], [x, -y, z], [-x, -y, z], [-x, -y, -z], // -Y (0 -1 0) front
29      [-x, y, z], [-x, -y, z], [x, -y, z], [x, y, z], // +Z (0 0 1) top
30      [-x, y, -z], [x, y, -z], [x, -y, -z], [-x, -y, -z] // -Z (0 0 -1) bottom
31    ];
32    let tri = (0..6).into_iter().map(|f| {
33      let k = f * 4;
34      vec![[k, k + 1, k + 2], [k, k + 2, k + 3]]
35    }).collect();
36    let uv = vec![
37/*
38      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]], // +X (1 0 0) right
39      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]], // -X (-1 0 0) left
40      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]], // +Y (0 1 0) back
41      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]], // -Y (0 -1 0) front
42      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]], // +Z (0 0 1) top
43      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]] // -Z (0 0 -1) bottom
44*/
45      [[0.25, 0.50], [0.50, 0.50], [0.50, 0.25], [0.25, 0.25]], // 5137
46      [[0.25, 0.75], [0.25, 1.00], [0.50, 1.00], [0.50, 0.75]], // 4620
47      [[0.50, 0.25], [0.50, 0.00], [0.25, 0.00], [0.25, 0.25]], // 3267
48      [[0.50, 0.50], [0.25, 0.50], [0.25, 0.75], [0.50, 0.75]], // 1540
49      [[0.00, 0.25], [0.00, 0.50], [0.25, 0.50], [0.25, 0.25]], // 6457
50      [[0.75, 0.75], [0.75, 0.50], [0.50, 0.50], [0.50, 0.75]] // 2310
51    ].into_iter().map(|f|
52      (0..2).into_iter().map(|t| {
53        let i = [[0, 1, 2], [0, 2, 3]];
54        i[t].into_iter().map(|k|
55          f[k].iter().map(|&p|
56            <F>::from(p).unwrap()
57          ).collect::<Vec<_>>().try_into().unwrap()
58        ).collect::<Vec<_>>().try_into().unwrap()
59      }).collect()
60    ).collect();
61    let (_cg, vol) = calc_cg_with_volume(&tri, &vtx, <F>::from(1e-6).unwrap());
62    let edges = vec![];
63    Cuboid{ph: Polyhedron{vtx, tri, uv, vol, center: false}, edges}
64  }
65}
66
67/// Cube
68#[derive(Debug)]
69pub struct Cube<F: Float> {
70  /// polyhedron tri: Vec 6 of Vec 2 indexed triangles
71  pub ph: Polyhedron<F>,
72  /// edges (duplex)
73  pub edges: Vec<(u16, [u16; 3])>
74}
75
76/// Cube
77impl<F: Float + std::fmt::Debug> Cube<F> where F: std::iter::Sum {
78  /// construct
79  pub fn new(r: F) -> Self {
80    let vtx = vec![
81      [r, -r, r], [r, -r, -r], [r, r, -r], [r, r, r], // +X (1 0 0) right
82      [-r, -r, r], [-r, r, r], [-r, r, -r], [-r, -r, -r], // -X (-1 0 0) left
83      [r, r, -r], [-r, r, -r], [-r, r, r], [r, r, r], // +Y (0 1 0) back
84      [r, -r, -r], [r, -r, r], [-r, -r, r], [-r, -r, -r], // -Y (0 -1 0) front
85      [-r, r, r], [-r, -r, r], [r, -r, r], [r, r, r], // +Z (0 0 1) top
86      [-r, r, -r], [r, r, -r], [r, -r, -r], [-r, -r, -r] // -Z (0 0 -1) bottom
87    ];
88    let tri = (0..6).into_iter().map(|f| {
89      let k = f * 4;
90      vec![[k, k + 1, k + 2], [k, k + 2, k + 3]]
91    }).collect();
92    let uv = vec![
93/*
94      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]], // +X (1 0 0) right
95      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]], // -X (-1 0 0) left
96      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]], // +Y (0 1 0) back
97      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]], // -Y (0 -1 0) front
98      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]], // +Z (0 0 1) top
99      [[0.0, 1.0], [1.0, 1.0], [1.0, 0.0], [0.0, 0.0]] // -Z (0 0 -1) bottom
100*/
101      [[0.25, 0.50], [0.50, 0.50], [0.50, 0.25], [0.25, 0.25]], // 5137
102      [[0.25, 0.75], [0.25, 1.00], [0.50, 1.00], [0.50, 0.75]], // 4620
103      [[0.50, 0.25], [0.50, 0.00], [0.25, 0.00], [0.25, 0.25]], // 3267
104      [[0.50, 0.50], [0.25, 0.50], [0.25, 0.75], [0.50, 0.75]], // 1540
105      [[0.00, 0.25], [0.00, 0.50], [0.25, 0.50], [0.25, 0.25]], // 6457
106      [[0.75, 0.75], [0.75, 0.50], [0.50, 0.50], [0.50, 0.75]] // 2310
107    ].into_iter().map(|f|
108      (0..2).into_iter().map(|t| {
109        let i = [[0, 1, 2], [0, 2, 3]];
110        i[t].into_iter().map(|k|
111          f[k].iter().map(|&p|
112            <F>::from(p).unwrap()
113          ).collect::<Vec<_>>().try_into().unwrap()
114        ).collect::<Vec<_>>().try_into().unwrap()
115      }).collect()
116    ).collect();
117    let (_cg, vol) = calc_cg_with_volume(&tri, &vtx, <F>::from(1e-6).unwrap());
118    let edges = vec![];
119    Cube{ph: Polyhedron{vtx, tri, uv, vol, center: false}, edges}
120  }
121}
122
123/// CubeCenter
124#[derive(Debug)]
125pub struct CubeCenter<F: Float> {
126  /// polyhedron tri: Vec 6 of Vec 4 indexed triangles
127  pub ph: Polyhedron<F>,
128  /// edges (duplex)
129  pub edges: Vec<(u16, [u16; 3])>
130}
131
132/// CubeCenter
133impl<F: Float + std::fmt::Debug> CubeCenter<F> where F: std::iter::Sum {
134  /// construct
135  pub fn new(r: F) -> Self {
136    let cube = Cube::<F>::new(r);
137    let mut vtx = cube.ph.vtx.clone();
138    for f in 0..6 {
139      let idxs = (0..4).into_iter().map(|i| f * 4 + i).collect::<Vec<_>>();
140      vtx.push(center_indexed(&idxs, &cube.ph.vtx));
141    }
142    let tri = (0..6).into_iter().map(|f| {
143      let o = f + 24;
144      let k = f * 4;
145      vec![[o, k, k + 1], [o, k + 1, k + 2], [o, k + 2, k + 3], [o, k + 3, k]]
146    }).collect();
147    let uv = (0..6).into_iter().map(|f| {
148      let uvr = &cube.ph.uv[f]; // [[0 1 2] [0 2 3]]
149      let uvs = vec![uvr[0][0], uvr[0][1], uvr[0][2], uvr[1][2]]; // [0 1 2 3]
150      let idxs = (0..4).into_iter().collect::<Vec<_>>();
151      let o = center_indexed_uv(&idxs, &uvs);
152      vec![
153        [o, uvs[0], uvs[1]],
154        [o, uvs[1], uvs[2]],
155        [o, uvs[2], uvs[3]],
156        [o, uvs[3], uvs[0]]]
157    }).collect();
158    let (_cg, vol) = calc_cg_with_volume(&tri, &vtx, <F>::from(1e-6).unwrap());
159    let edges = vec![];
160    CubeCenter{ph: Polyhedron{vtx, tri, uv, vol, center: true}, edges}
161  }
162}