QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 版主微信号:caivin811031;还未入三维微信群的小伙伴,速度加
2022-07-04
全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
查看: 2533|回复: 4
收起左侧

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

[复制链接]
发表于 2013-6-10 21:52:06 | 显示全部楼层 |阅读模式

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)
( e' i5 @7 @1 u1 H. J下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。! |; e% M! n, d1 h+ F: o0 j

5 v# t! m9 S: {8 K1 i0 uSub test()
  N. r6 M/ _8 Q+ M7 }" {Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double: Z' C+ ^' R0 Z! [- v4 N
Const pi = 3.1415926
- F3 w# V- F, |1 r2 v" d0 t- Ka = ThisDrawing.Utility.GetPoint(, "shurudian a")
8 a/ H: v/ j' n* ^! q( ACall ThisDrawing.ModelSpace.AddCircle(o, 50)
. ^6 x+ k: X* z1 P4 y: mCall ThisDrawing.ModelSpace.AddLine(a, o)9 u; K" h1 P, E! j0 s5 O! ~* \, ]
For x = -90 To 0 Step 0.01
- c  D2 f% W# d+ s4 z    b(0) = Cos((x * pi) / 180) * 50% Q$ B' T5 `, l* j7 I$ R0 q9 b  R
    b(1) = Sin((x * pi) / 180) * 50
9 `* r- N! `. E- T) t$ A: s If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then6 z+ w% y, ?' t8 S. j, c2 T
     End If/ T# m7 @8 Z" v0 v1 n& R  P1 `6 R
    Call ThisDrawing.ModelSpace.AddLine(a, b)
' j$ C$ E* c- _0 r8 K7 N4 K    Next x
7 s+ R4 ]4 V' H9 z) V& N    On Error Resume Next      ( Q5 \5 x. _. ^, y; K
End Sub
0 I, ^" `4 s7 ?1 q3 s. k
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层
这个方法不好
2 D) g# _* p3 ~# q  L4 g, I其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?
3 L1 G$ b1 G, C( A3 Z3 ?9 W' S如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点.' q9 P# g8 T+ `0 n. \8 O
按照这个思路编程应该是这样
  1. Sub test()7 z' y" ^) F) x& }/ p- i
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double
    ) L$ S1 I, A2 q
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''* W( Y4 F* r5 M
  4. 'Const pi = 3.1415926
    4 o6 ?, C  a- C! ^1 E
  5. On Error GoTo 10
    9 E: w1 R8 |2 K  K
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")
    / Z" u; H: G/ ?: [0 b
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''3 `) z; ?0 W. _0 N5 m
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''
    & a3 O7 A$ [' `, Z/ o
  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 '求直线的中点
    % t5 y  D& D. ]% O! g/ c5 A
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆
    ( G1 x! ]% z6 e6 S
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点- j0 l: [! h% Y/ ~- E, L8 `2 A. j
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b3 ~% k4 g6 L: d2 f  ^
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)
    ) V- x5 Q( B5 q' ?9 g
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o)( W: Z! E1 l- [& A3 u
  15. 'For x = -90 To 0 Step 0.01
      ]. n/ |0 }. R
  16. 'b(0) = Cos((x * pi) / 180) * 50
    & L- B. c; T. j6 E! s' n
  17. 'b(1) = Sin((x * pi) / 180) * 50
    9 e/ `7 W" `# b/ m4 t! b
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then1 T3 E8 q2 W( {5 F/ H
  19. 'End If7 p6 Q! [2 Q7 W# b. b& j2 ]
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)2 i# o$ s9 n- @, d
  21. 'Next x+ y5 r$ c' C/ U) f3 Q4 ?
  22. 'On Error Resume Next
    % J3 q- ~9 v7 _9 `; ], E8 ~4 K
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b
    8 M7 w& ]: ~# S) [& ?
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线
    % ~1 t. k$ B& d6 I" n1 k
  25.     C2.Delete '删掉辅助圆
    0 m/ T2 ~  X/ x3 D
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层
受教了。学到一个新的命令,还没有去测试。
, ^. H3 M4 ]: Z- {1 e有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?
6 o  g: e* l' A/ @4 W. e原来的-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备13008828号-1 )

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