diff options
Diffstat (limited to 'src/geometry/cuboid.rs')
| -rw-r--r-- | src/geometry/cuboid.rs | 234 |
1 files changed, 0 insertions, 234 deletions
diff --git a/src/geometry/cuboid.rs b/src/geometry/cuboid.rs deleted file mode 100644 index 89e1a1e..0000000 --- a/src/geometry/cuboid.rs +++ /dev/null @@ -1,234 +0,0 @@ -#[cfg(feature = "dim3")] -use crate::geometry::PolyhedronFace; -use crate::geometry::{Cuboid, CuboidFeature, CuboidFeatureFace}; -use crate::math::{Point, Vector}; -use crate::utils::WSign; - -pub fn local_support_point(cube: &Cuboid, local_dir: Vector<f32>) -> Point<f32> { - local_dir.copy_sign_to(cube.half_extents).into() -} - -// #[cfg(feature = "dim2")] -// pub fn polygon_ref( -// cuboid: Cuboid, -// out_vertices: &mut [Point<f32>; 4], -// out_normals: &mut [Vector<f32>; 4], -// ) -> PolygonRef { -// *out_vertices = [ -// Point::new(cuboid.half_extents.x, -cuboid.half_extents.y), -// Point::new(cuboid.half_extents.x, cuboid.half_extents.y), -// Point::new(-cuboid.half_extents.x, cuboid.half_extents.y), -// Point::new(-cuboid.half_extents.x, -cuboid.half_extents.y), -// ]; -// *out_normals = [Vector::x(), Vector::y(), -Vector::x(), -Vector::y()]; -// -// PolygonRef { -// vertices: &out_vertices[..], -// normals: &out_normals[..], -// } -// } - -#[cfg(feature = "dim2")] -pub fn vertex_feature_id(vertex: Point<f32>) -> u8 { - ((vertex.x.to_bits() >> 31) & 0b001 | (vertex.y.to_bits() >> 30) & 0b010) as u8 -} - -// #[cfg(feature = "dim3")] -// pub fn vertex_feature_id(vertex: Point<f32>) -> u8 { -// ((vertex.x.to_bits() >> 31) & 0b001 -// | (vertex.y.to_bits() >> 30) & 0b010 -// | (vertex.z.to_bits() >> 29) & 0b100) as u8 -// } - -#[cfg(feature = "dim3")] -pub fn polyhedron_support_face(cube: &Cuboid, local_dir: Vector<f32>) -> PolyhedronFace { - support_face(cube, local_dir).into() -} - -#[cfg(feature = "dim2")] -pub(crate) fn support_feature(cube: &Cuboid, local_dir: Vector<f32>) -> CuboidFeature { - // In 2D, it is best for stability to always return a face. - // It won't have any notable impact on performances anyway. - CuboidFeature::Face(support_face(cube, local_dir)) - - /* - let amax = local_dir.amax(); - - const MAX_DOT_THRESHOLD: f32 = 0.98480775301; // 10 degrees. - - if amax > MAX_DOT_THRESHOLD { - // Support face. - CuboidFeature::Face(cube.support_face(local_dir)) - } else { - // Support vertex - CuboidFeature::Vertex(cube.support_vertex(local_dir)) - } - */ -} - -#[cfg(feature = "dim3")] -pub(crate) fn support_feature(cube: &Cuboid, local_dir: Vector<f32>) -> CuboidFeature { - CuboidFeature::Face(support_face(cube, local_dir)) - /* - const MAX_DOT_THRESHOLD: f32 = crate::utils::COS_10_DEGREES; - const MIN_DOT_THRESHOLD: f32 = 1.0 - MAX_DOT_THRESHOLD; - - let amax = local_dir.amax(); - let amin = local_dir.amin(); - - if amax > MAX_DOT_THRESHOLD { - // Support face. - CuboidFeature::Face(support_face(cube, local_dir)) - } else if amin < MIN_DOT_THRESHOLD { - // Support edge. - CuboidFeature::Edge(support_edge(cube, local_dir)) - } else { - // Support vertex. - CuboidFeature::Vertex(support_vertex(cube, local_dir)) - } - */ -} - -// #[cfg(feature = "dim3")] -// pub(crate) fn support_vertex(cube: &Cuboid, local_dir: Vector<f32>) -> CuboidFeatureVertex { -// let vertex = local_support_point(cube, local_dir); -// let vid = vertex_feature_id(vertex); -// -// CuboidFeatureVertex { vertex, vid } -// } - -// #[cfg(feature = "dim3")] -// pub(crate) fn support_edge(cube: &Cuboid, local_dir: Vector<f32>) -> CuboidFeatureEdge { -// let he = cube.half_extents; -// let i = local_dir.iamin(); -// let j = (i + 1) % 3; -// let k = (i + 2) % 3; -// let mut a = Point::origin(); -// a[i] = he[i]; -// a[j] = local_dir[j].copy_sign_to(he[j]); -// a[k] = local_dir[k].copy_sign_to(he[k]); -// -// let mut b = a; -// b[i] = -he[i]; -// -// let vid1 = vertex_feature_id(a); -// let vid2 = vertex_feature_id(b); -// let eid = (vid1.max(vid2) << 3) | vid1.min(vid2) | 0b11_000_000; -// -// CuboidFeatureEdge { -// vertices: [a, b], -// vids: [vid1, vid2], -// eid, -// } -// } - -#[cfg(feature = "dim2")] -pub fn support_face(cube: &Cuboid, local_dir: Vector<f32>) -> CuboidFeatureFace { - let he = cube.half_extents; - let i = local_dir.iamin(); - let j = (i + 1) % 2; - let mut a = Point::origin(); - a[i] = he[i]; - a[j] = local_dir[j].copy_sign_to(he[j]); - - let mut b = a; - b[i] = -he[i]; - - let vid1 = vertex_feature_id(a); - let vid2 = vertex_feature_id(b); - let fid = (vid1.max(vid2) << 2) | vid1.min(vid2) | 0b11_00_00; - - CuboidFeatureFace { - vertices: [a, b], - vids: [vid1, vid2], - fid, - } -} - -#[cfg(feature = "dim3")] -pub(crate) fn support_face(cube: &Cuboid, local_dir: Vector<f32>) -> CuboidFeatureFace { - // NOTE: can we use the orthonormal basis of local_dir - // to make this AoSoA friendly? - let he = cube.half_extents; - let iamax = local_dir.iamax(); - let sign = local_dir[iamax].copy_sign_to(1.0); - - let vertices = match iamax { - 0 => [ - Point::new(he.x * sign, he.y, he.z), - Point::new(he.x * sign, -he.y, he.z), - Point::new(he.x * sign, -he.y, -he.z), - Point::new(he.x * sign, he.y, -he.z), - ], - 1 => [ - Point::new(he.x, he.y * sign, he.z), - Point::new(-he.x, he.y * sign, he.z), - Point::new(-he.x, he.y * sign, -he.z), - Point::new(he.x, he.y * sign, -he.z), - ], - 2 => [ - Point::new(he.x, he.y, he.z * sign), - Point::new(he.x, -he.y, he.z * sign), - Point::new(-he.x, -he.y, he.z * sign), - Point::new(-he.x, he.y, he.z * sign), - ], - _ => unreachable!(), - }; - - pub fn vid(i: u8) -> u8 { - // Each vertex has an even feature id. - i * 2 - } - - let sign_index = ((sign as i8 + 1) / 2) as usize; - // The vertex id as numbered depending on the sign of the vertex - // component. A + sign means the corresponding bit is 0 while a - - // sign means the corresponding bit is 1. - // For exampl the vertex [2.0, -1.0, -3.0] has the id 0b011 - let vids = match iamax { - 0 => [ - [vid(0b000), vid(0b010), vid(0b011), vid(0b001)], - [vid(0b100), vid(0b110), vid(0b111), vid(0b101)], - ][sign_index], - 1 => [ - [vid(0b000), vid(0b100), vid(0b101), vid(0b001)], - [vid(0b010), vid(0b110), vid(0b111), vid(0b011)], - ][sign_index], - 2 => [ - [vid(0b000), vid(0b010), vid(0b110), vid(0b100)], - [vid(0b001), vid(0b011), vid(0b111), vid(0b101)], - ][sign_index], - _ => unreachable!(), - }; - - // The feature ids of edges is obtained from the vertex ids - // of their endpoints. - // Assuming vid1 > vid2, we do: (vid1 << 3) | vid2 | 0b11000000 - // - let eids = match iamax { - 0 => [ - [0b11_010_000, 0b11_011_010, 0b11_011_001, 0b11_001_000], - [0b11_110_100, 0b11_111_110, 0b11_111_101, 0b11_101_100], - ][sign_index], - 1 => [ - [0b11_100_000, 0b11_101_100, 0b11_101_001, 0b11_001_000], - [0b11_110_010, 0b11_111_110, 0b11_111_011, 0b11_011_010], - ][sign_index], - 2 => [ - [0b11_010_000, 0b11_110_010, 0b11_110_100, 0b11_100_000], - [0b11_011_001, 0b11_111_011, 0b11_111_101, 0b11_101_001], - ][sign_index], - _ => unreachable!(), - }; - - // The face with normals [x, y, z] are numbered [10, 11, 12]. - // The face with negated normals are numbered [13, 14, 15]. - let fid = iamax + sign_index * 3 + 10; - - CuboidFeatureFace { - vertices, - vids, - eids, - fid: fid as u8, - } -} |
