hexasphere/
interpolation.rs1use crate::math::{acos, sin as sinf, sqrt};
2use glam::f32::Vec3A;
3pub fn geometric_slerp(a: Vec3A, b: Vec3A, p: f32) -> Vec3A {
11 let angle = acos(a.dot(b));
12
13 let sin = sinf(angle).recip();
14 a * (sinf((1.0 - p) * angle) * sin) + b * (sinf(p * angle) * sin)
15}
16
17pub fn geometric_slerp_half(a: Vec3A, b: Vec3A) -> Vec3A {
24 (a + b) * sqrt(2.0 * (1.0 + a.dot(b))).recip()
25}
26
27pub fn geometric_slerp_multiple(a: Vec3A, b: Vec3A, indices: &[u32], points: &mut [Vec3A]) {
36 let angle = acos(a.dot(b));
37 let sin = sinf(angle).recip();
38
39 for (percent, index) in indices.iter().enumerate() {
40 let percent = (percent + 1) as f32 / (indices.len() + 1) as f32;
41
42 points[*index as usize] =
43 a * (sinf((1.0 - percent) * angle) * sin) + b * (sinf(percent * angle) * sin);
44 }
45}
46
47pub fn normalized_lerp(a: Vec3A, b: Vec3A, p: f32) -> Vec3A {
53 ((1.0 - p) * a + p * b).normalize()
54}
55
56pub fn normalized_lerp_half(a: Vec3A, b: Vec3A) -> Vec3A {
60 (a + b).normalize()
61}
62
63pub fn normalized_lerp_multiple(a: Vec3A, b: Vec3A, indices: &[u32], points: &mut [Vec3A]) {
69 for (percent, index) in indices.iter().enumerate() {
70 let percent = (percent + 1) as f32 / (indices.len() + 1) as f32;
71
72 points[*index as usize] = ((1.0 - percent) * a + percent * b).normalize();
73 }
74}
75
76pub fn lerp(a: Vec3A, b: Vec3A, p: f32) -> Vec3A {
80 (1.0 - p) * a + p * b
81}
82
83pub fn lerp_half(a: Vec3A, b: Vec3A) -> Vec3A {
87 (a + b) * 0.5
88}
89
90pub fn lerp_multiple(a: Vec3A, b: Vec3A, indices: &[u32], points: &mut [Vec3A]) {
96 for (percent, index) in indices.iter().enumerate() {
97 let percent = (percent + 1) as f32 / (indices.len() + 1) as f32;
98
99 points[*index as usize] = (1.0 - percent) * a + percent * b;
100 }
101}