QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我在cad中用vb画了一系列直线,要提取所有直线的交点坐标,该怎么编程实现?
发表于 2009-4-2 22:04:57 | 显示全部楼层 来自: 中国辽宁鞍山
我觉得可以先提取所有直线的两个端点,然后以每条线为基准循环测试,逐个记录交点,求交点可以采用几何算法
发表于 2009-4-4 07:20:13 | 显示全部楼层 来自: 中国
  1.   u' P- k) `2 b
  2.     Dim SS As AcadSelectionSet '声明选择集变量8 _9 L6 t3 e" d; f
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量; w+ L: R, I& v1 N; d3 F
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标! M8 s- n- V7 `
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点$ I3 o% r0 O4 F. A- L, g
  6.     Dim I As Long, J As Long '循环变量
    # h% U' J  _0 L+ ?& ?  n
  7.     Dim S As String '一个字符串,用于消息框1 R5 F) h3 |1 r9 X3 N' J! K1 |
  8.    
    ( j" r5 s+ g: w3 x' d' ~
  9.     On Error Resume Next. M0 ?& j3 |; a9 D3 W7 R5 P+ K
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集% G: k- a7 G% h0 ]
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型4 D/ O) K1 Q3 `" S) ?
  12.     Fd(0) = "line" '对象类型为直线  N( d5 U9 m5 ~0 j( i8 I
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线
    " B; u  U3 j, p! o
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点7 X7 x& @. B8 y& z
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点) Z( W, O1 L& U5 ~5 f, E
  16.             For J = I + 1 To SS.Count - 1+ w) B5 p/ m8 |; ?) U# j* \# U5 G
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式
    9 `+ K6 t+ {# g* b0 L0 q* v
  18.                 If UBound(V) = 2 Then '检查是否有交点
    ; O$ s' C+ o- z# v! c$ @& K8 G
  19.                     If UBound(P, 2) < 0 Then '重定义数组+ [7 U# |1 P5 b+ _: x# u, F- U
  20.                         ReDim P(2, 0)9 _1 I- x- _1 z
  21.                     Else
    ( E; m7 k# X8 z# y' M- m3 b
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)/ [# I% k8 I1 g
  23.                     End If8 x1 i$ j' U+ V' [! z" A( g
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组% W0 f# \0 t* L# S+ S
  25.                     P(1, UBound(P, 2)) = V(1)4 Q1 T# ^$ ?" \4 V9 @8 c
  26.                     P(2, UBound(P, 2)) = V(2)( q3 R& ]( }/ u1 \/ R/ s# N, r  G* x
  27.                 End If+ T$ O! C; U& a0 f3 C& V* V
  28.             Next
    1 C6 \) Y9 F+ Y
  29.         Next7 x# W! I9 k* r2 v! b
  30.         If UBound(P, 2) < 0 Then
    ! C: j1 J0 W+ a% s
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"* g+ A6 \  A% t9 t
  32.         Else
      h; o- a, g: l0 `/ j( R* C0 |
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"3 }: S: ~: x% H; D# \3 D! T
  34.             For I = 0 To UBound(P, 2)& D8 R: A. n5 q+ w
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)
    6 w' A/ q# S7 v1 |0 G; E, @
  36.             Next
    # s6 v9 X1 z! d# e
  37.             MsgBox S, vbOKOnly, "AutoCAD"1 \$ o* g" `) z& l$ w- `$ l* V
  38.         End If
    2 Y) v, x5 Z! L  N) b' F# W4 J
  39.     Else% E1 l# U" z, n- E+ h* K% z
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"
    - E; V: X) F$ C
  41.     End If
    5 ~# L* h' L" x5 H5 }
  42.     SS.Delete '删除用过的选择集
    # W: ?2 L) c8 k' D( 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 )

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