默认头像
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
阅读:1315回复:0

拟合圆的源代码

楼主#
更多 发布于:2004-09-16 10:18
************************************************************************
'功能:根据若干座标点拟合圆
'输入:座标数组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
喜欢0 评分0
GIS麦田守望者,期待与您交流。
默认头像

返回顶部