VBA_三点法画弧

Private Function GetCenOf3Pt(pt1 As Variant, pt2 As Variant, pt3 As Variant, ByRef radius As Double) As Variant
''''根据三点计算出圆心和半径
Dim xysm, xyse, xy As Double
Dim ptCen(2) As Double
xy = pt1(0) ^ 2 + pt1(1) ^ 2
xyse = xy - pt3(0) ^ 2 - pt3(1) ^ 2
xysm = xy - pt2(0) ^ 2 - pt2(1) ^ 2
xy = (pt1(0) - pt2(0)) * (pt1(1) - pt3(1)) - (pt1(0) - pt3(0)) * (pt1(1) - pt2(1))
'''判断参数有效性
If Abs(xy) < 0.000001 Then
MsgBox "所输入的参数无法创建圆形!"
Exit Function
End If
'获得圆心和半径
ptCen(0) = (xysm * (pt1(1) - pt3(1)) - xyse * (pt1(1) - pt2(1))) / (2 * xy)
ptCen(1) = (xyse * (pt1(0) - pt2(0)) - xysm * (pt1(0) - pt3(0))) / (2 * xy)
ptCen(2) = 0
radius = Sqr((pt1(0) - ptCen(0)) * (pt1(0) - ptCen(0)) + (pt1(1) - ptCen(1)) * (pt1(1) - ptCen(1)))
If radius < 0.000001 Then
MsgBox "半径过小!"
Exit Function
End If
''函数返回圆心的位置,而半径则在参数中通过引用方式返回
GetCenOf3Pt = ptCen
End Function

Public Function AddArc3Pt(ByVal ptSt As Variant, ByVal ptSc As Variant, ByVal ptEn As Variant) As AcadArc
''''三点法创建圆弧
Dim objArc As AcadArc
Dim ptCen As Variant
Dim radius As Double
ptCen = GetCenOf3Pt(ptSt, ptSc, ptEn, radius)
If isClockWise(ptCen, ptSt, ptSc, ptEn) Then
Set objArc = AddArcCSEP(ptCen, ptSt, ptEn)
Else
Set objArc = AddArcCSEP(ptCen, ptEn, ptSt)
End If
objArc.Update
Set AddArc3Pt = objArc
End Function

Private Function AddArcCSEP(ByVal ptCen As Variant, ByVal ptSt As Variant, ByVal ptEn As Variant) As AcadArc
Dim objArc As AcadArc
Dim radius As Double
Dim stAng, enAng As Double
''计算半径
radius = GetDistance(ptCen, ptSt)
''计算起点角度和终点角度
stAng = ThisDrawing.Utility.AngleFromXAxis(ptCen, ptSt)
enAng = ThisDrawing.Utility.AngleFromXAxis(ptCen, ptEn)

Set objArc = ThisDrawing.ModelSpace.AddArc(ptCen, radius, stAng, enAng)
objArc.Update
Set AddArcCSEP = objArc
End Function

'判断三点的方向
Function isClockWise(ptCen, ptSt, ptSc, ptEn) As Boolean
a1 = ThisDrawing.Utility.AngleFromXAxis(ptCen, ptSt)
a2 = ThisDrawing.Utility.AngleFromXAxis(ptCen, ptSc)
a3 = ThisDrawing.Utility.AngleFromXAxis(ptCen, ptEn)

isClockWise = (a1 < a2) Xor (a2 < a3) Xor (a1 < a3)

End Function

200662820189944_500.jpg

转载于:https://www.cnblogs.com/raymond19840709/archive/2007/04/12/710393.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
让用户可以随时查找曲线上任意点的坐标(函数值) 附件的 .mht文件,是一个简单介绍贝塞尔三次插值的文档,可以用IE打开,更多贝塞尔插值的算法,可以用搜索引擎找 附件的 .xls文件,打开以后,会看见三个工作表,分别演示了 找一个数值在曲线上的一组对应点 找一个数值在曲线上的所有对应点 和贝塞尔曲线是怎样在通过每两个节点的(每一对输入的X-Y数值代表平面坐标系的一个点,称为节点,Excel的平滑曲线通过每一个节点) 要在其他Excel文档使用 BezireInt() 函数,需要按Alt+F11,双击模块一 复制所有文字 然后打开其他Excel文档按Alt+F11,插入---模块,然后粘贴所有文字 自定义函数的使用方法是: 在空白单元格输入 =BezierInt(X坐标的范围,Y坐标的范围,待查的数值) 函数就会返回一个包含六个元素的数组,分别是三个点的X,Y坐标 如: 你根据 a1:a4的数值作为X值,b2:b4的数值作为Y值,画了一个平滑线散点图 想查找c1的数值是不是在这条曲线上 就可以输入 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,1) 得到曲线上第一个 X值=C1数值的点的X坐标 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,2) 得到曲线上第一个 X值=C1数值的点的Y坐标 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,3) 得到第2个 X值=C1数值的点的X坐标 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,4) 得到第2个 X值=C1数值的点的Y坐标 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,5) 得到第3个 X值=C1数值的点的X坐标 =Index( BezierInt(a1:a4,b1:b4,c1) ,1,6) 得到第3个 X值=C1数值的点的Y坐标 如果有多段曲线上的点包含C1的数值,那么可以增加输入参数,指定从哪个节点开始查找 =Index( BezierInt(a1:a4,b1:b4,c1,3),1,1) 得到从第三组X-Y数据开始查找, 返回第一个符合C1数值的点的X坐标 =Index( BezierInt(a1:a4,b1:b4,c1,3),1,2) 得到从第三组X-Y数据开始查找,返回第一个符合C1数值的点的Y坐标 函数默认输入数值是X值,要根据Y值找点的话,还可以增加输入参数, 指定输入的是Y值 =Index( BezierInt(a1:a4,b1:b4,c1,1,"Y"),1,1) 得到返回曲线上第一个 Y值=C1数值的点的X坐标如此类推......

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值