Skip to main content

brep_render/
geometry3d.rs

1//! Shared three-dimensional vector operations.
2
3pub fn norm3(v: [f64; 3]) -> [f64; 3] {
4    let len = (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]).sqrt();
5    if len <= 0.0 {
6        return [0.0, 0.0, 1.0];
7    }
8    [v[0] / len, v[1] / len, v[2] / len]
9}
10
11pub fn cross3(a: [f64; 3], b: [f64; 3]) -> [f64; 3] {
12    [
13        a[1] * b[2] - a[2] * b[1],
14        a[2] * b[0] - a[0] * b[2],
15        a[0] * b[1] - a[1] * b[0],
16    ]
17}
18
19pub fn dot3(a: [f64; 3], b: [f64; 3]) -> f64 {
20    a[0] * b[0] + a[1] * b[1] + a[2] * b[2]
21}
22
23pub fn sub3(a: [f64; 3], b: [f64; 3]) -> [f64; 3] {
24    [a[0] - b[0], a[1] - b[1], a[2] - b[2]]
25}
26
27pub fn add3(a: [f64; 3], b: [f64; 3]) -> [f64; 3] {
28    [a[0] + b[0], a[1] + b[1], a[2] + b[2]]
29}
30
31pub fn scale3(a: [f64; 3], s: f64) -> [f64; 3] {
32    [a[0] * s, a[1] * s, a[2] * s]
33}
34
35pub fn len3(a: [f64; 3]) -> f64 {
36    dot3(a, a).sqrt()
37}
38
39/// Rotate `v` around unit `axis` by `angle` (Rodrigues).
40pub fn rotate3(v: [f64; 3], axis: [f64; 3], angle: f64) -> [f64; 3] {
41    let (sin, cos) = angle.sin_cos();
42    let cross = cross3(axis, v);
43    let dot = dot3(axis, v);
44    [
45        v[0] * cos + cross[0] * sin + axis[0] * dot * (1.0 - cos),
46        v[1] * cos + cross[1] * sin + axis[1] * dot * (1.0 - cos),
47        v[2] * cos + cross[2] * sin + axis[2] * dot * (1.0 - cos),
48    ]
49}