找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 414|回复: 3

[求助]:请问如何用VBA画一个圆,再从圆外一点画圆的切线

[复制链接]
发表于 2004-6-15 18:26:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
菜鸟问题:
请问如何用VBA画一个圆,再从圆外一点画这个圆的切线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-6-15 19:17:47 | 显示全部楼层
  1. Sub AAA()

  2. '用VBA画一个圆。
  3. Dim cen1(2) As Double
  4. cen1(0) = 100: cen1(1) = 200: cen1(2) = 0
  5. Dim R As Double
  6. R = 300
  7. Dim C As AcadCircle
  8. Set C = ThisDrawing.ModelSpace.AddCircle(cen1, R)

  9. '得到圆外一点。
  10. Dim P As Variant
  11. P = ThisDrawing.Utility.GetPoint(, "请在圆外取一点:")

  12. '出错处理。
  13. If dis(P, cen1) < R Then
  14. MsgBox ("点不在圆外,请重新输入!")
  15. Exit Sub
  16. End If

  17. '以圆外这点和上一个圆的圆心为直径的两端,画一个辅助圆。
  18. Dim cen2(2) As Double
  19. cen2(0) = 0.5 * (P(0) + cen1(0))
  20. cen2(1) = 0.5 * (P(1) + cen1(1))
  21. cen2(2) = 0.5 * (P(2) + cen1(2))

  22. Dim cc As AcadCircle
  23. Set cc = ThisDrawing.ModelSpace.AddCircle(cen2, 0.5 * dis(cen1, P))

  24. '得到这两个圆的交点。
  25. Dim p0 As Variant
  26. p0 = C.IntersectWith(cc, acExtendBoth)
  27. Dim p1(2) As Double, p2(2) As Double
  28. p1(0) = p0(0): p1(1) = p0(1): p1(2) = p0(2)
  29. p2(0) = p0(3): p2(1) = p0(4): p2(2) = p0(5)

  30. '画出两条切线。
  31. Dim L1 As AcadLine, L2 As AcadLine
  32. Set L1 = ThisDrawing.ModelSpace.AddLine(p1, P)
  33. Set L2 = ThisDrawing.ModelSpace.AddLine(p2, P)

  34. '删除辅助圆。
  35. cc.Delete
  36. End Sub

  37. Function dis(pa As Variant, pb As Variant) As Double
  38. dis = ((pa(0) - pb(0)) ^ 2 + (pa(1) - pb(1)) ^ 2 + (pa(2) - pb(2)) ^ 2) ^ 0.5
  39. End Function
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-6-16 08:47:43 | 显示全部楼层
lzh741206斑竹写的更好!

  1. Sub BBB()
  2. '画圆
  3. Dim cen1(2) As Double
  4. Dim PD As Double, PL As Double, R As Double
  5. Dim Angle As Double, pAngle As Double
  6. Dim C As AcadCircle
  7. Dim P, P1 As Variant
  8. cen1(0) = 100: cen1(1) = 200: cen1(2) = 0
  9. R = 300
  10. Set C = ThisDrawing.ModelSpace.AddCircle(cen1, R)

  11. '取点
  12. P = ThisDrawing.Utility.GetPoint(, "请在圆外取一点:")

  13. '出错处理
  14. PD = dis(P, cen1)
  15. Do While PD <= R
  16. MsgBox ("点不在圆外,请重新输入!")
  17. P = ThisDrawing.Utility.GetPoint(, "请在圆外取一点:")
  18. PD = dis(P, cen1)
  19. Loop

  20. '画切线。
  21. PL = Sqr(PD ^ 2 - R ^ 2)
  22. pAngle = Atn(R / PL)
  23. Angle = ThisDrawing.Utility.AngleFromXAxis(P, cen1)
  24. P1 = ThisDrawing.Utility.PolarPoint(P, Angle + pAngle, PL)
  25. ThisDrawing.ModelSpace.AddLine P1, P
  26. P1 = ThisDrawing.Utility.PolarPoint(P, Angle - pAngle, PL)
  27. ThisDrawing.ModelSpace.AddLine P1, P
  28. End Sub

  29. Function dis(pa As Variant, pb As Variant) As Double
  30. dis = Sqr((pa(0) - pb(0)) ^ 2 + (pa(1) - pb(1)) ^ 2 + (pa(2) - pb(2)) ^ 2)
  31. End Function
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-6-16 09:55:23 | 显示全部楼层
谢谢长不大版主。第一个程序用几何的方法,第i二个用数学的方法求解,两者各有千秋。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-24 03:10 , Processed in 0.333740 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表