1use num::Float;
5
6use crate::calc_cg_with_volume;
7use crate::{Polyhedron, center_indexed, center_indexed_uv};
8
9#[derive(Debug)]
11pub struct Cuboid<F: Float> {
12 pub ph: Polyhedron<F>,
14 pub edges: Vec<(u16, [u16; 3])>
16}
17
18impl<F: Float + std::fmt::Debug> Cuboid<F> where F: std::iter::Sum {
20 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, -y, z], [-x, y, z], [-x, y, -z], [-x, -y, -z], [x, y, -z], [-x, y, -z], [-x, y, z], [x, y, z], [x, -y, -z], [x, -y, z], [-x, -y, z], [-x, -y, -z], [-x, y, z], [-x, -y, z], [x, -y, z], [x, y, z], [-x, y, -z], [x, y, -z], [x, -y, -z], [-x, -y, -z] ];
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[[0.25, 0.50], [0.50, 0.50], [0.50, 0.25], [0.25, 0.25]], [[0.25, 0.75], [0.25, 1.00], [0.50, 1.00], [0.50, 0.75]], [[0.50, 0.25], [0.50, 0.00], [0.25, 0.00], [0.25, 0.25]], [[0.50, 0.50], [0.25, 0.50], [0.25, 0.75], [0.50, 0.75]], [[0.00, 0.25], [0.00, 0.50], [0.25, 0.50], [0.25, 0.25]], [[0.75, 0.75], [0.75, 0.50], [0.50, 0.50], [0.50, 0.75]] ].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#[derive(Debug)]
69pub struct Cube<F: Float> {
70 pub ph: Polyhedron<F>,
72 pub edges: Vec<(u16, [u16; 3])>
74}
75
76impl<F: Float + std::fmt::Debug> Cube<F> where F: std::iter::Sum {
78 pub fn new(r: F) -> Self {
80 let vtx = vec![
81 [r, -r, r], [r, -r, -r], [r, r, -r], [r, r, r], [-r, -r, r], [-r, r, r], [-r, r, -r], [-r, -r, -r], [r, r, -r], [-r, r, -r], [-r, r, r], [r, r, r], [r, -r, -r], [r, -r, r], [-r, -r, r], [-r, -r, -r], [-r, r, r], [-r, -r, r], [r, -r, r], [r, r, r], [-r, r, -r], [r, r, -r], [r, -r, -r], [-r, -r, -r] ];
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[[0.25, 0.50], [0.50, 0.50], [0.50, 0.25], [0.25, 0.25]], [[0.25, 0.75], [0.25, 1.00], [0.50, 1.00], [0.50, 0.75]], [[0.50, 0.25], [0.50, 0.00], [0.25, 0.00], [0.25, 0.25]], [[0.50, 0.50], [0.25, 0.50], [0.25, 0.75], [0.50, 0.75]], [[0.00, 0.25], [0.00, 0.50], [0.25, 0.50], [0.25, 0.25]], [[0.75, 0.75], [0.75, 0.50], [0.50, 0.50], [0.50, 0.75]] ].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#[derive(Debug)]
125pub struct CubeCenter<F: Float> {
126 pub ph: Polyhedron<F>,
128 pub edges: Vec<(u16, [u16; 3])>
130}
131
132impl<F: Float + std::fmt::Debug> CubeCenter<F> where F: std::iter::Sum {
134 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]; let uvs = vec![uvr[0][0], uvr[0][1], uvr[0][2], uvr[1][2]]; 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}