use glam::Vec3;
#[inline(always)]
pub fn modifier_revolution(p: Vec3, offset: f32) -> Vec3 {
let q = p.x.hypot(p.z) - offset;
Vec3::new(q, p.y, 0.0)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_revolution_on_axis() {
let p = Vec3::new(0.0, 1.0, 0.0);
let r = modifier_revolution(p, 2.0);
assert!((r.x - (-2.0)).abs() < 0.001);
assert!((r.y - 1.0).abs() < 0.001);
assert_eq!(r.z, 0.0);
}
#[test]
fn test_revolution_at_offset() {
let p = Vec3::new(2.0, 1.0, 0.0);
let r = modifier_revolution(p, 2.0);
assert!(r.x.abs() < 0.001);
assert!((r.y - 1.0).abs() < 0.001);
}
#[test]
fn test_revolution_rotational_symmetry() {
let p1 = Vec3::new(3.0, 0.0, 0.0);
let p2 = Vec3::new(0.0, 0.0, 3.0);
let p3 = Vec3::new(2.121, 0.0, 2.121); let offset = 1.0;
let r1 = modifier_revolution(p1, offset);
let r2 = modifier_revolution(p2, offset);
let r3 = modifier_revolution(p3, offset);
assert!((r1.x - r2.x).abs() < 0.001);
assert!((r1.x - r3.x).abs() < 0.01);
}
}