QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)
  M* s" z+ y4 ?( z# ^; g. p下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。
2 M, e/ |+ l6 y9 {% {- i% A. `
! _7 k8 N0 ?; D1 t+ D% }+ v* s' DSub test()7 c4 y4 ^" t/ J
Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double% F; \- @: k* e
Const pi = 3.1415926! N' j0 j5 K9 P' N, A. B
a = ThisDrawing.Utility.GetPoint(, "shurudian a")! A9 t  M2 S7 K5 S" t# n
Call ThisDrawing.ModelSpace.AddCircle(o, 50)
" g: X7 U: \3 k: a7 v$ PCall ThisDrawing.ModelSpace.AddLine(a, o)- P. G# Z9 i5 ]% m" T3 N* d5 s  ^% q$ J% }
For x = -90 To 0 Step 0.01" L* K: f, P* S7 ^% K
    b(0) = Cos((x * pi) / 180) * 502 G: m! j: B3 m0 U
    b(1) = Sin((x * pi) / 180) * 50
. `- K" H) j* }( T If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then
8 I6 |" y/ o/ ~6 S$ C8 p     End If
2 @& t6 E  |) }" V. F    Call ThisDrawing.ModelSpace.AddLine(a, b)
3 s/ E$ }6 C. |; ^    Next x. x) n+ Y. r3 M# l7 b' g8 }
    On Error Resume Next      6 p- V0 n% u0 u; @6 p8 a6 ]5 O
End Sub
* H) B  y0 |) h% ?$ m4 t3 e
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层 来自: 中国广东深圳
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层 来自: 中国辽宁抚顺
这个方法不好( E1 y2 O' }* Y, K
其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?  t/ `5 V7 ^- F# m* ?7 r- k( v
如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点./ x2 N1 D$ H6 u. p6 S+ i( A7 x
按照这个思路编程应该是这样
  1. Sub test()
    # n1 R7 D, C) o8 g& O
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double( }6 x( O$ y/ G; r2 q; y
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''7 ~; o" h! H9 Z" _
  4. 'Const pi = 3.1415926+ k( c: Y; Q+ d8 Z( b# {( E
  5. On Error GoTo 10; C$ Y  `/ f" R! y1 |9 i" u4 K
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")
    0 L1 N+ P3 |; Z5 f4 m# @
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''5 _; x: h7 K4 t
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''* Q6 g. k5 O# ]+ K: a. J1 J+ b
  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 '求直线的中点; O: J/ q# E; b" z. J. u
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆" J( e  m. \, z5 d& O/ t
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点# B% M, H5 l! w' Z
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b
    ! d1 n& {$ n) E1 q
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)
    % d5 R- J0 }; E! ~3 L
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o)) l: |/ X: V8 G6 r
  15. 'For x = -90 To 0 Step 0.01
    7 `. Z# G# q+ j4 [
  16. 'b(0) = Cos((x * pi) / 180) * 500 h% N' V" e, Q- d2 v( `; {# Q
  17. 'b(1) = Sin((x * pi) / 180) * 505 M1 o* c( B7 I/ x7 K
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then6 d/ M; y  X. I* v' T3 o% a
  19. 'End If- f% R* d5 u7 a& g) U+ T
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)
    ) P1 e3 c3 A$ G5 C# n- `* m
  21. 'Next x
    3 @/ O* I* z+ d7 p
  22. 'On Error Resume Next
    6 \2 D4 c4 F$ G. b8 q- r
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b. T, U' x) z& \+ v+ K
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线3 r2 O! K, y, C- f% q, r% q
  25.     C2.Delete '删掉辅助圆
    / E1 e0 T1 J: k2 H$ K: v
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层 来自: 中国广东惠州
受教了。学到一个新的命令,还没有去测试。
5 w, U3 t0 H4 x有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?9 L8 w% R. ]1 E3 f+ U
原来的-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 )

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