QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)2 \$ j$ C5 x, d% j4 c+ \1 s$ K) e2 ?/ L
下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。
* N' _4 V- ?6 h1 x
0 o: ]- f+ |6 w" q7 a3 }- _4 U5 ESub test()7 l# K. g4 W& y
Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double+ g5 V- O/ c7 e
Const pi = 3.1415926* C# y! _' @9 g4 x# |, c
a = ThisDrawing.Utility.GetPoint(, "shurudian a")
0 p  d# @" ]  d( r8 OCall ThisDrawing.ModelSpace.AddCircle(o, 50)! N9 K* x0 A$ M$ N# E4 V7 ~5 t  i
Call ThisDrawing.ModelSpace.AddLine(a, o)
/ M: B+ \6 {  l. \+ w6 B1 G* FFor x = -90 To 0 Step 0.01
+ s& V& ~' y7 {. m% n- Z! r$ Y    b(0) = Cos((x * pi) / 180) * 50
. L# a6 T& q1 Y' h' @    b(1) = Sin((x * pi) / 180) * 501 S' y8 k  k$ R& [$ f; n
If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then: `  }; Z3 M9 \+ B, o% ~
     End If& h6 M( Q* X1 Q' h. r. e9 D
    Call ThisDrawing.ModelSpace.AddLine(a, b)4 K' J: Y$ S7 G# T
    Next x& G1 c- J9 x3 R  a9 M0 F
    On Error Resume Next      
$ q  _1 [% f* ^3 o9 J8 ?; n" B" CEnd Sub; l' \2 P( b: |/ L/ {5 i
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层 来自: 中国广东深圳
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层 来自: 中国辽宁抚顺
这个方法不好3 u1 Y# ]! R' }- m, \) U6 \: R) D2 p
其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?
3 N. y+ ^& n9 z5 D如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点.# v/ M6 C# K/ O" {+ f( S, n8 p
按照这个思路编程应该是这样
  1. Sub test()
    * Q: y4 |* X' ~6 h) P
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double
    1 Y8 p1 M1 E% B8 j" x& i) t4 d* A
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''& T2 {2 m/ o1 W5 c  ]8 c: ?+ n
  4. 'Const pi = 3.1415926
    - M8 ?/ A* n+ N  x$ n
  5. On Error GoTo 10' R1 E# H1 Y3 S" C) @
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")
    $ }# g9 Z- `7 e- E( u: @  V
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''! H% P; K2 y- O4 d2 {2 M
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''
    * w/ x3 S9 E* |9 w; A9 @8 X: K. }
  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 '求直线的中点, A* x' a- ]) [0 v. d
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆
    ! _5 `% G* \- w: v" n
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点+ o5 M) w+ b+ ~& d# _  _" d
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b
    + w1 r9 U" `/ v6 ]  [+ U# u) [
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)
    ; x  ~2 ]$ I5 K( H+ i
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o)
    % H8 N2 O5 T5 b6 K7 W- p
  15. 'For x = -90 To 0 Step 0.01
    3 ^) ~: u4 A" a, a
  16. 'b(0) = Cos((x * pi) / 180) * 505 B1 \, t, l3 w/ Q8 L' _. I1 ^
  17. 'b(1) = Sin((x * pi) / 180) * 50
    - b5 ]+ |# o: N8 |9 V& u" V5 h
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then
    & L6 i% L/ H  E6 ~0 V
  19. 'End If
    ' o0 r5 }3 G" F" V9 ?2 x5 @% U
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)) W6 ^4 ]) ^/ A- Z7 e
  21. 'Next x& h+ U. c8 [4 a  B0 ~% f' X) g
  22. 'On Error Resume Next
    * z* ?+ @. X6 [& k' }0 X9 r7 A; d
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b' R* ?% T; j3 }
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线
    2 A; ~% _2 B/ f! f
  25.     C2.Delete '删掉辅助圆
    " R( V3 N0 F1 `1 g% h' l2 J
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层 来自: 中国广东惠州
受教了。学到一个新的命令,还没有去测试。
# J& U' z; s' P6 M- m有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?  j* Y3 A) P- e& S  g2 ^( ?
原来的-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 )

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