三点确定一个圆的计算方法
2016-10-22 13:40
399 查看
三点确定一个圆的计算方法
最近在写的一个软件需要根据三个坐标点来计算一个圆。因此花了点时间推导了相关的公式。这个推导不算太难,放在这里主要是做个备忘。我们设一个圆的圆心坐标为 ,半径为 。那么这个圆的方程可以写为:
在这个圆上随便取三个点,设这三个点的坐标分别是 ,,。那么有:
公式(1)(2)相减,(1)(3)相减之后经过化简可以得到:
有唯一解的条件是系数行列式不为 :
简单变变型也就是:
这样写几何含义就很明显了,三点不能共线。
设:
那么 :
有了 和 的值后,带入(1) 式就可以得到 的值。至此,三点确定圆的问题就解决了。
下面是个 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} 这三个点测试了一下。结果没有问题。
相关文章推荐
- 三点确定一个圆的计算方法
- 圆弧方向判断方法和三点确定一个圆的计算方法
- 一个计算除法四舍五入的方法
- 计算一个数组所有元素之和(无锁方法)
- 一个简单方法完成C#时间间隔的计算
- 一个在各个浏览器下兼容的计算元素可用空间的方法(自用)
- 黄聪:一个简单方法完成C#时间间隔的计算
- SQL计算秒数的一个简单方法
- 写一个方法进行各种属性的更新,而不要每个界面设置改变都改变一个属性。就是点击应用或确定按钮时调用这个更新属性的方法,遍历所有(控制对象属性的)界面控件的状态(值),进行属性修改和刷新。
- 一个简单方法完成C#时间间隔的计算
- 一个简单方法完成C#时间间隔的计算
- 一个简单方法完成C#时间间隔的计算
- 计算一个数组所有元素之和(方法总结)
- 一个简单方法完成C#时间间隔的计算
- 根据一个Feature图层范围计算另一个Feature图层各图斑面积的方法
- 用Regex类计算一个字符串出现次数是最好方法【转载】
- 编写一个方法,计算kkk^^kk (共n个k,n>0)的值。例如k=2,n=5则为22222。调用方法求s1=6+66+666+6666+66666
- 一个简单方法完成C#时间间隔的计算
- 一个简单方法完成C#时间间隔的计算
- 一个简单方法完成C#时间间隔的计算