QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

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

  1. / c1 M! o% l, u
  2.     Dim SS As AcadSelectionSet '声明选择集变量3 P' e% z9 \# ?" K% u7 Z" x/ O' I9 V
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量
    6 P2 ~) @6 T$ `/ M
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标* l! W" C" e& L0 ^0 {6 b- }
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点- W" {9 v! @& J- E+ n; \* i
  6.     Dim I As Long, J As Long '循环变量
    . M* G" F% E4 J, p9 f0 {
  7.     Dim S As String '一个字符串,用于消息框+ n" r( P7 [1 }' I. R
  8.    
    3 W; d# Q0 s, r0 k5 [- T
  9.     On Error Resume Next; E" Y1 {+ D5 H) H5 @
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集
    ) ^! y& Z8 S' H0 b; k; @" P
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型3 y$ ^& G3 m- E+ ~
  12.     Fd(0) = "line" '对象类型为直线
    ! w3 m8 e" O! l1 \& K$ g2 y
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线
    4 Y) L4 ]. w" `5 p! r+ ~
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点2 f! c5 z# o  k+ q' ^
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点9 K/ o9 z" u4 g" N3 K. d
  16.             For J = I + 1 To SS.Count - 1
    1 j6 _6 s; a8 }
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式
    . s/ u7 l: ?) i  z' i$ |
  18.                 If UBound(V) = 2 Then '检查是否有交点
    - _3 G% h0 p6 o! {
  19.                     If UBound(P, 2) < 0 Then '重定义数组4 {$ ?2 a3 o3 n  D$ g" {
  20.                         ReDim P(2, 0)6 |; l5 C' t: |
  21.                     Else- e: e9 `% q4 Y- }
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)9 U# z0 H3 _8 C+ ^1 e! y$ f: q
  23.                     End If* i3 ^% i( w8 u; |' I
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组3 U4 L( q  S7 m6 ]$ Y$ F
  25.                     P(1, UBound(P, 2)) = V(1)5 k/ x' W3 L# a. H. s
  26.                     P(2, UBound(P, 2)) = V(2). g1 X" g# |+ x8 ]5 i! m* s( D
  27.                 End If9 _4 V& `! ]. P: N% i
  28.             Next
    ( i( k& D; I! o- O1 s
  29.         Next
    * z+ C/ M/ u+ ]% ^. p
  30.         If UBound(P, 2) < 0 Then8 q2 ]& G& j% F* S) }+ a
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"( N1 P: {. q- b& ]0 h2 p- x, V( C3 e
  32.         Else9 E( l+ ]1 v) R4 G) Q+ R
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"; Y. c' e. N5 l9 S
  34.             For I = 0 To UBound(P, 2)  y  P2 O- F" ~) c' E! v& ^2 Z
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I), J$ D- I+ W5 D) G( V6 ^
  36.             Next6 N+ M4 o% q2 k9 W. y" i$ M
  37.             MsgBox S, vbOKOnly, "AutoCAD"/ `2 Q; ?, c, X+ z: h" j  |
  38.         End If
    * f5 o- S, C( C- a, P. E
  39.     Else: G% D, s  Z' ]6 D- V# T3 ]4 l8 z+ F
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"
    # r* O3 X9 L% \
  41.     End If
    9 {! z) I3 ]; Z5 Y: N- V- H
  42.     SS.Delete '删除用过的选择集
    " r, h. ]2 W0 ^  b5 o
复制代码

评分

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

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