已知三維空間中三個點求圓心坐標和半徑


轉發:https://blog.csdn.net/yanmy2012/article/details/8111600

已知空間三點的坐標為(x1,y1,z1),(x2,y2,z2),(x3,y3,z3),求這三個點所確定的空間圓的圓心坐標和半徑。

分析可得約束條件:1、三點共面2、三點到空間圓心坐標的距離相等。

從約束條件可得,4個自由項4個方程可解,可以列出線性代數方程組,即可用消元法求解;

即以下的(1)(2)(3)(4)四個方程組成的線性代數方程組

共面約束:

三點到空間圓心坐標的距離相等約束:

(1) (2)(3)聯解可得(5)(6)同時消去R

 

通過(4)(5)(6)獲得關於圓心空間坐標的線性代數方程組

求逆矩陣方法可以看我之前博客:矩陣求逆矩陣

下面給出暴力運算代碼:

//x1,y1,z1對應一個點的坐標 //x,y,z,radius是用來返回求解出來的圓心坐標和圓半徑
void centerCircle3d(double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, double &x, double &y, double &z,double &radius) { double a1 = (y1*z2 - y2*z1 - y1*z3 + y3*z1 + y2*z3 - y3*z2), b1 = -(x1*z2 - x2*z1 - x1*z3 + x3*z1 + x2*z3 - x3*z2), c1 = (x1*y2 - x2*y1 - x1*y3 + x3*y1 + x2*y3 - x3*y2), d1 = -(x1*y2*z3 - x1*y3*z2 - x2*y1*z3 + x2*y3*z1 + x3*y1*z2 - x3*y2*z1); double a2 = 2 * (x2 - x1), b2 = 2 * (y2 - y1), c2 = 2 * (z2 - z1), d2 = x1*x1 + y1*y1 + z1*z1 - x2*x2 - y2*y2 - z2*z2; double a3 = 2 * (x3 - x1), b3 = 2 * (y3 - y1), c3 = 2 * (z3 - z1), d3 = x1*x1 + y1*y1 + z1*z1 - x3*x3 - y3*y3 - z3*z3; x = -(b1*c2*d3 - b1*c3*d2 - b2*c1*d3 + b2*c3*d1 + b3*c1*d2 - b3*c2*d1) / (a1*b2*c3 - a1*b3*c2 - a2*b1*c3 + a2*b3*c1 + a3*b1*c2 - a3*b2*c1); y = (a1*c2*d3 - a1*c3*d2 - a2*c1*d3 + a2*c3*d1 + a3*c1*d2 - a3*c2*d1) / (a1*b2*c3 - a1*b3*c2 - a2*b1*c3 + a2*b3*c1 + a3*b1*c2 - a3*b2*c1); z = -(a1*b2*d3 - a1*b3*d2 - a2*b1*d3 + a2*b3*d1 + a3*b1*d2 - a3*b2*d1) / (a1*b2*c3 - a1*b3*c2 - a2*b1*c3 + a2*b3*c1 + a3*b1*c2 - a3*b2*c1); radius = sqrt((x1 - x)*(x1 - x) + (y1 - y)*(y1 - y) + (z1 - z)*(z1 - z)); }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM