#[macro_use]
extern crate approx;
extern crate cgmath;
extern crate collision;
use cgmath::*;
use collision::*;
#[test]
fn test_intersection() {
let sphere = Sphere {
center: Point3::new(0f64, 0f64, 0f64),
radius: 1f64,
};
let r0 = Ray::new(Point3::new(0f64, 0f64, 5f64),
Vector3::new(0f64, 0f64, -5f64).normalize());
let r1 = Ray::new(Point3::new(1f64.cos(), 0f64, 5f64),
Vector3::new(0f64, 0f64, -5f64).normalize());
let r2 = Ray::new(Point3::new(1f64, 0f64, 5f64),
Vector3::new(0f64, 0f64, -5f64).normalize());
let r3 = Ray::new(Point3::new(2f64, 0f64, 5f64),
Vector3::new(0f64, 0f64, -5f64).normalize());
assert_eq!((sphere, r0).intersection(),
Some(Point3::new(0f64, 0f64, 1f64)));
assert_ulps_eq!((sphere, r1).intersection().unwrap(),
&Point3::new(1f64.cos(), 0f64, 1f64.sin()));
assert_eq!((sphere, r2).intersection(),
Some(Point3::new(1f64, 0f64, 0f64)));
assert_eq!((sphere, r3).intersection(), None);
}
#[test]
fn test_bound() {
let point = Point3::new(1f32, 2.0, 3.0);
let sphere = Sphere {
center: point,
radius: 1.0,
};
let normal = vec3(0f32, 0.0, 1.0);
assert_eq!(sphere.relate_plane(Plane::from_point_normal(point, normal)),
Relation::Cross);
assert_eq!(sphere.relate_plane(Plane::from_point_normal(point + normal * -3.0, normal)),
Relation::In);
assert_eq!(sphere.relate_plane(Plane::from_point_normal(point + normal * 3.0, normal)),
Relation::Out);
}