C/C++求解两圆交点源代码

前段时间用到了圆定位算法,通过求其交点算出定位坐标,网上找了许久也没找到一个心仪的算法,索性自己写,下面是源代码,亲测无bug,喜欢的小伙伴可以参考一下。需要源文件的可以q我 442499086
#include "iostream"

#define square(val) ((val) * (val))
#define equal(c1, c2) (((c1.axis.x) == (c2.axis.x)) && ((c1.axis.y) == (c2.axis.y)) && ((c1.r) == (c2.r)))
#define yequal(c1, c2) ((c1.axis.y) == (c2.axis.y))
#define xequal(c1, c2) ((c1.axis.x) == (c2.axis.x))

typedef struct
{
    double x;
    double y;
}CircleAxis;

typedef struct
{
    CircleAxis axis;
    double r;
}Circle;

typedef struct
{
    CircleAxis axis[2];
}*PCircularIntersection, CircularIntersection;


int GetIntersectionPointCoordinate(PCircularIntersection ci, Circle c1, Circle c2);

int main()
{
    using namespace std;
    CircularIntersection ci;
    Circle c1, c2;
    c1.r = 4;
    c1.axis.x = 0;
    c1.axis.y = 0;

    c2.r = 4;
    c2.axis.x = 2;
    c2.axis.y = 0;

    GetIntersectionPointCoordinate(&ci, c1, c2);
    
    cout << "IntersectionPointCoordinate: " << endl;
    cout << "x1:" <<  ci.axis[0].x << " " << "y1:" << ci.axis[0].y << endl;
    cout << "x2:" <<  ci.axis[1].x << " " << "y2:" << ci.axis[1].y << endl;
    return 0;
}

int GetIntersectionPointCoordinate(PCircularIntersection ci, Circle c1, Circle c2)
{
    double error, A, B, C, K, S, x1, y1, x2, y2, x, y;
    if (equal(c1, c2) || ci == NULL)
        return 0;
    else
    {
        if (yequal(c1, c2))
        {
            x = (square((c1.axis.x)) + square((c1.axis.y)) + square((c2.r)) - square((c2.axis.x)) - square((c2.axis.y)) - square((c1.r))) / (2 * (c1.axis.x) - 2 * (c2.axis.x));
            A = 1;
            B = (-2) *  (c1.axis.y);
            C = square(x) + square((c1.axis.x)) + square((c1.axis.y)) - square((c1.r)) - 2 * (c1.axis.x)*x;
            error = square(B) - 4 * A*C;

            if (error < 0)
                return -1;
            else
            {
                x1 = x2 = x;
                y1 = ((-B) + sqrt(error)) / (2 * A);
                y2 = ((-B) - sqrt(error)) / (2 * A);
            }
        }
        else
            if (xequal(c1, c2))
            {
                y = (square((c1.axis.x)) + square((c1.axis.y)) + square((c2.r)) - square((c2.axis.x)) - square((c2.axis.y)) - square((c1.r))) / (2 * (c1.axis.y) - 2 * (c2.axis.y));
                A = 1;
                B = (-2) * (c1.axis.x);
                C = square((c1.axis.x)) + square((c1.axis.y)) + square(y) - square((c1.r)) - 2 * y* (c1.axis.y);
                error = square(B) - 4 * A*C;

                if (error < 0)
                    return -1;
                else
                {
                    y1 = y2 = y;
                    x1 = ((-B) + sqrt(error)) / (2 * A);
                    x2 = ((-B) - sqrt(error)) / (2 * A);
                }
            }
            else
            {
                K = (2 * (c2.axis.x) - 2 * (c1.axis.x)) / (2 * (c1.axis.y) - 2 * (c2.axis.y));
                S = (square((c1.axis.x)) + square((c1.axis.y)) + square((c2.r)) - square((c2.axis.x)) - square((c2.axis.y)) - square((c1.r))) / (2 * (c1.axis.y) - 2 * (c2.axis.y));

                //解二次方程
                A = (1 + square(K));
                B = 2 * K*S - 2 * (c1.axis.x) - 2 * (c1.axis.y)*K;
                C = square(S) + square((c1.axis.x)) + square((c1.axis.y)) - square((c1.r)) - 2 * (c1.axis.y)*S;
                error = square(B) - 4 * A*C;

                if (error < 0)
                    return -1;
                else
                {
                    x1 = ((-B) + sqrt(error)) / (2 * A);
                    x2 = ((-B) - sqrt(error)) / (2 * A);
                    y1 = K * x1 + S;
                    y2 = K * x2 + S;
                }
            }
        ci->axis[0].x = x1;
        ci->axis[0].y = y1;

        ci->axis[1].x = x2;
        ci->axis[1].y = y2;
        return 1;
    }
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Visual C/C++ 编程精选集锦源代码是一个涵盖了多个不同领域的精选代码集。其中包括了图形界面设计、算法实现、数据结构、网络编程等等方面的代码。这些源代码通过精心筛选,可以帮助程序员们更好地理解和学习这些领域的编程技术。 在图形界面设计方面,这个集锦中包括了一些常用的界面设计方法和技巧,比如窗口创建、控件布局、事件处理等方面的代码实现。这些代码可以帮助程序员更好地理解如何使用 Visual C/C++ 来设计各种不同类型的界面。 在算法实现和数据结构方面,这个集锦中也包括了一些常用的算法和数据结构的实现代码,比如排序算法、查找算法、链表、树等数据结构的实现。这些代码可以帮助程序员更好地理解和掌握常用的算法和数据结构的实现方法。 在网络编程方面,这个集锦中也包括了一些常用的网络编程代码,比如 socket 编程、多线程编程、网络通信协议等方面的代码实现。这些代码可以帮助程序员更好地理解和掌握网络编程的相关知识和技术。 总的来说,这个 Visual C/C++ 编程精选集锦源代码是一个非常有价值的学习资源,可以帮助程序员们更好地学习和掌握各种不同领域的编程技术。希望程序员们能够通过学习这些源代码,不断提升自己的编程技能,为自己的职业发展打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值