QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 6799|回复: 5
收起左侧

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

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

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

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

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

  1. & l2 @' h8 \* G0 k, I6 h- T* h
  2.     Dim SS As AcadSelectionSet '声明选择集变量
    # m! b; k9 M2 |+ ~
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量8 B+ D# x* g) }7 h
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标& A* C+ v0 }# n/ a2 z# V' F
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点
    . |& o6 U+ W1 ^6 V& x1 G
  6.     Dim I As Long, J As Long '循环变量
    9 w8 g+ C6 v3 l* B' H
  7.     Dim S As String '一个字符串,用于消息框' e2 ~% l! v: h
  8.    
      I* b1 C- G2 a
  9.     On Error Resume Next: z+ Y; n# f# B$ r% |' H3 R0 v
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集
      k! M+ X- C& l) k& n2 u% d& c4 n% r
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型
    # S# w* i+ i4 T7 ?
  12.     Fd(0) = "line" '对象类型为直线# H; N8 w% D$ j2 b- `% V
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线2 ~( t7 c- r2 q! c, P
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点
    2 t; F2 S" O* _# h9 [6 B
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点- G; o" K$ V" F4 O% O8 b
  16.             For J = I + 1 To SS.Count - 1, C( G4 y  m5 _0 t( c! _
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式0 E2 L- r' d- c% z
  18.                 If UBound(V) = 2 Then '检查是否有交点
    $ O& {3 j( R1 j2 K
  19.                     If UBound(P, 2) < 0 Then '重定义数组0 t: n' x& U2 Y" a+ j2 S! ^
  20.                         ReDim P(2, 0)5 }, e3 C+ f2 H" |/ `' y; C3 A
  21.                     Else
    : W5 ?$ M7 c. P5 _5 I+ F
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)! ?/ G& c% j* z& {5 J* w; [' Q
  23.                     End If8 R% M- j( Q( N. b/ s
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组
    ' f  w% {3 C5 I8 E4 j8 s1 {
  25.                     P(1, UBound(P, 2)) = V(1)
    / w) W4 U: B# \) `% [% R
  26.                     P(2, UBound(P, 2)) = V(2)
    # G8 g& q# a# q; p8 W+ c' H/ p
  27.                 End If
    ' g: m- g" s5 z- z5 B7 R3 l- z7 o
  28.             Next
    6 [  W- F2 Q- J7 ]; D
  29.         Next
    7 ~: [* \" q" G/ `8 k6 h
  30.         If UBound(P, 2) < 0 Then
    & O; V+ }2 E* D
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"5 {. F) j4 {3 c" K9 Y$ }# v
  32.         Else
    , ]: B% p( f: H7 \
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"
    8 v7 Z4 q+ i+ r) u
  34.             For I = 0 To UBound(P, 2), X, w( \( E- O- Y! G
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)
    7 N) r& E- v6 V$ @
  36.             Next9 o, D/ K  z2 q+ O+ Y( |+ {( q
  37.             MsgBox S, vbOKOnly, "AutoCAD"
    - X- @$ D# s' m# O6 `  f) V& a1 U
  38.         End If4 w, Q4 R- Z- x+ W' y; E1 m5 o
  39.     Else6 U! T. x0 e9 c- Y
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"
    3 M' R5 x' u+ O: \, K: ?9 b
  41.     End If
    & S5 b( c6 T9 K7 h- S4 C
  42.     SS.Delete '删除用过的选择集
    6 d) I, c- f/ O* W, W1 H
复制代码

评分

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

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