QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 2681|回复: 4
收起左侧

[已答复] 新手求助:vba代码画圆的切线问题

[复制链接]
发表于 2013-6-10 21:52:06 | 显示全部楼层 |阅读模式 来自: 中国广东深圳

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)
  u8 z9 e/ P8 o3 @$ \下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。
: W8 X" \5 O: O0 e- A1 r" |9 K' e8 |* i5 J$ C! E, f
Sub test()+ ^. C$ j( E1 b- ]9 Q3 H
Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double
' d* {( \0 \+ E3 p: s9 l2 R+ q7 yConst pi = 3.1415926
" [. y- i9 _& Qa = ThisDrawing.Utility.GetPoint(, "shurudian a")
: [$ a1 \9 M3 ?' MCall ThisDrawing.ModelSpace.AddCircle(o, 50)
$ f' }9 S1 _+ ~1 A) N/ g. qCall ThisDrawing.ModelSpace.AddLine(a, o)5 @1 e4 {" h6 F; |3 K
For x = -90 To 0 Step 0.01
" V1 V1 F1 W' i    b(0) = Cos((x * pi) / 180) * 50
3 f' L! S5 Y0 S" m: |+ T    b(1) = Sin((x * pi) / 180) * 509 [- q2 U2 w# j( P( Z
If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then
, R8 p7 `2 C4 z3 @" ^. L! ]7 j6 Q     End If
: d2 D/ h- p2 S7 Z+ y. {  ^    Call ThisDrawing.ModelSpace.AddLine(a, b)9 r4 |/ m8 {1 m6 E% S; b
    Next x9 Q; ^& A) I: n0 V" l% F& I* R) g
    On Error Resume Next        E& b1 L  i2 n  i3 L$ K4 A4 A
End Sub
7 ~, p1 n6 ?( Q
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层 来自: 中国广东深圳
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层 来自: 中国辽宁抚顺
这个方法不好% n! ~7 O) k  {. @; L! F7 U
其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?2 M5 ^' A$ M; D) K6 g
如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点.6 \- m) z, v1 J; a: k. a8 ]
按照这个思路编程应该是这样
  1. Sub test()" V: e" ~; S( e# f9 }" g
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double
      r6 _/ u; W5 ]3 }) V$ Z
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''" W7 g: S8 Y0 C% \' P9 a
  4. 'Const pi = 3.14159269 \% w& a, o- ~9 x7 X7 U; G% D
  5. On Error GoTo 103 w2 r. z8 ^! c: W
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")4 g2 J7 A! V. [: f) _8 ~
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''
    & I: s6 }, b' _9 x& d; z
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''% `; r  T! X, _8 c1 J. ~
  9.     o(0) = (L.StartPoint(0) + L.EndPoint(0)) / 2: o(1) = (L.StartPoint(1) + L.EndPoint(1)) / 2: o(2) = (L.StartPoint(2) + L.EndPoint(2)) / 2 '求直线的中点
    & N# v# x! r* r
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆/ h8 N2 F% s$ S; F. G+ ^# U$ k
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点
    , X0 B% U" ^  {, A1 b% f; X3 a& f5 o
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b  y7 X( @& K! q6 g
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)% m7 J' \+ g! k4 V- K. s
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o)6 q/ b8 |+ Z7 W- C) h
  15. 'For x = -90 To 0 Step 0.01) `5 d3 y: O: s6 ]) z% E  C
  16. 'b(0) = Cos((x * pi) / 180) * 508 l: m; n  E+ j' q* X( e5 R6 A/ u
  17. 'b(1) = Sin((x * pi) / 180) * 50
    9 O7 X6 f2 L+ z! r2 g0 u
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then
    ) n2 ]: J0 n  i) Q8 \% R  }  Y0 @
  19. 'End If/ [5 y: g! g3 O6 ^" A4 Z" q9 K  M
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)
    # G/ C8 j; b# ]. b  ^* \
  21. 'Next x! X/ V: |- ?$ Y  q/ b
  22. 'On Error Resume Next4 |+ r- j# j0 w; d) g7 _4 i
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b/ D$ c# F9 b0 V
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线
    ! ^3 O9 ?7 a0 X& T0 V- l
  25.     C2.Delete '删掉辅助圆4 C% j7 f, a' s) d
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层 来自: 中国广东惠州
受教了。学到一个新的命令,还没有去测试。
  M2 E( ]7 h4 P" ?  h3 R5 c! y有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?
' m, B3 @5 Z. E2 ~6 I6 E1 z原来的-90 to 0 step 0.01 我是为了得到在第四象限的那个切点。。
 楼主| 发表于 2013-6-21 15:43:50 | 显示全部楼层 来自: 中国广东惠州
已经过测试,可以执行。另经过自己修改部分指令也可执行。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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