QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

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

  1. 3 U( ~/ B: f  D! @8 z5 R5 |
  2.     Dim SS As AcadSelectionSet '声明选择集变量* c5 c% M2 T3 w( i7 Y
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量) c7 @. s' z; g0 L8 S0 T* U2 w9 i( P
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标
    ' L' u9 m3 a9 B$ e4 @: {( |
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点
    - s+ G! \$ W, z( p
  6.     Dim I As Long, J As Long '循环变量( t" r/ s" {" d$ P) F, u9 a
  7.     Dim S As String '一个字符串,用于消息框
    $ {8 V: x. p+ A8 |4 U4 l0 c+ ~
  8.     / e9 k# D. d1 h6 z% _  a( x% o7 b
  9.     On Error Resume Next
      ^; _4 b3 A2 `" B5 ~0 ^& K% v
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集! H* @+ J$ b" a& P$ Z) P. A- H
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型# @5 d$ l1 o' [$ n4 y* T, e: r
  12.     Fd(0) = "line" '对象类型为直线7 N  b1 q# L4 g4 C' @
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线$ J  d" ~2 i. a; A
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点
    $ r. G9 r1 {8 t& |' ]7 Z
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点
    / S- q3 a$ f1 L- y" D, g" x% b
  16.             For J = I + 1 To SS.Count - 19 j- g6 {% r6 `' v2 e; O! E
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式$ Q* U5 M/ Q  r
  18.                 If UBound(V) = 2 Then '检查是否有交点
    : k# ^* x4 B; [) e
  19.                     If UBound(P, 2) < 0 Then '重定义数组4 s6 |7 f4 `. A
  20.                         ReDim P(2, 0)# J3 l9 y; s5 I+ }4 Z* F8 s: y' G
  21.                     Else7 b0 x, p4 o% o7 }+ j0 `: ?* @4 Z
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)" I" j- D# s, S
  23.                     End If
    7 x( o" R1 Y7 H& B
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组6 r5 y% y( l  m3 W6 L7 @
  25.                     P(1, UBound(P, 2)) = V(1)
    1 i5 a" z0 k) L6 f& I
  26.                     P(2, UBound(P, 2)) = V(2)
    6 f0 F. Y. _! s8 E; B" d- X, y% y1 T2 e
  27.                 End If$ U/ J" E" _4 O# b! ]
  28.             Next- U$ S6 P8 ^. s- _6 S* t% ^
  29.         Next& L1 A  T& n- Z- }
  30.         If UBound(P, 2) < 0 Then
    6 Q9 `0 Z6 v3 v+ U3 o6 r/ ~9 f$ C
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"' x4 J3 W6 z' W! e. L
  32.         Else8 c* r9 r' A8 h: z( a3 C7 g
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"
    ; Y4 l4 h! y5 [! v+ c1 n9 E
  34.             For I = 0 To UBound(P, 2): I. n' r7 v- K* P
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)
    ! _5 V4 k8 x; r+ q: W3 @# k
  36.             Next$ ~4 n( t+ f# i/ b+ E
  37.             MsgBox S, vbOKOnly, "AutoCAD"9 ^* q9 S# n' Q5 }1 a( I
  38.         End If
    - y+ \: i4 k) t- x
  39.     Else5 m9 u# m( P. E5 x8 y$ V# o* p
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"
    , W! S0 t. H* _. i; K& S' G
  41.     End If
    2 q! \( W) n) u" T
  42.     SS.Delete '删除用过的选择集
    ! n0 W( i: p" d; o0 m: q- ?; }; q
复制代码

评分

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

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