ncollide3d/query/point/
point_bounding_sphere.rs

1use crate::bounding_volume::BoundingSphere;
2use crate::math::{Isometry, Point};
3use crate::query::{PointProjection, PointQuery};
4use crate::shape::{Ball, FeatureId};
5use na::RealField;
6
7impl<N: RealField + Copy> PointQuery<N> for BoundingSphere<N> {
8    #[inline]
9    fn project_point(&self, m: &Isometry<N>, pt: &Point<N>, solid: bool) -> PointProjection<N> {
10        let ls_pt = m.inverse_transform_point(pt) + (-self.center().coords);
11        let mut proj = Ball::new(self.radius()).project_point(&Isometry::identity(), &ls_pt, solid);
12
13        proj.point = m * proj.point + self.center().coords;
14
15        proj
16    }
17
18    #[inline]
19    fn project_point_with_feature(
20        &self,
21        m: &Isometry<N>,
22        pt: &Point<N>,
23    ) -> (PointProjection<N>, FeatureId) {
24        (self.project_point(m, pt, false), FeatureId::Face(0))
25    }
26
27    #[inline]
28    fn distance_to_point(&self, m: &Isometry<N>, pt: &Point<N>, solid: bool) -> N {
29        let ls_pt = m.inverse_transform_point(pt) + (-self.center().coords);
30
31        Ball::new(self.radius()).distance_to_point(&Isometry::identity(), &ls_pt, solid)
32    }
33
34    #[inline]
35    fn contains_point(&self, m: &Isometry<N>, pt: &Point<N>) -> bool {
36        let ls_pt = m.inverse_transform_point(pt) + (-self.center().coords);
37
38        Ball::new(self.radius()).contains_point(&Isometry::identity(), &ls_pt)
39    }
40}