乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 17|回复: 0

[转帖]VBA-三点划弧

[复制链接]

120

主题

326

帖子

7

银币

中流砥柱

Rank: 25

铜币
806
发表于 2008-5-7 18:09:00 | 显示全部楼层 |阅读模式
研究一下这个帖子,将三点划弧做成模板。
  1. Private Function GetCenOf3Pt(pt1 As Variant, pt2 As Variant, pt3 As Variant, ByRef radius As Double) As Variant
  2. ''''根据三点计算出圆心和半径
  3. Dim xysm, xyse, xy As Double
  4. Dim ptCen(2) As Double
  5. xy = pt1(0) ^ 2 + pt1(1) ^ 2
  6. xyse = xy - pt3(0) ^ 2 - pt3(1) ^ 2
  7. xysm = xy - pt2(0) ^ 2 - pt2(1) ^ 2
  8. xy = (pt1(0) - pt2(0)) * (pt1(1) - pt3(1)) - (pt1(0) - pt3(0)) * (pt1(1) - pt2(1))
  9. '''判断参数有效性
  10. If Abs(xy) < 0.000001 Then
  11. MsgBox "所输入的参数无法创建圆形!"
  12. Exit Function
  13. End If
  14. '获得圆心和半径
  15. ptCen(0) = (xysm * (pt1(1) - pt3(1)) - xyse * (pt1(1) - pt2(1))) / (2 * xy)
  16. ptCen(1) = (xyse * (pt1(0) - pt2(0)) - xysm * (pt1(0) - pt3(0))) / (2 * xy)
  17. ptCen(2) = 0
  18. radius = Sqr((pt1(0) - ptCen(0)) * (pt1(0) - ptCen(0)) + (pt1(1) - ptCen(1)) * (pt1(1) - ptCen(1)))
  19. If radius < 0.000001 Then
  20. MsgBox "半径过小!"
  21. Exit Function
  22. End If
  23. ''函数返回圆心的位置,而半径则在参数中通过引用方式返回
  24. GetCenOf3Pt = ptCen
  25. End FunctionPublic Function AddArc3Pt(ByVal ptSt As Variant, ByVal ptSc As Variant, ByVal ptEn As Variant) As AcadArc
  26. ''''三点法创建圆弧
  27. Dim objArc As AcadArc
  28. Dim ptCen As Variant
  29. Dim radius As Double
  30. ptCen = GetCenOf3Pt(ptSt, ptSc, ptEn, radius)
  31. If isClockWise(ptCen, ptSt, ptSc, ptEn) Then
  32. Set objArc = AddArcCSEP(ptCen, ptSt, ptEn)
  33. Else
  34. Set objArc = AddArcCSEP(ptCen, ptEn, ptSt)
  35. End If
  36. objArc.Update
  37. Set AddArc3Pt = objArc
  38. End FunctionPrivate Function AddArcCSEP(ByVal ptCen As Variant, ByVal ptSt As Variant, ByVal ptEn As Variant) As AcadArc
  39. Dim objArc As AcadArc
  40. Dim radius As Double
  41. Dim stAng, enAng As Double
  42. ''计算半径
  43. radius = 100 'GetDistance(ptCen, ptSt)
  44. ''计算起点角度和终点角度
  45. stAng = ThisDrawing.Utility.AngleFromXAxis(ptCen, ptSt)
  46. enAng = ThisDrawing.Utility.AngleFromXAxis(ptCen, ptEn)
  47. Set objArc = ThisDrawing.ModelSpace.AddArc(ptCen, radius, stAng, enAng)
  48. objArc.Update
  49. Set AddArcCSEP = objArc
  50. End Function
  51. '判断三点的方向
  52. Function isClockWise(ptCen, ptSt, ptSc, ptEn) As Boolean
  53. a1 = ThisDrawing.Utility.AngleFromXAxis(ptCen, ptSt)
  54. a2 = ThisDrawing.Utility.AngleFromXAxis(ptCen, ptSc)
  55. a3 = ThisDrawing.Utility.AngleFromXAxis(ptCen, ptEn)
  56. isClockWise = (a1 < a2) Xor (a2 < a3) Xor (a1 < a3)
  57. End Function
  58. Sub ls()
  59.   Dim aa As AcadArc
  60.   Dim pp(0 To 2) As Double, ppp(0 To 2) As Double, pppp(0 To 2) As Double
  61.   pp(0) = 0: pp(1) = 10: pp(2) = 0
  62.   ppp(0) = 10: ppp(1) = 100: ppp(2) = 0
  63.   pppp(0) = -20: pppp(1) = -110: pppp(2) = 0
  64.   Set aa = AddArcCSEP(pp, ppp, pppp)
  65.   
  66. End Sub

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-5 15:34 , Processed in 0.838869 second(s), 54 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表