QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
8天前
查看: 2687|回复: 4
收起左侧

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

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

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)
0 h5 F: E( |: N4 K  e3 h! q8 X% T下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。  R- [: z$ @9 x) d9 c* ?& E- R
. a# m, B  n7 e. Y( `( G% u
Sub test()& T' }: q. W& k4 O2 I
Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double2 C" t9 ^1 V! p: ?4 D) q' y
Const pi = 3.1415926
+ l, x* N" U- y0 B9 ^a = ThisDrawing.Utility.GetPoint(, "shurudian a")% b  X2 L6 K4 Q4 D7 p* g& ]0 N
Call ThisDrawing.ModelSpace.AddCircle(o, 50)
" z7 o% n# I  S9 \; V& SCall ThisDrawing.ModelSpace.AddLine(a, o)
' Q3 y. G) v/ `4 Y  W) N7 q) i4 \7 n4 {+ gFor x = -90 To 0 Step 0.01
0 j$ z' [; y+ Q    b(0) = Cos((x * pi) / 180) * 50
* E% Y7 m1 a" c* K2 D7 f* b3 ]    b(1) = Sin((x * pi) / 180) * 50
# B) o" d. w( Q If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then! s6 R7 d, M4 Q7 f! k
     End If
6 R' K  X+ p' m, q6 y/ g6 j+ c    Call ThisDrawing.ModelSpace.AddLine(a, b), a  B5 b" m  ^! W
    Next x! n  B( ^5 @/ S& w
    On Error Resume Next      
  C% H9 H. c9 m+ `; I" QEnd Sub
5 j9 \' O( K  y* O8 O
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层 来自: 中国广东深圳
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层 来自: 中国辽宁抚顺
这个方法不好  m5 M, M8 l- _$ L+ M  l
其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?
, F5 a0 G& S6 ^) F. X. x( @如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点.# F9 w! q4 |# y1 E. U$ Q, a- ?
按照这个思路编程应该是这样
  1. Sub test()
    ) S6 N, G/ u% S
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double" B! A/ R% e, i5 e; I$ [4 j
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''+ Y) N: h8 {  a9 _/ N( |, `  y
  4. 'Const pi = 3.14159265 v  Y: C& ~/ x% M- Q
  5. On Error GoTo 10# J# J# t$ r' q- r  J4 o4 r6 I# {" K
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")& v$ N5 D! D$ {$ V$ b+ M1 W
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''
    5 Z  V4 X) f2 c; ^, Z3 l
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''
    " a) v! n+ c* W7 c4 z& T
  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 '求直线的中点
    ! Q5 U! d# q- v
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆
    ; _% P. ^! P5 I1 n$ y
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点
    ! K* k& D6 b* j; Q" s0 \" D) i
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b" C1 H' G5 k4 J/ f, s; _
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)
    5 u7 i- T% _# z6 N
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o)
    + Y& N; H1 h  J
  15. 'For x = -90 To 0 Step 0.01
    - u# y" R2 k* _; ~$ D1 x1 _- R! Z
  16. 'b(0) = Cos((x * pi) / 180) * 50" c# m3 k8 a1 J2 c5 `
  17. 'b(1) = Sin((x * pi) / 180) * 50  U/ Q: J5 [) B* _( B5 ?; [$ X
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then) b( l# c4 P3 l4 ~
  19. 'End If
    8 \8 A7 X! ~' x2 l" y9 z
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)0 `, f  f9 {3 l# U  y2 x
  21. 'Next x+ {  \8 i. `# I8 Y# w- M8 `
  22. 'On Error Resume Next
    % O& Z2 ^" R$ H9 {+ ?3 H
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b
    ' D- Y+ X# N: y8 K; X
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线$ E3 Z; h( g2 _9 F% Y# T) u
  25.     C2.Delete '删掉辅助圆
    , q. @) |% A5 J* ?7 e
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层 来自: 中国广东惠州
受教了。学到一个新的命令,还没有去测试。6 J+ I- x  i" j/ O* h- S7 w. O: u9 A
有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?: p6 ?. `! j! j/ 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 )

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