use crate::{
geometry::{
Coordinate, Coordinates,
mesh::{Connectivity, Mesh, Tessellation},
},
math::assert::AssertionError,
};
use std::f64::consts::{PI, TAU};
pub const CONNECTIVITY: [[usize; 3]; 12] = [
[0, 2, 1],
[0, 3, 2],
[4, 5, 6],
[4, 6, 7],
[0, 1, 5],
[0, 5, 4],
[3, 6, 2],
[3, 7, 6],
[0, 4, 7],
[0, 7, 3],
[1, 2, 6],
[1, 6, 5],
];
pub const COORDINATES: [Coordinate<3>; 8] = [
Coordinate::const_from([0.0, 0.0, 0.0]),
Coordinate::const_from([1.0, 0.0, 0.0]),
Coordinate::const_from([1.0, 1.0, 0.0]),
Coordinate::const_from([0.0, 1.0, 0.0]),
Coordinate::const_from([0.0, 0.0, 1.0]),
Coordinate::const_from([1.0, 0.0, 1.0]),
Coordinate::const_from([1.0, 1.0, 1.0]),
Coordinate::const_from([0.0, 1.0, 1.0]),
];
pub fn mesh() -> Mesh<3> {
let connectivities = vec![Connectivity::Triangular(CONNECTIVITY.to_vec().into())];
let coordinates = Coordinates::from(COORDINATES);
Mesh::from((connectivities, coordinates))
}
pub fn sphere(stacks: usize, slices: usize, radius: f64) -> Tessellation {
let mut points = vec![[0.0, 0.0, radius]];
for i in 1..=stacks {
let theta = PI * i as f64 / (stacks + 1) as f64;
for j in 0..slices {
let phi = TAU * j as f64 / slices as f64;
points.push([
radius * theta.sin() * phi.cos(),
radius * theta.sin() * phi.sin(),
radius * theta.cos(),
]);
}
}
let south = points.len();
points.push([0.0, 0.0, -radius]);
let ring_start = |i: usize| 1 + (i - 1) * slices;
let mut faces = Vec::new();
for j in 0..slices {
faces.push([0, ring_start(1) + j, ring_start(1) + (j + 1) % slices]);
}
for i in 1..stacks {
for j in 0..slices {
let (a, b) = (ring_start(i) + j, ring_start(i + 1) + j);
let (c, d) = (
ring_start(i + 1) + (j + 1) % slices,
ring_start(i) + (j + 1) % slices,
);
faces.push([a, b, c]);
faces.push([a, c, d]);
}
}
for j in 0..slices {
faces.push([
south,
ring_start(stacks) + (j + 1) % slices,
ring_start(stacks) + j,
]);
}
let coordinates = Coordinates::from(points);
let connectivities = vec![Connectivity::Triangular(faces.into())];
Tessellation::from(Mesh::from((connectivities, coordinates)))
}
pub fn mesh_with_node_sets() -> Mesh<3> {
let mut mesh = mesh();
mesh.set_node_sets(vec![vec![0, 1], vec![2, 3]].into());
mesh
}
#[test]
fn connectivity_coordinates() -> Result<(), AssertionError> {
let _ = mesh();
Ok(())
}