阅读:1315回复:0
拟合圆的源代码
************************************************************************
'功能:根据若干座标点拟合圆 '输入:座标数组varDots,下标从1开始 '输出:变体,其中:X-mathGetCircle(0),Y-mathGetCircle(1),R-mathGetCircle(2) Public Function mathGetCircle(varDots As Variant) As Variant Dim varRet As Variant Dim dblB() As Double Dim dblC() As Double Dim dblMX, dblMY, dblM, dblP, dblO, dblQ, dblR, dblS, dblD, dblE, dblAA, dblBB As Double Dim dblXX, dblYY, dblRR As Double Dim lngDotsNum, i, j As Long lngDotsNum = UBound(varDots, 1) ReDim dblB(1 To lngDotsNum) As Double ReDim dblC(1 To lngDotsNum) As Double '将各点X、Y座标分别求和,并取平均值 dblMX = 0: dblMY = 0 For i = 1 To lngDotsNum dblMX = dblMX + varDots(i, 0) dblMY = dblMY + varDots(i, 1) Next i dblMX = dblMX / lngDotsNum dblMY = dblMY / lngDotsNum dblO = 0: dblQ = 0: dblS = 0 For i = 1 To lngDotsNum dblM = ((varDots(i, 0) - dblMX) ^ 2 + (varDots(i, 1) - dblMY) ^ 2) * (varDots(i, 0) - dblMX) dblO = dblO + dblM dblP = ((varDots(i, 0) - dblMX) ^ 2 + (varDots(i, 1) - dblMY) ^ 2) * (varDots(i, 1) - dblMY) dblQ = dblQ + dblP dblR = (varDots(i, 0) - dblMX) * (varDots(i, 1) - dblMY) dblS = dblS + dblR Next i dblO = dblO / lngDotsNum dblQ = dblQ / lngDotsNum dblS = dblS / lngDotsNum dblD = 0: dblE = 0 For i = 1 To lngDotsNum dblB(i) = (varDots(i, 0) - dblMX) ^ 2: dblC(i) = (varDots(i, 1) - dblMY) ^ 2 dblD = dblD + dblB(i): dblE = dblE + dblC(i) Next i dblD = dblD / lngDotsNum dblE = dblE / lngDotsNum dblAA = (dblE * dblO - dblS * dblQ) * 0.5 / (dblD * dblE - dblS ^ 2) dblBB = (dblD * dblQ - dblS * dblO) * 0.5 / (dblD * dblE - dblS ^ 2) dblXX = dblMX + dblAA '圆心X dblYY = dblMY + dblBB '圆心Y dblRR = Sqr(dblD + dblE + dblAA ^ 2 + dblBB ^ 2) '半径 dblD = dblE * 2 ReDim varRet(2) As Variant varRet(0) = dblXX varRet(1) = dblYY varRet(2) = dblRR mathGetCircle = varRet End Function |
|
|