QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
通过点A画圆O的切线,相交与B点。A点已知,圆O 已知(共2个点,现在是举例选择一个点)6 L5 \. f9 x, G' T
下面是我自己写的一些代码,怎么找不到那个点呢。。求高手赐教啊,在线等啊。困了好多天了。" x% S8 X/ I. l$ f

* O3 S! Q' q' h( @Sub test()
6 }7 _5 t* p* XDim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double
3 [  D/ w; Q+ cConst pi = 3.1415926) b# f$ T# ~2 }1 m+ R
a = ThisDrawing.Utility.GetPoint(, "shurudian a")2 X/ t$ q7 o, I4 X& Z2 S' H8 W
Call ThisDrawing.ModelSpace.AddCircle(o, 50)
  H; y1 m& @; wCall ThisDrawing.ModelSpace.AddLine(a, o)
' p9 N3 _  H0 W1 Z& |* Y+ v6 w8 dFor x = -90 To 0 Step 0.01: a) `$ G3 k# C, M
    b(0) = Cos((x * pi) / 180) * 50
* y2 q! K0 P4 c( }0 z6 T$ z0 I    b(1) = Sin((x * pi) / 180) * 50, J, ], H8 [" z1 J2 i# D
If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then% z) Y' L; d2 w/ ^9 C0 o. [
     End If* V! H2 m( N4 p, k" @/ h
    Call ThisDrawing.ModelSpace.AddLine(a, b)
" ]( [6 O1 c/ L" b2 c9 m6 V    Next x
3 T0 b7 G. P' K  n9 Y: o    On Error Resume Next      
1 k+ U2 ?+ x( f/ \+ C, xEnd Sub! k( d1 u7 Y% v2 W6 h9 g; j
 楼主| 发表于 2013-6-11 11:02:28 | 显示全部楼层 来自: 中国广东深圳
谢谢大家关注,现在我自己已经搞定了。。需要的可以留言。。。
发表于 2013-6-12 10:46:52 | 显示全部楼层 来自: 中国辽宁抚顺
这个方法不好, N( u" A/ [# W- W* m4 c  e2 H
其实用VBA从后台画图也需要用到前台手工画图的技巧的,就是几何知识.回想一下当初学过的数学课程,难道没有电脑或者没有VBA就画不出从已知点到已知圆的切线了吗?
' L7 m+ A+ a- D) r* L如果在纸上画,应该是用从已知点到已知圆圆心的线段做直径画一个辅助圆,辅助圆与已知点的交点(两个)就是所求的两个切点.
- O, Y5 e, {. I1 n, }4 M" b0 H按照这个思路编程应该是这样
  1. Sub test(), E% l3 t! ]# B6 a2 j" j. l( P) l
  2. Dim a As Variant, o(0 To 2) As Double, b(0 To 2) As Double
    7 C& a# @4 Z1 O! {7 w/ R8 X* e5 \
  3.     Dim V As Variant, C1 As AcadCircle, C2 As AcadCircle, L As AcadLine ''''''''''''''''- F* t# v# h2 U: H
  4. 'Const pi = 3.1415926' b' f: D. T, L. M/ n% f
  5. On Error GoTo 10
    3 S9 U1 z1 H$ J# d8 o( N8 v
  6. a = ThisDrawing.Utility.GetPoint(, "shurudian a")2 @8 }; J6 T( w9 A- _' u9 ]
  7.     Set C1 = ThisDrawing.ModelSpace.AddCircle(o, 50) '''''''''''''''''''''''''
    ! X: \, X6 m& s( z2 s
  8.     Set L = ThisDrawing.ModelSpace.AddLine(a, o) ''''''''''''''''''''''''; |: U, V+ v$ P5 M, i
  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 '求直线的中点
    - b: y% V$ }7 i" I
  10.     Set C2 = ThisDrawing.ModelSpace.AddCircle(o, L.Length / 2) '以直线中点为圆心,直线长度的一半为半径画辅助圆7 b1 Z7 K" G8 W! K- m9 {! [6 j
  11.     V = C1.IntersectWith(C2, acExtendNone) '得到两圆交点,即两个切点! G* @* g" B5 J0 k* ^+ t. R
  12.     b(0) = V(0): b(1) = V(1): b(2) = V(2) '第一个切点赋值给点b
    1 g( a7 n$ k/ l# d( Y$ k* N2 @
  13. 'Call ThisDrawing.ModelSpace.AddCircle(o, 50)
    2 [* N* v) q% w' G6 u, f
  14. 'Call ThisDrawing.ModelSpace.AddLine(a, o)
    ' ]4 b0 H) L; X( H
  15. 'For x = -90 To 0 Step 0.01; g# b6 Z' ^" Q. q; d# z& U
  16. 'b(0) = Cos((x * pi) / 180) * 50
    + k% |9 C+ r( x4 L; @* G# ^. k: I5 F
  17. 'b(1) = Sin((x * pi) / 180) * 50# n4 o( d2 }% F; T5 Z! l4 R* P
  18. 'If (a(1) - b(1)) ^ 2 + (a(0) - b(0)) ^ 2 + 2500 = (a(1) - o(1)) ^ 2 + (a(0) - o(0)) ^ 2 Then2 {9 d+ j5 H* j" i
  19. 'End If  `  w, C7 Q" F+ d) g- X
  20. Call ThisDrawing.ModelSpace.AddLine(a, b)
    & A+ J3 R& |8 \: ]" A
  21. 'Next x
    " b# I3 }; i: t' H' @8 n9 M
  22. 'On Error Resume Next0 H: Z1 c) E( X1 B* q6 j. `* I
  23.     b(0) = V(3): b(1) = V(4): b(2) = V(5) '第二个切点赋值给点b
    6 m7 ^2 A# X( B% M- l
  24.     ThisDrawing.ModelSpace.AddLine a, b '画第二条切线
    8 b- c3 l6 B( I9 j! L$ v( W# l
  25.     C2.Delete '删掉辅助圆
    4 j' C2 j+ ~2 }" W& O6 u
  26. 10: End Sub
复制代码
 楼主| 发表于 2013-6-12 19:27:31 | 显示全部楼层 来自: 中国广东惠州
受教了。学到一个新的命令,还没有去测试。
% l) G& h9 ~, J* e! X7 Y' o有一个疑问,既然能得到v的坐标,为什么不直接计算,还加入for循环体做什么?
3 u3 x/ T, ]9 y' m5 k7 @原来的-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 )

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