Skip to main content

oxiphysics_geometry/implicit_geometry/
sdfhexagonalprism_traits.rs

1//! # SdfHexagonalPrism - Trait Implementations
2//!
3//! This module contains trait implementations for `SdfHexagonalPrism`.
4//!
5//! ## Implemented Traits
6//!
7//! - `Sdf`
8//!
9//! 🤖 Generated with [SplitRS](https://github.com/cool-japan/splitrs)
10
11#[allow(unused_imports)]
12use super::functions::*;
13#[allow(unused_imports)]
14use super::functions::*;
15use super::types::SdfHexagonalPrism;
16
17impl Sdf for SdfHexagonalPrism {
18    fn dist(&self, p: [f64; 3]) -> f64 {
19        let k0 = -3.0_f64.sqrt() / 2.0;
20        let k1 = 0.5_f64;
21        let k2 = 1.0_f64 / 3.0_f64.sqrt();
22        let qa = [p[0].abs(), p[2].abs()];
23        let dot_val = 2.0_f64.min(0.0_f64.max(k0 * qa[0] + k1 * qa[1]));
24        let qx = qa[0] - 2.0 * k0 * dot_val;
25        let qz = qa[1] - 2.0 * k1 * dot_val;
26        let ex = qx - clamp_f(qx, -k2 * self.radius, k2 * self.radius);
27        let ez = qz - self.radius;
28        let d_xz = len2([ex, ez]) * if qz > self.radius { 1.0 } else { -1.0 };
29        let d_y = p[1].abs() - self.half_height;
30        let d_xz_pos = d_xz.max(0.0);
31        let d_y_pos = d_y.max(0.0);
32        len2([d_xz_pos, d_y_pos]) + d_xz.min(0.0).max(d_y.min(0.0))
33    }
34}