QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
goto3d 说: 此次SW竞赛获奖名单公布如下,抱歉晚了,版主最近太忙:一等奖:塔山817;二等奖:a9041、飞鱼;三等奖:wx_dfA5IKla、xwj960414、bzlgl、hklecon;请以上各位和版主联系,领取奖金!!!
2022-03-11
系统
[系统通知] 平台第一个项目外包——项目拼多;正式上线,欢迎各单位个人有外包、设计、采购、加工需求的,在此寻找更牛的解决方案
2021-07-01
查看: 2534|回复: 4
收起左侧

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

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

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)" L, h" b5 ]) a( `+ [& B
下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。
8 e1 _) `1 ?7 M8 ]* \7 Z
6 Z& m( ], }. `5 l7 P" ]Sub test(): A- Z& i) ?3 u) Y/ A/ B" _
Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double8 P- X& ~* a2 Z8 [  M% t) R
Const pi = 3.1415926( f# l4 J3 ?% c  q0 D5 {7 d
a = ThisDrawing.Utility.GetPoint(, "shurudian a"): X: b7 |1 \+ P% T, _& R2 V
Call ThisDrawing.ModelSpace.AddCircle(o, 50)
; v1 J& n9 [8 f: G) t& uCall ThisDrawing.ModelSpace.AddLine(a, o), x9 f1 k; E! N- d! \  D9 [
For x = -90 To 0 Step 0.01
* A7 c1 O! x, ]    b(0) = Cos((x * pi) / 180) * 50- h( A2 {! E, g9 ]7 V. \/ a
    b(1) = Sin((x * pi) / 180) * 504 Z* D- G7 V. R5 e: q2 B% c( M7 g6 `' O
If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then3 P# u: k3 e- E2 w: s: o* k
     End If
# Y: B. x% u/ g2 n2 ^    Call ThisDrawing.ModelSpace.AddLine(a, b)* K8 W% O# A% Y& O2 p' \$ a% x& R% l7 Q
    Next x
, |8 K- l$ h0 {; t; k    On Error Resume Next      
. ?) C( ?$ o8 B# VEnd Sub
- [% G; ]7 `7 ]" ]  K; t
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层
这个方法不好7 b' u5 [; ^8 c1 a2 k
其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?& R2 k& D1 M" t" _9 q3 \8 ~! y
如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点.
( O/ n& g4 q5 B  e- ]/ f* [按照这个思路编程应该是这样
  1. Sub test()4 w* t3 k5 i& a/ L* C+ N' x: M5 O2 H
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double$ U- a* x- M& a' V0 m7 C
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''4 z7 B; E& Z2 Q5 a2 K: d
  4. 'Const pi = 3.1415926: Z. Q+ F3 e. G" g
  5. On Error GoTo 10& p7 c, B, _% V- p: a- H1 u! \0 e
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")
    ) r$ {. G2 t, _; u
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''
    8 @) ]# [' ^  y( Z
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''
    7 Z2 J6 m% m/ Z9 E  {
  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 '求直线的中点1 N4 z! h/ ~$ O# K5 w
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆
    ( i' |0 I% ]" x8 H
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点
    1 ?3 m7 B! j0 B8 }: [8 ?
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b
    + [1 P3 t3 k. }& k3 s9 S
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)
    : l& x7 }3 N- d  z7 {2 J
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o)% V3 K( Y! V6 w2 A! s7 ]
  15. 'For x = -90 To 0 Step 0.01
    : s; G3 f; J( X( B
  16. 'b(0) = Cos((x * pi) / 180) * 509 j5 s8 o, Z; R: }
  17. 'b(1) = Sin((x * pi) / 180) * 50
    ' F! h% D) ]2 j! ?( W( k- O
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then4 N: |, @* o1 ?$ C4 R& ?+ |
  19. 'End If
    6 ]7 W3 v- G9 R
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)
    9 `: y2 S) Y$ {$ |0 p$ T5 [
  21. 'Next x% z* z6 p$ e7 \% p& g9 r- A) I
  22. 'On Error Resume Next
    , O  ~" U. z- i; W& w+ y
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b; V' ]0 `8 q" c7 j# e/ `
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线
    ' _; B- G" L. W: r! ~8 y% V
  25.     C2.Delete '删掉辅助圆
    9 f# |% L6 ^& T" ?# G
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层
受教了。学到一个新的命令,还没有去测试。
" W- F- j* Z7 a# h6 q+ f1 g有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?- q. G6 \+ h% y  j0 b+ V
原来的-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 )

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