QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 2686|回复: 4
收起左侧

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

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

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)) H* w- d" @! }1 v! v
下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。
+ Y) j4 e3 h; O; p  r3 D9 z% V: S5 S' x6 z5 y: L( ?4 M
Sub test()* g  k' ?) d1 O: z# {) [5 |
Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double1 ~# ]+ H4 O& J0 B
Const pi = 3.14159261 @$ P, R4 w  r6 A9 E8 O
a = ThisDrawing.Utility.GetPoint(, "shurudian a")2 W/ q/ }4 B5 z
Call ThisDrawing.ModelSpace.AddCircle(o, 50)6 a  ?4 w6 h8 U6 g
Call ThisDrawing.ModelSpace.AddLine(a, o)! z3 Q. t* R& W" `& ?" S( D
For x = -90 To 0 Step 0.01
& U6 x  {' T7 o4 b    b(0) = Cos((x * pi) / 180) * 504 E5 a/ z2 b5 X6 h3 b
    b(1) = Sin((x * pi) / 180) * 50% k! x: i* l; B$ H9 T0 {; M/ S5 j
If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then
0 Y* I. W9 H0 h& c- I* M3 Q     End If% F7 M" j. y' u1 q$ d. l; |, O
    Call ThisDrawing.ModelSpace.AddLine(a, b). d/ w7 W9 |5 M; x8 I( k+ y' s
    Next x" E5 n% A9 M* V0 p( K5 y6 [4 `
    On Error Resume Next      5 G6 C& h1 |, N
End Sub
; D& O9 @  l1 H. b1 d
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层 来自: 中国广东深圳
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层 来自: 中国辽宁抚顺
这个方法不好9 C( ]" N' ~+ G8 {! W; x
其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?  B  T0 ^# U$ X% t
如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点.  Z8 w: u, J$ i) X# R
按照这个思路编程应该是这样
  1. Sub test()6 R0 y6 g; r  D( j
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double1 r5 k4 E: s: ?5 l- y" G
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''
    0 R7 `/ R. d' h; Y* R2 @/ W
  4. 'Const pi = 3.1415926
    7 M2 n, I( T9 q$ y+ `
  5. On Error GoTo 10# S' W$ l! t0 H0 E: M" h' v
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")0 K) a3 Q& \/ q6 I4 Q$ q
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''! @. y3 ^# M1 i
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''
    9 K+ k7 f- _5 _. D: K9 j  \
  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 '求直线的中点; m; w  |' \: A4 o! g( p- u# q
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆
    4 K* v! w' P& B/ k# X. m. [! ]
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点
    " k; w$ _$ `3 @: q, u: f" f# O3 S
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b
    " h: ]' c+ P# Z  C4 J
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)5 s9 }) W; |5 ?0 r7 s
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o)1 m* A! \; ^% h
  15. 'For x = -90 To 0 Step 0.01
    & j' s$ i/ T. j4 Q" I2 r& Q; H* F
  16. 'b(0) = Cos((x * pi) / 180) * 50
    ( n* D3 g% u0 W
  17. 'b(1) = Sin((x * pi) / 180) * 50" e+ d* b" y5 X+ 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
    7 w( Y) a+ ?" Z; z8 ]4 |; o) c7 i
  19. 'End If
    ; T) K: n" f! {
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)
    ( {6 M/ N& Q( h
  21. 'Next x6 e( ]+ c: e# [6 v1 L
  22. 'On Error Resume Next
      d% S. ]9 c" v* ?( b  Z
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b
    3 S9 s; z$ ?" G: ~* ^9 T& B
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线
    4 V( A1 h& \* Z+ g/ a# i3 G
  25.     C2.Delete '删掉辅助圆4 N  U, B5 U! N2 W3 ?
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层 来自: 中国广东惠州
受教了。学到一个新的命令,还没有去测试。  t% |( m# z, }, ?4 k+ p9 F' @1 _
有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?8 C; a- g: k: [0 t& 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 )

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