QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)
  P  W$ O5 D- G0 C下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。
. O2 R4 \7 z; i. g8 v% S% o& t  J# n$ `
Sub test()& z/ T6 z: ^( E9 t8 F9 N
Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double+ f6 `6 z6 j1 n% H
Const pi = 3.1415926
  m; \) \3 y1 L: I( {a = ThisDrawing.Utility.GetPoint(, "shurudian a")
# Q* n4 Y* E& f* DCall ThisDrawing.ModelSpace.AddCircle(o, 50)
- \! `7 g5 h" X  X- U& {6 SCall ThisDrawing.ModelSpace.AddLine(a, o)( s! O8 O4 s* S) d
For x = -90 To 0 Step 0.013 b5 ~8 O/ V# j" U) O5 \9 P) N
    b(0) = Cos((x * pi) / 180) * 50# e" ~) f' T/ E+ V$ `8 s4 [
    b(1) = Sin((x * pi) / 180) * 507 E; f7 \, T" [% ?/ |2 S
If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then. p8 l7 m) x2 P& ?: \: f
     End If+ c- Q# k( n- ~
    Call ThisDrawing.ModelSpace.AddLine(a, b)$ s  j  T* L& k! o  G& D- r
    Next x3 r) G( O7 U3 |: `
    On Error Resume Next      8 F$ m9 k  V& r$ k7 G. _
End Sub
- s1 j% F5 c" T4 R2 r9 A
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层 来自: 中国广东深圳
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层 来自: 中国辽宁抚顺
这个方法不好3 d; F. U5 Q' Y( J! u4 Z
其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?
0 N9 i! V$ ?7 R, H! }  F/ e+ @如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点.
6 |! Q; g7 `" ~: R+ I$ E! e按照这个思路编程应该是这样
  1. Sub test()
    + i' C7 U) e% ^( p$ {7 N, E) J3 p4 F
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double/ i$ }9 r/ @8 A; D
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine '''''''''''''''') Z: K, T/ |$ w5 ~9 v" a2 c
  4. 'Const pi = 3.1415926+ n$ |, s. M9 M* H6 {" B
  5. On Error GoTo 105 ?8 _. H1 n3 S1 d7 R# O$ K
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")
    ; R' ]; w; W% d5 i$ ^) M
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''$ b9 W% X: X/ m" `  R& U' P
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''
    ! T7 c* S1 Y- X- N: q
  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 '求直线的中点
    7 J1 H8 Q  f* j  J+ p$ \" i
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆
    7 }! L( t* t6 c4 B  b! w
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点
    ; P. k. k# y$ o6 ]! j0 p
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b! }* N4 Q* H, G7 k! Z
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)
    4 |3 t& y$ Z" B. t5 q  Y
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o)
      }/ Q! Y: M# n  }8 T
  15. 'For x = -90 To 0 Step 0.01* F  i4 {' v  U* r/ `; a# G: a5 ~
  16. 'b(0) = Cos((x * pi) / 180) * 50
    9 h' e- V+ b' y
  17. 'b(1) = Sin((x * pi) / 180) * 50
    % ?3 V* p' r8 D1 m8 ?
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then
    7 t7 r1 M: X$ ?1 S! q. f5 I7 f
  19. 'End If
    . A) C' y  H9 S( t
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)$ [# C( f7 Z! g; d6 J
  21. 'Next x
    ; B$ ?# H3 C# T+ A1 y/ w5 v
  22. 'On Error Resume Next
    9 @, o1 M* {) n6 \* c) I
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b
    8 w1 G' K9 o9 W- ^5 Q
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线' P1 i# ~9 ~7 q
  25.     C2.Delete '删掉辅助圆9 @! ]+ e# M* V* B8 Q
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层 来自: 中国广东惠州
受教了。学到一个新的命令,还没有去测试。
4 x3 @7 w4 P2 g! M* C* v% W有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?
/ H) V+ T% r; ]3 \) e: j/ n原来的-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 )

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