QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)
- O* N. [8 A4 _" l' \下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。
8 V& A# p  J3 A- R8 x  ]" y! d. `6 U2 x, `; b6 C
Sub test(): l. j. N9 r; S. _! B1 e3 _. b
Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double
+ A8 z) X' p& {+ W0 dConst pi = 3.1415926% M: p- @6 `9 H  a; n
a = ThisDrawing.Utility.GetPoint(, "shurudian a")
8 Y5 d2 n' b2 ^# V% iCall ThisDrawing.ModelSpace.AddCircle(o, 50)
+ W. @, F$ d$ d# b7 dCall ThisDrawing.ModelSpace.AddLine(a, o)7 }: c$ D, [8 I( M6 B# J. P
For x = -90 To 0 Step 0.01
1 a. ~1 \: D: H' f2 F7 g) w2 i9 g    b(0) = Cos((x * pi) / 180) * 50
- l2 v4 U5 x8 M: G( W5 r    b(1) = Sin((x * pi) / 180) * 50
5 Z4 Z( h7 r5 K5 v If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then4 |% x% h$ M6 a$ |5 i& }7 l: K* J# V
     End If
  D5 U2 v( u( T7 `* ^    Call ThisDrawing.ModelSpace.AddLine(a, b)0 ~3 W$ I$ a" }2 g% U- C$ D
    Next x# O/ t* C* k" m( v; O. p  }
    On Error Resume Next      / j" S7 a, A" p  S
End Sub4 `: n: A7 R6 t% ]  S1 B
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层 来自: 中国广东深圳
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层 来自: 中国辽宁抚顺
这个方法不好
) L$ z3 l/ ~4 F: j4 E; F2 }其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?
5 h' ~5 o! R7 I* a9 Y如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点./ J5 J" M8 i4 r# x; @4 N' T
按照这个思路编程应该是这样
  1. Sub test()
    + R% V$ S; A$ Y& u
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double  p* ~( l2 f1 t% G: Z
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''2 r1 n  q9 C( g( Y; X, H" `
  4. 'Const pi = 3.14159269 @+ Z5 M& a5 r5 c! D
  5. On Error GoTo 10" K, Z6 V2 c: m9 \8 ^5 I1 `
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")
    . j- A; I5 Q; @9 S& a2 g' ?
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''
    6 ~* f6 T) X, S$ E+ V; k: b/ d
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''# @) a# R9 g, q0 L# \. r! r, m
  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 '求直线的中点
    & M5 q- G# A5 E$ R6 i) @6 f; a  P% g. T
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆
    2 J6 g9 m8 ~8 }' D
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点( [$ E( q! D$ j# ~9 a- y
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b  l: H, y0 J: j! @+ M% {' y
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)" x6 ^+ T1 B' W- R% [
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o): X* \7 ?, m5 v8 i
  15. 'For x = -90 To 0 Step 0.01: J" Z5 Z1 A9 u7 ?  x' I
  16. 'b(0) = Cos((x * pi) / 180) * 505 U. z0 h! G! j3 U3 C
  17. 'b(1) = Sin((x * pi) / 180) * 50
    7 [( y5 D0 J" X2 X1 m# w9 o
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then
    6 t* L' i  c9 a: w* _' [
  19. 'End If1 ?# Q' h  v& C0 `9 q* f. E
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)
    1 p9 ~% [- V6 s  m9 ?
  21. 'Next x
    $ |, a9 ^% Q# C# U7 t$ i
  22. 'On Error Resume Next
    3 h" Q  w8 ?! y- m
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b4 r2 n1 E& s  q- s0 s
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线
    2 Q( \0 ]& M; ~. g  j
  25.     C2.Delete '删掉辅助圆3 ]9 e4 ]$ [: e- T
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层 来自: 中国广东惠州
受教了。学到一个新的命令,还没有去测试。4 c; P$ [; D7 I) K! u
有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?
$ Q) L1 P. n  ]8 o: w  v1 f原来的-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 )

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