Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Circle-circle intersection points

How do I calculate the intersection points of two circles. I would expect there to be either two, one or no intersection points in all cases.

I have the x and y coordinates of the centre-point, and the radius for each circle.

An answer in python would be preferred, but any working algorithm would be acceptable.

like image 420
fmark Avatar asked Jul 28 '10 00:07

fmark


People also ask

At what point does each circle intersect circles?

Secant. The secant of a circle is a line or line segment that intersects the circle at two points.

Can two circles intersect at 4 points?

With the right viewpoint, any two distinct circles intersect in exactly four points, indeed any two distinct nondegenerate conics intersect in exactly four points. Like the circle of radius 2 and the hyperbola xy=1.

How do you find the point of intersection of three circles?

Using this method, find the intersection of any two circles, let's say (x,y) . Now the third circle will intersect at point x,y only if distance between its center and point x,y is equal to r . If distance(center,point) == r , then x,y is the intersection point.


2 Answers

Intersection of two circles

Written by Paul Bourke

The following note describes how to find the intersection point(s) between two circles on a plane, the following notation is used. The aim is to find the two points P3 = (x3, y3) if they exist.

Intersection of 2 circles

First calculate the distance d between the center of the circles. d = ||P1 - P0||.

  • If d > r0 + r1 then there are no solutions, the circles are separate.

  • If d < |r0 - r1| then there are no solutions because one circle is contained within the other.

  • If d = 0 and r0 = r1 then the circles are coincident and there are an infinite number of solutions.

Considering the two triangles P0P2P3 and P1P2P3 we can write

a2 + h2 = r02 and b2 + h2 = r12

Using d = a + b we can solve for a,

a = (r02 - r12 + d2 ) / (2 d)

It can be readily shown that this reduces to r0 when the two circles touch at one point, ie: d = r0 + r1 Solve for h by substituting a into the first equation, h2 = r02 - a2

So

P2 = P0 + a ( P1 - P0 ) / d

And finally, P3 = (x3,y3) in terms of P0 = (x0,y0), P1 = (x1,y1) and P2 = (x2,y2), is

x3 = x2 +- h ( y1 - y0 ) / d

y3 = y2 -+ h ( x1 - x0 ) / d

Source: http://paulbourke.net/geometry/circlesphere/

like image 135
Jacob Avatar answered Sep 19 '22 10:09

Jacob


Here is my C++ implementation based on Paul Bourke's article. It only works if there are two intersections, otherwise it probably returns NaN NAN NAN NAN.

class Point{     public:         float x, y;         Point(float px, float py) {             x = px;             y = py;         }         Point sub(Point p2) {             return Point(x - p2.x, y - p2.y);         }         Point add(Point p2) {             return Point(x + p2.x, y + p2.y);         }         float distance(Point p2) {             return sqrt((x - p2.x)*(x - p2.x) + (y - p2.y)*(y - p2.y));         }         Point normal() {             float length = sqrt(x*x + y*y);             return Point(x/length, y/length);         }         Point scale(float s) {             return Point(x*s, y*s);         } };  class Circle {     public:         float x, y, r, left;         Circle(float cx, float cy, float cr) {             x = cx;             y = cy;             r = cr;             left = x - r;         }         pair<Point, Point> intersections(Circle c) {             Point P0(x, y);             Point P1(c.x, c.y);             float d, a, h;             d = P0.distance(P1);             a = (r*r - c.r*c.r + d*d)/(2*d);             h = sqrt(r*r - a*a);             Point P2 = P1.sub(P0).scale(a/d).add(P0);             float x3, y3, x4, y4;             x3 = P2.x + h*(P1.y - P0.y)/d;             y3 = P2.y - h*(P1.x - P0.x)/d;             x4 = P2.x - h*(P1.y - P0.y)/d;             y4 = P2.y + h*(P1.x - P0.x)/d;              return pair<Point, Point>(Point(x3, y3), Point(x4, y4));         }  }; 
like image 31
robert king Avatar answered Sep 21 '22 10:09

robert king