三点确定一个圆的计算方法

三点确定一个圆的计算方法

最近在写的一个软件需要根据三个坐标点来计算一个圆。因此花了点时间推导了相关的公式。这个推导不算太难,放在这里主要是做个备忘。

我们设一个圆的圆心坐标为 (x0,y) ,半径为 r 。那么这个圆的方程可以写为:

(xx0)2+(yy0)2=r2

在这个圆上随便取三个点,设这三个点的坐标分别是 (x1,y1) (x2,y2) (x3,y3) 。那么有:

(x1x0)2+(y1y0)2=r2(x2x0)2+(y2y0)2=r2(x3x0)2+(y3y0)2=r2(1)(2)(3)

公式(1)(2)相减,(1)(3)相减之后经过化简可以得到:

(x1x2)x0+(y1y2)y0=(x21x22)(y22y21)2(x1x3)x0+(y1y3)y0=(x21x23)(y23y21)2

x0,y0 有唯一解的条件是系数行列式不为 0

(x1x2)(x1x3)(y1y2)(y1y3)0

简单变变型也就是:

x1x2y1y2x1x3y1y3

这样写几何含义就很明显了,三点不能共线。

设:

a=x1x2b=y1y2c=x1x3d=y1y3e=(x21x22)(y22y21)2f=(x21x23)(y23y21)2

那么 :

x0=debfbcady0=afcebcad

有了 x0 y0 的值后,带入(1) 式就可以得到 r <script type="math/tex" id="MathJax-Element-17">r</script>的值。至此,三点确定圆的问题就解决了。

下面是个 C++ 代码(用到了Qt 的 QPointF 类型):

    #include <math.h>
    #include <limits>
    #include <QPoint>
    #include <QDebug>
    QPointF tcircle(QPointF pt1, QPointF pt2, QPointF pt3, double &radius)
    {
        double x1 = pt1.x(), x2 = pt2.x(), x3 = pt3.x();
        double y1 = pt1.y(), y2 = pt2.y(), y3 = pt3.y();
        double a = x1 - x2;
        double b = y1 - y2;
        double c = x1 - x3;
        double d = y1 - y3;
        double e = ((x1 * x1 - x2 * x2) + (y1 * y1 - y2 * y2)) / 2.0;
        double f = ((x1 * x1 - x3 * x3) + (y1 * y1 - y3 * y3)) / 2.0;
        double det = b * c - a * d;
        if( fabs(det) < 1e-5)
        {
            radius = -1;
            return QPointF(0,0);
        }

        double x0 = -(d * e - b * f) / det;
        double y0 = -(a * f - c * e) / det;
        radius = hypot(x1 - x0, y1 - y0);
        return QPointF(x0, y0);
    }

用 {1, 1}, {1, 2}, {3, 4} 这三个点测试了一下。结果没有问题。

这里写图片描述

  • 62
    点赞
  • 192
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值