-
Notifications
You must be signed in to change notification settings - Fork 24
/
plane.rs
92 lines (82 loc) · 2.75 KB
/
plane.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use cgmath::*;
use collision::*;
#[test]
fn test_from_points() {
assert_eq!(
Plane::from_points(
Point3::new(5.0f64, 0.0f64, 5.0f64),
Point3::new(5.0f64, 5.0f64, 5.0f64),
Point3::new(5.0f64, 0.0f64, -1.0f64),
),
Some(Plane::from_abcd(-1.0f64, 0.0f64, 0.0f64, 5.0f64))
);
assert_eq!(
Plane::from_points(
Point3::new(0.0f64, 5.0f64, -5.0f64),
Point3::new(0.0f64, 5.0f64, 0.0f64),
Point3::new(0.0f64, 5.0f64, 5.0f64),
),
None
); // The points are parallel
}
#[test]
fn test_ray_intersection() {
let p0 = Plane::from_abcd(1f64, 0f64, 0f64, -7f64);
let r0: Ray3<f64> = Ray::new(
Point3::new(2f64, 3f64, 4f64),
Vector3::new(1f64, 1f64, 1f64).normalize(),
);
assert!(p0.intersects(&r0));
assert_eq!(p0.intersection(&r0), Some(Point3::new(7f64, 8f64, 9f64)));
let p1 = Plane::from_points(
Point3::new(5f64, 0f64, 5f64),
Point3::new(5f64, 5f64, 5f64),
Point3::new(5f64, 0f64, -1f64),
)
.unwrap();
let r1: Ray3<f64> = Ray::new(
Point3::new(0f64, 0f64, 0f64),
Vector3::new(-1f64, 0f64, 0f64).normalize(),
);
assert_eq!(p1.intersection(&r1), None); // r1 points away from p1
assert!(!p1.intersects(&r1));
}
#[test]
fn test_plane2_intersection() {
let p0 = Plane::new(Vector3::unit_x(), 1.0f64);
let p1 = Plane::new(Vector3::unit_y(), 2.0f64);
let ray = p0.intersection(&p1);
assert!(ray.is_some());
assert!(p0.intersects(&p1));
let ray = ray.unwrap();
assert_ulps_eq!(ray.origin.x, &1.0f64);
assert_ulps_eq!(ray.origin.y, &2.0f64);
assert_ulps_eq!(ray.origin.z, &0.0f64);
assert_ulps_eq!(ray.direction.x, &0.0f64);
assert_ulps_eq!(ray.direction.y, &0.0f64);
assert_ulps_eq!(ray.direction.z, &1.0f64);
let p0 = Plane::new(Vector3::unit_y(), 1.0f64);
let p1 = Plane::new(Vector3::unit_y(), 2.0f64);
let ray = p0.intersection(&p1);
assert!(ray.is_none());
assert!(!p0.intersects(&p1));
}
#[test]
fn test_plane3_intersection() {
let p0 = Plane::new(Vector3::unit_x(), 1.0f64);
let p1 = Plane::new(Vector3::unit_y(), 2.0f64);
let p2 = Plane::new(Vector3::unit_z(), 3.0f64);
let point = p0.intersection(&(p1, p2));
assert!(point.is_some());
assert!(p0.intersects(&(p1, p2)));
let point = point.unwrap();
assert_ulps_eq!(point.x, &1.0f64);
assert_ulps_eq!(point.y, &2.0f64);
assert_ulps_eq!(point.z, &3.0f64);
let p0 = Plane::new(Vector3::unit_y(), 1.0f64);
let p1 = Plane::new(Vector3::unit_y(), 2.0f64);
let p2 = Plane::new(Vector3::unit_z(), 3.0f64);
let point = p0.intersection(&(p1, p2));
assert!(point.is_none());
assert!(!p0.intersects(&(p1, p2)));
}