QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

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

  1. . H. L- v$ _7 g0 {9 P
  2.     Dim SS As AcadSelectionSet '声明选择集变量
    - M- x/ ]8 ^% T3 F$ F
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量
    . J3 x, ?) H4 O) q' T6 d
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标
    0 @' ~3 p. l( r3 I0 \( ?/ c. S
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点+ t7 Q- G% x3 S1 j  F. V4 j
  6.     Dim I As Long, J As Long '循环变量
    4 z$ B) I* _2 S* P, w: K
  7.     Dim S As String '一个字符串,用于消息框
    $ J- r& b! U' |9 M5 c
  8.    
    . S; S* V6 T3 F+ m$ x7 `
  9.     On Error Resume Next# J( |" [# L+ N" B# O1 W* x0 d2 R
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集. c( b# ^2 c& K! w* u8 N; A/ s
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型
    " e) W3 T/ V: s2 b1 Y- O* Q
  12.     Fd(0) = "line" '对象类型为直线
    ( [& t: E) S# j. \5 d3 M; I$ w0 I
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线, T4 z- r0 ?9 Y; }. X7 l" r
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点
    9 s  V8 d5 \6 d3 t) `
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点
    7 r" S1 o3 T$ e7 j1 {; h5 O/ E4 T
  16.             For J = I + 1 To SS.Count - 1
      d$ h: F3 h4 m1 O, i" W. L
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式
    3 z2 e* W4 h9 P( S* S  }
  18.                 If UBound(V) = 2 Then '检查是否有交点1 q6 \# k/ r0 `' G$ g: t5 {& ]
  19.                     If UBound(P, 2) < 0 Then '重定义数组% B) \3 b& q/ {# b
  20.                         ReDim P(2, 0)5 S( x* T) r! C* S
  21.                     Else' a/ X, {- m5 ~* m. n
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)
    ) Z  B. u& ?( ]  T
  23.                     End If
    + X% X" B3 V& a2 m1 ]/ D. f  b
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组
    / ^" Q5 f- _. n
  25.                     P(1, UBound(P, 2)) = V(1)- a1 G& C; Y: l; J
  26.                     P(2, UBound(P, 2)) = V(2)' j; p* ?1 v  h) @' m
  27.                 End If
    1 b- G; y8 A& k; L5 `
  28.             Next
    * ^7 g; g! K+ Z! c" F
  29.         Next2 J6 x1 O4 C0 ^7 b: j" c
  30.         If UBound(P, 2) < 0 Then
    + u! |+ o8 F  s8 H! a
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"- j" j$ p, [& o8 A4 P
  32.         Else6 x% p0 ~" c8 _0 P: j, J) y
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"# `4 \4 f. ]8 l  d3 U: C( F
  34.             For I = 0 To UBound(P, 2)& `; B$ ^  b) f4 r0 q4 @, M
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)
    $ S7 n1 V2 [5 O; B5 x1 V  H) b3 I
  36.             Next3 \4 P; r# j9 T) ]! w
  37.             MsgBox S, vbOKOnly, "AutoCAD"
    8 k; ^* y/ v9 y/ F# n1 a
  38.         End If+ a1 f5 ~9 \/ ?/ c+ \5 U6 `/ p
  39.     Else
    / d  t6 G/ W& Z, u1 d- }
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"
    & X) F' |$ k, i5 D4 p' j0 f. H
  41.     End If
    ) W7 z1 d# P8 H
  42.     SS.Delete '删除用过的选择集
    ' J- W' r6 C6 l! G0 K# R
复制代码

评分

参与人数 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 )

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