终于解决了!花了好几天的工夫,尝试不同的方法。终于解决了。 应该感谢fjfhgdwfn提供的的思路。根据有凸度多段线的起点和端点。还有凸度,就可以求出圆心,楼主说可以求出两个圆心,我也是在这个问题上卡了很长一段时间。关键是应当根据弦的方向角求处矢的方向角根据其中点落在不同的象限来确定唯一的圆心坐标值。下面是代码。只是给出关键函数的实现,其他辅助函数很简单可以按需要实现。 希望大家都能热心解决难题。热心回馈社区,共建强大的开发社区 Public Function getCenter(Pst As Variant, Ped As Variant, ByVal nBulge As Double) As Double() '根据2端点,和凸度计算 多段线的圆心 Dim p1() As Double Dim p2() As Double Dim nSlope As Double Dim K As Double Dim nAngle As Double Dim Pcenter(2) As Double Dim nArrow As Double Dim midP() As Double Dim radAngle As Double Dim nDirectAngle As Double p1 = Pst p2 = Ped midP = getMiddlePoint(p1, p2) nArrow = getArrow(p1, p2, nBulge) radAngle = Atn(Abs(nBulge)) * 4 Dim X As Double Dim Y As Double If nArrow = 0 Then Pcenter(0) = midP(0) Pcenter(1) = midP(1) Pcenter(2) = 0 getCenter = Pcenter Exit Function End If If (nBulge > 0 And radAngle < PI) Or (nBulge < 0 And radAngle > PI) Then nDirectAngle = getDirectionAngle(Pst, Ped) + PI / 2 End If If (nBulge < 0 And radAngle < PI) Or (nBulge > 0 And radAngle > PI) Then nDirectAngle = getDirectionAngle(Pst, Ped) - PI / 2 End If If nDirectAngle > 2 * PI Then nDirectAngle = nDirectAngle - 2 * PI Select Case nDirectAngle Case 0 Pcenter(0) = midP(0) + nArrow Pcenter(1) = midP(1) getCenter = Pcenter Exit Function Case PI / 2 Pcenter(0) = midP(0) Pcenter(1) = midP(1) + nArrow getCenter = Pcenter Exit Function Case PI Pcenter(0) = midP(0) - nArrow Pcenter(1) = midP(1) getCenter = Pcenter Exit Function Case PI + PI / 2 Pcenter(0) = midP(0) Pcenter(1) = midP(1) - nArrow getCenter = Pcenter Exit Function End Select nSlope = (p2(1) - p1(1)) / (p2(0) - p1(0)) K = -1 / nSlope nAngle = Atn(K) X = Cos(nAngle) * nArrow Y = Sin(nAngle) * nArrow If nDirectAngle > PI / 2 And nDirectAngle < PI Then X = -X Y = -Y End If If nDirectAngle > PI And nDirectAngle < (PI + PI / 2) Then X = -X Y = -Y End If   center(0) = midP(0) + X   center(1) = midP(1) + Y getCenter = Pcenter End Function |