use crate::*;
use crate::geometry::primitive::integer::*;
#[inline]
pub fn discrete_interval <I : Integer> (a : Interval <I>, b : Interval <I>) -> bool {
let (min_a, max_a) = (a.min(), a.max());
let (min_b, max_b) = (b.min(), b.max());
max_a >= min_b && min_a <= max_b
}
#[inline]
pub fn continuous_interval <I> (a : Interval <I>, b : Interval <I>)
-> Option <Interval <I>>
where I : Integer + std::fmt::Debug {
if discrete_interval (a, b) {
Some (
Interval::with_minmax (Ord::max (a.min(), b.min()), Ord::min (a.max(), b.max())))
} else {
None
}
}
#[inline]
pub fn discrete_aabb2_aabb2 <I : Integer> (a : Aabb2 <I>, b : Aabb2 <I>) -> bool {
let (min_a, max_a) = (a.min(), a.max());
let (min_b, max_b) = (b.min(), b.max());
max_a.0.x >= min_b.0.x && min_a.0.x <= max_b.0.x &&
max_a.0.y >= min_b.0.y && min_a.0.y <= max_b.0.y
}
#[inline]
pub fn continuous_aabb2_aabb2 <I> (a : Aabb2 <I>, b : Aabb2 <I>) -> Option <Aabb2 <I>>
where I : Integer + std::fmt::Debug
{
if discrete_aabb2_aabb2 (a, b) {
Some (
Aabb2::with_minmax (point2_max (a.min(), b.min()), point2_min (a.max(), b.max())))
} else {
None
}
}
#[inline]
pub fn discrete_aabb3_aabb3 <I : Integer> (a : Aabb3 <I>, b : Aabb3 <I>) -> bool {
let (min_a, max_a) = (a.min(), a.max());
let (min_b, max_b) = (b.min(), b.max());
max_a.0.x >= min_b.0.x && min_a.0.x <= max_b.0.x &&
max_a.0.y >= min_b.0.y && min_a.0.y <= max_b.0.y &&
max_a.0.z >= min_b.0.z && min_a.0.z <= max_b.0.z
}
#[inline]
pub fn continuous_aabb3_aabb3 <I> (a : Aabb3 <I>, b : Aabb3 <I>) -> Option <Aabb3 <I>>
where I : Integer + std::fmt::Debug
{
if discrete_aabb3_aabb3 (a, b) {
Some (
Aabb3::with_minmax (point3_max (a.min(), b.min()), point3_min (a.max(), b.max())))
} else {
None
}
}