ncollide3d/query/proximity/
proximity_ball_ball.rs

1use crate::math::Point;
2use crate::query::Proximity;
3use crate::shape::Ball;
4use na::{self, RealField};
5
6/// Proximity between balls.
7#[inline]
8pub fn proximity_ball_ball<N: RealField + Copy>(
9    center1: &Point<N>,
10    b1: &Ball<N>,
11    center2: &Point<N>,
12    b2: &Ball<N>,
13    margin: N,
14) -> Proximity {
15    assert!(
16        margin >= na::zero(),
17        "The proximity margin must be positive or null."
18    );
19
20    let r1 = b1.radius;
21    let r2 = b2.radius;
22    let delta_pos = *center2 - *center1;
23    let distance_squared = delta_pos.norm_squared();
24    let sum_radius = r1 + r2;
25    let sum_radius_with_error = sum_radius + margin;
26
27    if distance_squared <= sum_radius_with_error * sum_radius_with_error {
28        if distance_squared <= sum_radius * sum_radius {
29            Proximity::Intersecting
30        } else {
31            Proximity::WithinMargin
32        }
33    } else {
34        Proximity::Disjoint
35    }
36}