QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)- R: o, S( r+ D3 A1 ^
下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。' v" W) f( g# H5 `) R

  K: n4 s* @6 ]' h1 wSub test()8 V5 m% R( x8 @: C) B
Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double4 x. }! s! l2 M) u' B9 P
Const pi = 3.1415926
! X6 l3 A8 _+ E9 aa = ThisDrawing.Utility.GetPoint(, "shurudian a"). p1 z; A/ A- J
Call ThisDrawing.ModelSpace.AddCircle(o, 50)
; ~3 q/ D, ^/ h2 |Call ThisDrawing.ModelSpace.AddLine(a, o)
8 y, r* O, i% fFor x = -90 To 0 Step 0.019 r6 J# R0 V6 t' T
    b(0) = Cos((x * pi) / 180) * 50
( m5 a4 b6 D% U1 @. Z8 H    b(1) = Sin((x * pi) / 180) * 50
4 T9 c% I( {$ z$ K) [' ^ If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then$ T2 _- Z  N% i! R$ q+ K) ]1 ]$ g
     End If0 z  O2 a3 b6 H
    Call ThisDrawing.ModelSpace.AddLine(a, b)
) ^* a9 I4 R: Y, |5 b    Next x
0 B7 M3 b$ ?5 c    On Error Resume Next      ; N5 Q( a) A" Z9 }* M. O$ K" L
End Sub
6 r1 y$ k9 o0 N9 e! P6 a
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层 来自: 中国广东深圳
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层 来自: 中国辽宁抚顺
这个方法不好5 \* U# |6 l/ q
其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?- k! V/ b% Y1 E2 n
如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点.
5 J1 m8 F5 J$ s  u7 x/ q' n$ ~# ~  c按照这个思路编程应该是这样
  1. Sub test()% S! l4 W1 {. o6 g+ r- K
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double
    " [: T% L3 f- H* F" R
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''2 o4 V2 v& u8 t: k0 ?( l. ]
  4. 'Const pi = 3.1415926
    # A9 M0 p1 X; ~6 U2 E/ D* r
  5. On Error GoTo 10( I2 C5 I7 i2 T% Q0 ?
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a"): k; T2 N: R! s
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) ''''''''''''''''''''''''': n( r' `6 @2 [- ?
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''
    1 i2 @0 k& }, p$ S) S# 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 '求直线的中点, V: u+ O4 W0 I) E1 `( r
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆
    + c" Q1 \0 x4 e  z) j
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点
    # H" M4 A- Z$ e% ]( X' P; o
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b0 Z1 R- V( x4 w* U; R
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)
    , S5 L4 D. Q" B0 w
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o)
    8 _; K9 x% ?: P0 t, \
  15. 'For x = -90 To 0 Step 0.01
    : B/ z! K- p! N$ @
  16. 'b(0) = Cos((x * pi) / 180) * 50. _  L  O3 ]0 W3 A
  17. 'b(1) = Sin((x * pi) / 180) * 50
    ; _) i2 I  s2 T7 v
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then4 o% `6 s+ p4 y6 U. x
  19. 'End If; f0 r5 ~9 j+ x3 O6 T4 M+ n
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)2 v2 |; z; L+ c1 N) J% ]
  21. 'Next x7 K2 _7 M1 B8 Q/ T
  22. 'On Error Resume Next: E/ x% z2 l( V. n% P
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b
    8 `9 u$ o/ Y4 }- V
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线
    : t0 C* N+ A! V7 R& h
  25.     C2.Delete '删掉辅助圆' j( v) |7 J+ k6 Q9 f2 |
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层 来自: 中国广东惠州
受教了。学到一个新的命令,还没有去测试。
$ W! W: ~. a' a2 ^% I- Q有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?
- g4 y$ m4 P7 K" \, ~8 ~原来的-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 )

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