Circle-circle intersection points

后端 未结 5 2179
醉话见心
醉话见心 2020-11-29 18:59

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 coo

5条回答
  •  旧时难觅i
    2020-11-29 19:24

    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 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(x3, y3), Point(x4, y4));
            }
    
    };
    

提交回复
热议问题