QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 6771|回复: 5
收起左侧

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

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

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

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

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

  1. , ]6 {% @( s  ?" _  a- C) X
  2.     Dim SS As AcadSelectionSet '声明选择集变量$ T3 I, w" I7 l) t
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量9 [6 y, D5 Q: K# D* {
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标: b0 C- i$ j7 h- o. }) y: @
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点
    # Z) p) n" D3 ]5 x
  6.     Dim I As Long, J As Long '循环变量
    1 S. f$ O8 @7 G$ i7 d2 `, X
  7.     Dim S As String '一个字符串,用于消息框
      ]. j1 d1 |9 F# R1 T# c5 q
  8.    
    8 T6 m6 g( e  O4 D
  9.     On Error Resume Next
    . y" |( R6 {1 f
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集
    ! t8 p/ Q: w" y* Y5 F" W! L* ^
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型
    , g0 S/ [) e6 j" G/ j1 A+ ?
  12.     Fd(0) = "line" '对象类型为直线# m6 u) C( p% F% y7 y
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线
    - q  {3 O* [7 z4 F% E+ t
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点6 m* I9 C; K0 l1 k: ]4 I1 e
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点# o  Y6 @8 ]3 h3 m! `
  16.             For J = I + 1 To SS.Count - 1
    + b8 O( h9 T3 ~6 Q5 C8 C+ D
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式1 @' Q2 k6 K$ H- Z; C
  18.                 If UBound(V) = 2 Then '检查是否有交点$ D& V7 `$ i# C$ e
  19.                     If UBound(P, 2) < 0 Then '重定义数组
    . s' S- D2 C) h, W3 c; j$ D
  20.                         ReDim P(2, 0)
    ' Q3 a- }' T6 X9 C0 w1 ]5 W# J
  21.                     Else
    6 D8 p' D4 K4 Q, _
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)
    ! U7 g1 k) }  X+ t3 z0 Y0 A% U
  23.                     End If
    5 U8 P0 N0 s2 O1 H8 r5 P
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组% {' w2 k6 K" ]8 R7 E% v
  25.                     P(1, UBound(P, 2)) = V(1)
    $ b% }  R4 F* I. m" b8 }$ z( ?" C
  26.                     P(2, UBound(P, 2)) = V(2)
    . X. a* {% ~; Y' k0 c' ?
  27.                 End If; k' W* W" o; x
  28.             Next
    $ C  z  }/ e4 Q
  29.         Next. K  D4 m2 O) `  e+ S
  30.         If UBound(P, 2) < 0 Then! \( j7 E+ H2 u
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"
    6 j" W3 L# Z( A4 j7 `8 ~
  32.         Else& t9 M! I- Z* ^1 j3 }1 _
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"
    7 U+ P; K4 y! r& x) Z' v
  34.             For I = 0 To UBound(P, 2)
    3 F4 G7 ?! ^0 J* h3 L% U, D4 l
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)* M' N# f7 n% `* n* l
  36.             Next
    - ^! e  S! g3 Z" l; F/ I
  37.             MsgBox S, vbOKOnly, "AutoCAD"
    : m) ~3 z) T% u  z. y
  38.         End If
    9 c, S6 p6 S( d& Q; h2 {( k* h6 u
  39.     Else3 i- ~  n& V; B! V1 Q& q0 l' x
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"3 s& s9 Y3 r6 M
  41.     End If
    ; O) q  A1 c5 ~+ z1 P# b
  42.     SS.Delete '删除用过的选择集' D0 v. X# k1 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 )

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