@@ -593,36 +593,35 @@ static int
593
593
pgIntersection_CircleCircle (pgCircleBase * A , pgCircleBase * B ,
594
594
double * intersections )
595
595
{
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 ) {
604
605
return 0 ;
606
+ }
605
607
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 ) {
611
609
return 0 ;
612
610
}
613
611
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 );
616
615
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 ) ;
619
618
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 ) ;
624
623
625
- if (d == r1 + r2 || d == fabs ( r1 - r2 ) ) {
624
+ if (d2 == r_sum2 || d2 == r_diff2 ) {
626
625
intersections [0 ] = xs1 ;
627
626
intersections [1 ] = ys1 ;
628
627
return 1 ;
0 commit comments