QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 6770|回复: 5
收起左侧

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

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

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

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

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

  1. 3 a: W/ V  X9 c1 d9 U* b. i
  2.     Dim SS As AcadSelectionSet '声明选择集变量
    7 L  s" _. j2 ?
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量
    8 }% G3 L- z. r$ H5 F5 I0 a
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标) j/ S6 {8 p0 ~. \
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点
    # M! W8 i+ x! I# M3 P( j: v
  6.     Dim I As Long, J As Long '循环变量" c3 m7 ~$ N% Z' ~) @  @1 g# m
  7.     Dim S As String '一个字符串,用于消息框7 Y4 d2 @2 P4 X" j0 O& i
  8.    
    + G4 ~4 D5 |7 x$ }
  9.     On Error Resume Next
    - M: B( x( T5 x# O/ k
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集3 `; l! r) \) f# v& p0 r0 L
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型
    / p3 ^$ I3 {) z' L( a2 }
  12.     Fd(0) = "line" '对象类型为直线
    ; x; y- K: Z2 S  F+ y6 z% I8 f, y; c
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线' S+ a4 F) Z' r  k6 R
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点* }7 U$ n5 p2 C' }: y4 `
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点$ C5 p0 L8 s; Y1 ?% [8 T+ y: ?- T
  16.             For J = I + 1 To SS.Count - 1
    ) D* q& M. T6 T/ y: S% }
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式
    ' I& s, Q, [$ q& e
  18.                 If UBound(V) = 2 Then '检查是否有交点5 B& b' _. v/ U
  19.                     If UBound(P, 2) < 0 Then '重定义数组1 M  Q$ b+ k( L' L4 p; W0 A5 P
  20.                         ReDim P(2, 0)
    & I, b" H% T( N( I1 p
  21.                     Else( m0 k8 c5 G; w* Z4 b
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)
    6 G7 ?% R( r4 Y9 z* ?; x1 o' R
  23.                     End If  I0 ^3 T2 t5 Y) o  G. D, y- h+ W1 c
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组8 g# h9 j. l) h4 n
  25.                     P(1, UBound(P, 2)) = V(1). Z" J8 _2 l$ h- g4 ]! }3 _
  26.                     P(2, UBound(P, 2)) = V(2)6 r; e  ]/ v3 y
  27.                 End If, P( g% t& O: x
  28.             Next
    0 Y, m  ~+ U6 ~2 b: I/ [
  29.         Next
    # e$ n9 P  D; V  B% `
  30.         If UBound(P, 2) < 0 Then
    4 L# n* |* E! n* _& _7 B2 j
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"
    , w6 O$ K4 ^+ U9 l" ~
  32.         Else
    0 j; e& {+ q# n: n0 f2 f
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"
    * Y1 U: Z: l: x% L
  34.             For I = 0 To UBound(P, 2)
    ! \0 e6 _! L. h2 L" O7 x3 u$ P: R
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)2 v) k  {/ `+ b$ E: l8 D
  36.             Next# H# c* t/ \/ O
  37.             MsgBox S, vbOKOnly, "AutoCAD"
    : y8 D0 W! A$ F8 {. n4 ^; r9 u9 R
  38.         End If, }- Q7 e2 m8 U, j; \+ I/ y
  39.     Else
    / B8 G# A2 }. j
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"# L9 s8 [9 C6 @9 ]( K" B) q
  41.     End If
    / p! q1 d2 C' W# w  `
  42.     SS.Delete '删除用过的选择集
    9 e0 `+ x5 _% F# N  E
复制代码

评分

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

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