use std::marker::PhantomData; use alga::general::Id; use na; use bounding_volume::AABB; use partitioning::BVTCostFn; use shape::{CompositeShape, Shape}; use query::distance_internal; use query::PointQuery; use math::{Isometry, Point}; /// Smallest distance between a composite shape and any other shape. pub fn composite_shape_against_shape
( m1: &M, g1: &G1, m2: &M, g2: &Shape
, ) -> P::Real where P: Point, M: Isometry
, G1: CompositeShape
, { let mut cost_fn = CompositeShapeAgainstAnyDistCostFn::new(m1, g1, m2, g2); g1.bvt() .best_first_search(&mut cost_fn) .map(|(_, res)| res) .expect("The composite shape must not be empty.") } /// Smallest distance between a shape and a composite shape. pub fn shape_against_composite_shape
( m1: &M, g1: &Shape
, m2: &M, g2: &G2, ) -> P::Real where P: Point, M: Isometry
, G2: CompositeShape
, { composite_shape_against_shape(m2, g2, m1, g1) } struct CompositeShapeAgainstAnyDistCostFn<'a, P: 'a + Point, M: 'a, G1: ?Sized + 'a> { msum_shift: P::Vector, msum_margin: P::Vector, m1: &'a M, g1: &'a G1, m2: &'a M, g2: &'a Shape
, point_type: PhantomData
, } impl<'a, P, M, G1: ?Sized> CompositeShapeAgainstAnyDistCostFn<'a, P, M, G1> where P: Point, M: Isometry
, G1: CompositeShape
, { pub fn new( m1: &'a M, g1: &'a G1, m2: &'a M, g2: &'a Shape
,
) -> CompositeShapeAgainstAnyDistCostFn<'a, P, M, G1> {
let ls_m2 = na::inverse(m1) * m2.clone();
let ls_aabb2 = g2.aabb(&ls_m2);
CompositeShapeAgainstAnyDistCostFn {
msum_shift: -ls_aabb2.center().coordinates(),
msum_margin: ls_aabb2.half_extents(),
m1: m1,
g1: g1,
m2: m2,
g2: g2,
point_type: PhantomData,
}
}
}
impl<'a, P, M, G1: ?Sized> BVTCostFn ,
G1: CompositeShape ,
{
type UserData = P::Real;
#[inline]
fn compute_bv_cost(&mut self, bv: &AABB ) -> Option