QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)# E! I: V! a7 c6 d
下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。) K0 R6 f( g. t9 E- \& f' D% p

& k* y: L3 W' {# MSub test()
8 C# R, l: _/ D' E3 Z; e1 m! R/ tDim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double3 k: n! q- z. V( @; E
Const pi = 3.1415926
) ~7 s7 Y* P7 s  {" ]8 Xa = ThisDrawing.Utility.GetPoint(, "shurudian a")
- J- n& `( H, b3 w/ Y* X# n3 vCall ThisDrawing.ModelSpace.AddCircle(o, 50)% J& @3 }2 \/ \4 F' U
Call ThisDrawing.ModelSpace.AddLine(a, o)9 ?0 `) h$ E& b
For x = -90 To 0 Step 0.01, @6 ^' ~. v8 n; `# o
    b(0) = Cos((x * pi) / 180) * 50
. j& a" c' I( L) B1 R    b(1) = Sin((x * pi) / 180) * 50/ X; b4 i6 a$ A5 C+ D/ w, |
If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then0 R2 L: h3 E9 g" ~- Q) i" \
     End If
& n* `3 J1 i3 }$ O0 W    Call ThisDrawing.ModelSpace.AddLine(a, b)
' p: S9 x5 E5 {6 [4 [    Next x
1 L9 `3 |2 g" O/ |  q    On Error Resume Next      
5 p! @0 e2 L1 u! H5 IEnd Sub
- p% E5 a( G- j: ]4 c  ^
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层 来自: 中国广东深圳
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层 来自: 中国辽宁抚顺
这个方法不好
7 t! Q) B% j' @5 e' @2 e其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?& ^& T8 Y0 T6 B+ J
如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点.5 O9 O% ?7 j8 I) q, k
按照这个思路编程应该是这样
  1. Sub test()8 R- \+ x9 F# a
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double
    $ ^+ j" }; `( d* {
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''
    1 Y& u9 e& ^( a, A  L6 A
  4. 'Const pi = 3.1415926
    + f/ F) w% s( q9 j/ \( ?
  5. On Error GoTo 10+ T. \3 u5 u& l9 B  `5 X( z- X! {
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")
    0 g3 o" @: y6 T6 T/ R" J
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''
    - \. }5 m4 o, i4 \0 t/ d% Z
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''
    $ U* J& Z* P0 I0 D) L  W+ M% g4 A
  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 '求直线的中点
    " u$ @1 ~& S$ z6 W% a
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆
    . k; c  j" P) |. {8 s) g6 r) v. U7 H! K
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点
    * X1 t+ n. X( ?" \% x0 l
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b6 \/ t+ u, Z% ?: w$ p  \3 k) u" Y
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)5 u! l8 s& v. ^& R! V, h
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o)
    8 \) f* ]8 f0 _+ Q
  15. 'For x = -90 To 0 Step 0.01/ n, Y, Q. |0 K" t/ X: p8 O, X
  16. 'b(0) = Cos((x * pi) / 180) * 50
    4 C( H/ L+ Q( Z% @7 [
  17. 'b(1) = Sin((x * pi) / 180) * 50( @" n  G( c$ b' `
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then+ ^4 C. |$ P, E- o# W) i& j
  19. 'End If
    4 `3 R1 i+ T/ m. {" }4 N
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)
    5 M: h- b; `6 ^1 f6 r
  21. 'Next x
    ) y" J% p' D% D4 u/ k! y
  22. 'On Error Resume Next
    # ]6 e7 ^% G) f
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b
      |7 q7 e: Y/ T
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线
      s- d7 o; g# l: \0 G- e
  25.     C2.Delete '删掉辅助圆% j+ O$ [- L# H- y
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层 来自: 中国广东惠州
受教了。学到一个新的命令,还没有去测试。
$ x% ]& F( z5 k# ]3 o" h有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?- a6 ]& S; }. B0 ~5 S# C9 m
原来的-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 )

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