Skip to content

Commit 02ca597

Browse files
committed
- add ray vs sphere test
1 parent abecc97 commit 02ca597

File tree

2 files changed

+69
-1
lines changed

2 files changed

+69
-1
lines changed

src/lib.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1328,7 +1328,6 @@ pub fn map_to_range<T: Float, X: Base<T>>(v: X, in_start: X, in_end: X, out_star
13281328

13291329
// TODO: tests
13301330
// missing fail cases
1331-
// ray sphere (test)
13321331
// ray triangle (test)
13331332
// projection, ndc
13341333
// projection, sc

tests/tests.rs

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2443,6 +2443,75 @@ fn ray_vs_obb_test() {
24432443
assert_eq!(approx(result.unwrap(), vec3f(6.33623, -4.17592, 2.52359), 0.0001), true);
24442444
}
24452445

2446+
#[test]
2447+
fn ray_vs_sphere_test() {
2448+
let sp = Vec3f::zero();
2449+
let r = 100.0;
2450+
2451+
// hit w/ intersection point
2452+
let rp = Vec3f::new(0.0, 0.0, -1000.0);
2453+
let rv = Vec3f::unit_z();
2454+
let result = ray_vs_sphere(rp, rv, sp, r);
2455+
assert_eq!(result.is_some(), true);
2456+
if let Some(ip) = result {
2457+
assert_eq!(ip, Vec3f::new(0.0, 0.0, -100.0));
2458+
}
2459+
2460+
let rp = Vec3f::new(0.0, 0.0, 1000.0);
2461+
let rv = -Vec3f::unit_z();
2462+
let result = ray_vs_sphere(rp, rv, sp, r);
2463+
assert_eq!(result.is_some(), true);
2464+
if let Some(ip) = result {
2465+
assert_eq!(ip, Vec3f::new(0.0, 0.0, 100.0));
2466+
}
2467+
2468+
let rp = Vec3f::new(-500.0, 0.0, 0.0);
2469+
let rv = Vec3f::unit_x();
2470+
let result = ray_vs_sphere(rp, rv, sp, r);
2471+
assert_eq!(result.is_some(), true);
2472+
if let Some(ip) = result {
2473+
assert_eq!(ip, Vec3f::new(-100.0, 0.0, 0.0));
2474+
}
2475+
2476+
let rp = Vec3f::new(500.0, 0.0, 0.0);
2477+
let rv = -Vec3f::unit_x();
2478+
let result = ray_vs_sphere(rp, rv, sp, r);
2479+
assert_eq!(result.is_some(), true);
2480+
if let Some(ip) = result {
2481+
assert_eq!(ip, Vec3f::new(100.0, 0.0, 0.0));
2482+
}
2483+
2484+
// misses around axis
2485+
// +
2486+
// - 0 +
2487+
// -
2488+
let rp = Vec3f::new(101.0, 0.0, -1000.0);
2489+
let rv = Vec3f::unit_z();
2490+
let result = ray_vs_sphere(rp, rv, sp, r);
2491+
assert_eq!(result.is_none(), true);
2492+
2493+
let rp = Vec3f::new(-101.0, 0.0, -1000.0);
2494+
let rv = Vec3f::unit_z();
2495+
let result = ray_vs_sphere(rp, rv, sp, r);
2496+
assert_eq!(result.is_none(), true);
2497+
2498+
let rp = Vec3f::new(0.0, -101.0, -1000.0);
2499+
let rv = Vec3f::unit_z();
2500+
let result = ray_vs_sphere(rp, rv, sp, r);
2501+
assert_eq!(result.is_none(), true);
2502+
2503+
let rp = Vec3f::new(0.0, 101.0, -1000.0);
2504+
let rv = Vec3f::unit_z();
2505+
let result = ray_vs_sphere(rp, rv, sp, r);
2506+
assert_eq!(result.is_none(), true);
2507+
2508+
// hits, not testing intersection points
2509+
let rp = Vec3f::new(10.0, 1000.0, -1000.0);
2510+
let rv = normalize(Vec3f::unit_z() + (-Vec3f::unit_y()));
2511+
let result = ray_vs_sphere(rp, rv, sp, r);
2512+
assert_eq!(result.is_some(), true);
2513+
}
2514+
24462515
#[test]
24472516
fn sphere_vs_frustum_test() {
24482517
let planes = Mat4f::new(

0 commit comments

Comments
 (0)