Skip to content

Commit 957c887

Browse files
committed
slightly faster formula
1 parent 017dcf3 commit 957c887

File tree

1 file changed

+21
-22
lines changed

1 file changed

+21
-22
lines changed

src_c/collisions.c

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -593,36 +593,35 @@ static int
593593
pgIntersection_CircleCircle(pgCircleBase *A, pgCircleBase *B,
594594
double *intersections)
595595
{
596-
double x1 = A->x;
597-
double y1 = A->y;
598-
double r1 = A->r;
599-
double x2 = B->x;
600-
double y2 = B->y;
601-
double r2 = B->r;
602-
603-
if (x1 == x2 && y1 == y2 && r1 == r2)
596+
double dx = B->x - A->x;
597+
double dy = B->y - A->y;
598+
double d2 = dx * dx + dy * dy;
599+
double r_sum = A->r + B->r;
600+
double r_diff = A->r - B->r;
601+
double r_sum2 = r_sum * r_sum;
602+
double r_diff2 = r_diff * r_diff;
603+
604+
if (d2 > r_sum2 || d2 < r_diff2) {
604605
return 0;
606+
}
605607

606-
double dx = x2 - x1;
607-
double dy = y2 - y1;
608-
double d = sqrt(dx * dx + dy * dy);
609-
610-
if (d > r1 + r2 || d < fabs(r1 - r2)) {
608+
if (d2 == 0 && A->r == B->r) {
611609
return 0;
612610
}
613611

614-
double a = (r1 * r1 - r2 * r2 + d * d) / (2 * d);
615-
double h = sqrt(r1 * r1 - a * a);
612+
double d = sqrt(d2);
613+
double a = (d2 + A->r * A->r - B->r * B->r) / (2 * d);
614+
double h = sqrt(A->r * A->r - a * a);
616615

617-
double xm = x1 + a * (x2 - x1) / d;
618-
double ym = y1 + a * (y2 - y1) / d;
616+
double xm = A->x + a * (dx / d);
617+
double ym = A->y + a * (dy / d);
619618

620-
double xs1 = xm + h * (y2 - y1) / d;
621-
double ys1 = ym - h * (x2 - x1) / d;
622-
double xs2 = xm - h * (y2 - y1) / d;
623-
double ys2 = ym + h * (x2 - x1) / d;
619+
double xs1 = xm + h * (dy / d);
620+
double ys1 = ym - h * (dx / d);
621+
double xs2 = xm - h * (dy / d);
622+
double ys2 = ym + h * (dx / d);
624623

625-
if (d == r1 + r2 || d == fabs(r1 - r2)) {
624+
if (d2 == r_sum2 || d2 == r_diff2) {
626625
intersections[0] = xs1;
627626
intersections[1] = ys1;
628627
return 1;

0 commit comments

Comments
 (0)