n點求圓簡單 ,但是在點位資料採集時候往往存在各種各樣的誤差,致使計算結果誤差較大。
所以寫了乙個3點擬合乙個新點。形成內外圓擬合均分法求出圓心及座標
資料點採集如下圖
綠色圓為真圓 紅色圓為擬合計算圓 點位為採集點
已知圓心和半徑
根據採集點求擬合圓心和半徑
點位擬合**
根據第一次擬合返回資料【i,3】排除最大和最小兩個資料;最終結果剩餘數根據n點求圓需求 至少保證最終點位大於等於3點//擬合點
public static double[,] nihe(double[,] xy)
return zdzb;
}
排除最大和最小自己寫 不囉嗦
n次擬合之後剩餘點位更接近真圓了
n點求圓// 真圓圓心
string str = " x=139.189198037 y=158.058480947 r=75";
double[,] xy =,,,
,,,,
,,,,
,};double[,] retu = nihe(xy);
bool nh = true;
int nhnumber = 10;//n點求圓點位需求
while (nh)
else
}double xyr = qiuyuan(retu);
double xyr1 = qiuyuan(xy);
console.writeline(" 實際座標 ", str);
console.writeline(" 擬合計算座標 x=,y= ,r=,參與成員數 ", xyr[0], xyr[1], xyr[2], retu.getlength(0));
console.writeline(" 非擬座標 x=,y= ,r=", xyr1[0], xyr1[1], xyr1[2]);
console.readkey();
最終計算結果//n點求圓座標和半徑
public static double qiuyuan(double[,] xy)
double c, d, e, g, h, n = xy.getlength(0);
double a, b, c;
// n = x.length;
c = n * x2 - x1 * x1;
d = n * x1y1 - x1 * y1;
e = n * x3 + n * x1y2 - (x2 + y2) * x1;
g = n * y2 - y1 * y1;
h = n * x2y1 + n * y3 - (x2 + y2) * y1;
a = (h * d - e * g) / (c * g - d * d);
b = (h * c - e * d) / (d * d - g * c);
c = -(a * x1 + b * y1 + x2 + y2) / n;
double a, b, r;
a = a / (-2);
b = b / (-2);
r = math.sqrt(a * a + b * b - 4 * c) / 2;
zuizhongzuobiao[0] = a;
zuizhongzuobiao[1] = b;
zuizhongzuobiao[2] = r;
// console.writeline("x座標= y 座標= 半徑=", a, b, r);
return zuizhongzuobiao;
}
通過點擬合圓
參考 matlab空間三點求圓心 中使用的演算法原理是 三個點確定兩個線段,圓心位於兩個線段的中垂線上,所以圓心座標符合兩個中垂線的性質,具體推導如下 我的推導過程和原文中的稍有區別,我算出d,原文算出k,思路一致 部落格 matlab空間三點求圓心 function p circlecenter ...
halcon測試篇 三點擬合圓弧和圓
已知三個座標點,擬合對應的圓弧和圓。設定圓的寬度 dev set line width 3 dev set draw margin 確定三個點,在視窗上用滑鼠點三個點 draw point 200000 row1,column1 draw point 200000 row2,column2 draw...
三點求圓公式Matlab 和C 版程式
三點求圓公式matlab 和c 版程式 給定三個點做圓弧軌跡規劃 function p p plot circle p1,p2,p3 利用這三個點做乙個平面方程 k 11 p1 2 p3 2 p2 3 p3 3 p2 2 p3 2 p1 3 p3 3 k 12 p2 1 p3 1 p1 3 p3 3...