QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
8天前
查看: 6773|回复: 5
收起左侧

[讨论] 提取所有直线的交点坐标?

[复制链接]
发表于 2009-4-2 18:44:04 | 显示全部楼层 |阅读模式 来自: 中国江苏无锡

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

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

x
请教一下大家,我在cad中用vb画了一系列直线,要提取所有直线的交点坐标,该怎么编程实现?
发表于 2009-4-2 22:04:57 | 显示全部楼层 来自: 中国辽宁鞍山
我觉得可以先提取所有直线的两个端点,然后以每条线为基准循环测试,逐个记录交点,求交点可以采用几何算法
发表于 2009-4-4 07:20:13 | 显示全部楼层 来自: 中国

  1.   T- }" A4 M1 Y* P. q# V) N
  2.     Dim SS As AcadSelectionSet '声明选择集变量0 D$ ]% P/ p( @# Q
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量- N( {7 D9 I* Z
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标. y; c; c7 @- z, [8 t
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点2 O5 \3 B# T* a  t- Q2 d7 p- F* k
  6.     Dim I As Long, J As Long '循环变量0 s# t" g% s- N; l# J2 f9 f
  7.     Dim S As String '一个字符串,用于消息框2 i0 b0 z) Q; }7 w5 \6 ]% {
  8.    
    # K1 X9 O6 C" B1 L# O
  9.     On Error Resume Next
    2 M3 U1 y# a7 M. C
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集3 ?. p9 q2 m# Q
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型
    ( D7 L  s0 `* M/ i
  12.     Fd(0) = "line" '对象类型为直线+ E; i' m% |" Y, u' @
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线
      n7 a. e9 n( }( u0 z! X/ B
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点
    5 R5 Y# h+ {7 }4 y
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点( C/ @2 }3 R0 L3 ~& Q# i( z4 o9 d
  16.             For J = I + 1 To SS.Count - 1
    3 T, h, Y) \# f
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式
      O) U" p. m; i5 g: l8 ^2 S+ A% C
  18.                 If UBound(V) = 2 Then '检查是否有交点
    $ f0 e; ]7 Y# @8 N1 ^
  19.                     If UBound(P, 2) < 0 Then '重定义数组
    : w. T  G2 h; b
  20.                         ReDim P(2, 0)& j# }0 J. G7 Y- z" [( r8 D+ U0 I
  21.                     Else
    5 A7 q  k; n6 w* ]/ u3 G
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)
    ; ^4 I8 J# m) V  E7 u; X
  23.                     End If, P: I: C" f1 Y% q0 L0 g9 B( [
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组
    # z: u$ U& `) l1 {5 |' }# E
  25.                     P(1, UBound(P, 2)) = V(1)5 n2 z. K% g4 s. s% B
  26.                     P(2, UBound(P, 2)) = V(2)
    - S) H* M' _* m' [8 y4 c" g
  27.                 End If
    ; b" U; Y. |' V* S% ]" W3 G, G$ g; A& O
  28.             Next" Y# N. l- }- Y
  29.         Next. Y9 }; d6 b* l2 Y3 B
  30.         If UBound(P, 2) < 0 Then+ V4 `1 @2 e. Q3 {2 p: g+ o
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"
    5 @, s* N4 g3 I, }1 c" N7 r
  32.         Else1 d3 H2 g7 m; l8 k5 e( J/ j
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"8 ~/ F8 O  Y- j; I9 P3 ~
  34.             For I = 0 To UBound(P, 2)7 S% h) j* [" D
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)
      x2 S5 v' H/ l/ I4 X% r
  36.             Next& m1 g9 }& U4 S% U5 ?- |3 g
  37.             MsgBox S, vbOKOnly, "AutoCAD"! {2 F4 }4 W" ^  B  x- b. z
  38.         End If
    * M9 n. p* \" |8 S% c' b
  39.     Else) b0 d# P1 K7 K" T8 Q$ ]
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"
    ! L+ E& ]0 a  u+ {# e
  41.     End If
    6 g- D' j$ G/ E! B
  42.     SS.Delete '删除用过的选择集
    3 r# p& z4 F9 i& h/ k
复制代码

评分

参与人数 1三维币 +8 收起 理由
★新手★ + 8 应助

查看全部评分

 楼主| 发表于 2009-4-5 20:42:37 | 显示全部楼层 来自: 中国江苏无锡

谢谢了,我去研究一下!

谢谢了,我去研究一下!
 楼主| 发表于 2009-4-5 20:45:43 | 显示全部楼层 来自: 中国江苏无锡
写得非常详细,非常感激
发表于 2009-4-11 12:05:32 | 显示全部楼层 来自: 中国北京
谢谢版主,又学会了一种方法。
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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