+ {
+ double qpxr = (v1.x * r.y) - (r.x * v1.y);
+
+ // Lines are parallel, so no intersection...
+ if (qpxr != 0)
+ return;
+
+ // Check to see which endpoints are connected... Four possibilities:
+ if (l1->p[0] == l2->p[0])
+ t = 0, u = 0;
+ else if (l1->p[0] == l2->p[1])
+ t = 0, u = 1.0;
+ else if (l1->p[1] == l2->p[0])
+ t = 1.0, u = 0;
+ else if (l1->p[1] == l2->p[1])
+ t = 1.0, u = 1.0;
+ else
+ return;
+ }
+ else
+ {
+ t = ((v1.x * s.y) - (s.x * v1.y)) / rxs;
+ u = ((v1.x * r.y) - (r.x * v1.y)) / rxs;
+ }
+
+ Global::intersectParam[0] = t;
+ Global::intersectParam[1] = u;
+
+ // If the parameters are in range, we have overlap!
+ if ((t >= 0) && (t <= 1.0) && (u >= 0) && (u <= 1.0))
+ Global::numIntersectParams = 1;
+}
+
+
+void Geometry::CheckCircleToCircleIntersection(Object * c1, Object * c2)
+{
+ // Set up global vars
+ Global::numIntersectPoints = Global::numIntersectParams = 0;
+
+ // Get the distance between the centers of the circles
+ Vector centerLine(c1->p[0], c2->p[0]);
+ double d = centerLine.Magnitude();
+ double clAngle = centerLine.Angle();
+
+ // If the distance between centers is greater than the sum of the radii or
+ // less than the difference between the radii, there is NO intersection
+ if ((d > (c1->radius[0] + c2->radius[0]))
+ || (d < fabs(c1->radius[0] - c2->radius[0])))
+ return;
+
+ // If the distance between centers is equal to the sum of the radii or
+ // equal to the difference between the radii, the intersection is tangent
+ // to both circles.
+ if (d == (c1->radius[0] + c2->radius[0]))
+ {
+ Global::intersectPoint[0].x = c1->p[0].x + (cos(clAngle) * c1->radius[0]);
+ Global::intersectPoint[0].y = c1->p[0].y + (sin(clAngle) * c1->radius[0]);
+ Global::numIntersectPoints = 1;
+ return;
+ }
+ else if (d == fabs(c1->radius[0] - c2->radius[0]))
+ {
+ double sign = (c1->radius[0] > c2->radius[0] ? +1 : -1);
+ Global::intersectPoint[0].x = c1->p[0].x + (cos(clAngle) * c1->radius[0] * sign);
+ Global::intersectPoint[0].y = c1->p[0].y + (sin(clAngle) * c1->radius[0] * sign);
+ Global::numIntersectPoints = 1;
+ return;
+ }