C N點求圓 擬合法

2021-08-21 10:26:54 字數 1993 閱讀 2838

n點求圓簡單 ,但是在點位資料採集時候往往存在各種各樣的誤差,致使計算結果誤差較大。

所以寫了乙個3點擬合乙個新點。形成內外圓擬合均分法求出圓心及座標

資料點採集如下圖

綠色圓為真圓 紅色圓為擬合計算圓 點位為採集點

已知圓心和半徑

根據採集點求擬合圓心和半徑

點位擬合**

//擬合點

public static double[,] nihe(double[,] xy)

return zdzb;

}

根據第一次擬合返回資料【i,3】排除最大和最小兩個資料;最終結果剩餘數根據n點求圓需求 至少保證最終點位大於等於3點

排除最大和最小自己寫 不囉嗦

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點求圓

//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...