QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点): S2 i( Q( ~* N& E8 M+ ^- i
下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。' W- P  q6 D, o. J

. x1 N* U0 b7 _; ~7 ESub test()( `, L" h8 c$ ]9 j! L4 c) D
Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double
+ y! J- }) ~0 L5 z! U6 b9 \Const pi = 3.1415926% f$ V0 U/ L! ^
a = ThisDrawing.Utility.GetPoint(, "shurudian a")
4 g0 J& x) A7 v5 G: O' X6 ~Call ThisDrawing.ModelSpace.AddCircle(o, 50); g9 N  B7 a. h5 d9 g
Call ThisDrawing.ModelSpace.AddLine(a, o)
8 @' s, ^8 i2 j* I7 c) S4 {For x = -90 To 0 Step 0.01
) N: g! h% V% p3 o8 S    b(0) = Cos((x * pi) / 180) * 50
+ h) B6 H3 \. e" K* P+ L, \4 c4 x    b(1) = Sin((x * pi) / 180) * 50
* N  `6 j8 j; M0 |+ I0 S If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then* \8 Q: o! C7 w- a, U3 j
     End If
& Z! s  {! [; F( O    Call ThisDrawing.ModelSpace.AddLine(a, b)3 J5 i$ v( R: s. M. C
    Next x
6 I& w" `# G2 u# p+ ]; L    On Error Resume Next      
2 m4 o! t' e2 b( ?% SEnd Sub) u& e# |4 Y: R8 E" W
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层 来自: 中国广东深圳
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层 来自: 中国辽宁抚顺
这个方法不好
9 E' D) Z; T4 E1 w1 p6 W8 d其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?
' y  m4 v0 I6 L; N1 w7 j如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点." X5 M% {' b+ x/ |. H! c( f
按照这个思路编程应该是这样
  1. Sub test()! c( P  P% E- v+ j3 w* l2 ?- @: _$ n
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double7 F9 j  j8 i& x" S% a0 p3 S3 Z
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''
    * |( {( r9 ^8 s7 `2 [7 |& u2 |
  4. 'Const pi = 3.1415926# l7 U( T/ P* h+ O5 ~7 q
  5. On Error GoTo 104 o% [1 {) Y4 p/ k7 p+ J7 V* x% @
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")0 O1 @) Y4 h6 N! u! q9 z, Q, t
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''0 t( }: i+ E& Z/ z0 o4 |
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''4 T$ _- {4 ]6 }! g% W3 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 '求直线的中点
    0 Y( }& B. J3 n7 P% [
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆$ t8 M& W! Y; `' E2 c/ P4 _
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点5 j7 g) C/ X! G$ [! O
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b$ ~) a: q3 `& W9 b
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)0 W: L$ X% y8 f8 y" A( N
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o); Z; `. f% n! }7 _* ~6 H) x
  15. 'For x = -90 To 0 Step 0.01
    9 Y" c0 G/ @. ~
  16. 'b(0) = Cos((x * pi) / 180) * 50
    0 x, ^, i+ F3 D' i2 |" w# ]
  17. 'b(1) = Sin((x * pi) / 180) * 505 M8 b0 o8 |0 G4 Y
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then
      a& t( |& F# f  {
  19. 'End If
    + ~) L' t( `# Q/ M# V% Z
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)" [2 W$ B$ N  d
  21. 'Next x
    5 ^# A; D  r- U8 i6 ~0 _  b
  22. 'On Error Resume Next/ A. o8 J, S  ~' g0 e7 N2 h8 k/ o
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b1 A' n* }9 r2 `8 y
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线
    - u( b( h8 l0 U
  25.     C2.Delete '删掉辅助圆! v( p; E2 s5 C0 {, g
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层 来自: 中国广东惠州
受教了。学到一个新的命令,还没有去测试。; G- u! M( C' D6 Z% J
有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?
( H4 {; q9 ^8 F$ P原来的-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 )

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