diff --git a/src/cgmath/aabb.rs b/src/cgmath/aabb.rs index c41075c..5e8ff65 100644 --- a/src/cgmath/aabb.rs +++ b/src/cgmath/aabb.rs @@ -16,16 +16,37 @@ //! Axis-aligned bounding boxes use point::{Point2, Point3}; -use vector::{Vec2, Vec3}; #[deriving(Clone, Eq)] pub struct Aabb2 { - center: Point2, - size: Vec2, + min: Point2, + max: Point2, +} + +impl Aabb2 { + /// Construct a new axis-aligned bounding box from two points. + #[inline] + pub fn new(p1: &Point2, p2: &Point2) -> Aabb2 { + Aabb2 { + min: Point2::new(p1.x.min(&p2.x), p1.y.min(&p2.y)), + max: Point2::new(p1.x.max(&p2.x), p1.y.max(&p2.y)), + } + } } #[deriving(Clone, Eq)] pub struct Aabb3 { - center: Point3, - size: Vec3, + min: Point3, + max: Point3, +} + +impl Aabb3 { + /// Construct a new axis-aligned bounding box from two points. + #[inline] + pub fn new(p1: &Point3, p2: &Point3) -> Aabb3 { + Aabb3 { + min: Point3::new(p1.x.min(&p2.x), p1.y.min(&p2.y), p1.z.min(&p2.z)), + max: Point3::new(p1.x.max(&p2.x), p1.y.max(&p2.y), p1.z.max(&p2.z)), + } + } } diff --git a/src/test/aabb.rs b/src/test/aabb.rs new file mode 100644 index 0000000..ccbe832 --- /dev/null +++ b/src/test/aabb.rs @@ -0,0 +1,13 @@ +use cgmath::aabb::{Aabb2, Aabb3}; +use cgmath::point::{Point2, Point3}; + +#[test] +fn test_aabb() { + let aabb = Aabb2::new(&Point2::new(-20f64, 30f64), &Point2::new(10f64, -10f64)); + assert_eq!(aabb.min, Point2::new(-20f64, -10f64)); + assert_eq!(aabb.max, Point2::new(10f64, 30f64)); + + let aabb = Aabb3::new(&Point3::new(-20f64, 30f64, 0f64), &Point3::new(10f64, -10f64, -5f64)); + assert_eq!(aabb.min, Point3::new(-20f64, -10f64, -5f64)); + assert_eq!(aabb.max, Point3::new(10f64, 30f64, 0f64)); +} diff --git a/src/test/test.rs b/src/test/test.rs index ce88552..4acd643 100644 --- a/src/test/test.rs +++ b/src/test/test.rs @@ -32,7 +32,7 @@ pub mod transform; // pub mod projection; -// pub mod aabb; +pub mod aabb; // pub mod cylinder; // pub mod frustum; // pub mod intersect;