QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我在cad中用vb画了一系列直线,要提取所有直线的交点坐标,该怎么编程实现?
发表于 2009-4-2 22:04:57 | 显示全部楼层 来自: 中国辽宁鞍山
我觉得可以先提取所有直线的两个端点,然后以每条线为基准循环测试,逐个记录交点,求交点可以采用几何算法
发表于 2009-4-4 07:20:13 | 显示全部楼层 来自: 中国
  1. 8 r; K$ h7 C: T, V* o
  2.     Dim SS As AcadSelectionSet '声明选择集变量- ]$ Y0 e9 a8 G4 p1 L
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量" C/ Z  y: E: H- f
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标" N  S# h; p; C+ L. t
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点
    " }! r+ t' F% z
  6.     Dim I As Long, J As Long '循环变量
    0 N! P0 G% C9 Q/ r$ Z" z5 a
  7.     Dim S As String '一个字符串,用于消息框' S/ Z& O! p* m7 E7 Y5 C
  8.     # R; g; ]! @' z% V- o* ?* v: ~
  9.     On Error Resume Next
    7 P6 ^* u5 c. [& w& C4 w8 [
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集
    4 y# ?' \4 I3 @* K  @
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型1 h- R. E: _% W8 Y
  12.     Fd(0) = "line" '对象类型为直线
    $ e1 T8 m! i5 s& a
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线' Q5 t3 y8 @* C" t2 i
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点
    % h6 F- \9 Q$ O2 e+ P5 `2 I, z8 k. L$ H
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点
    : |/ b# g* ~" k% O! q
  16.             For J = I + 1 To SS.Count - 1$ {" W: j7 J( p$ D' {0 i
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式
    9 B. F) M) N! f4 `8 x6 }! R  ^
  18.                 If UBound(V) = 2 Then '检查是否有交点
    $ Z9 s) f7 Q( a+ K; Z. T' v
  19.                     If UBound(P, 2) < 0 Then '重定义数组6 X' J! b. f' r! T( T- o+ e6 p
  20.                         ReDim P(2, 0)2 ~6 w/ Y  \4 y) z. r  V
  21.                     Else- s0 K8 H; ?- o0 Q
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)+ e3 j' k; t9 _: b+ i
  23.                     End If9 L/ q, Y, Y* k1 e3 n$ \' H
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组$ Q# Z4 w3 L# {8 A# u! F+ o
  25.                     P(1, UBound(P, 2)) = V(1)1 P6 S  T4 c: v/ O
  26.                     P(2, UBound(P, 2)) = V(2)
    1 c8 m& X5 [' c
  27.                 End If
    6 E7 @: D; e3 o# V0 Z( ~
  28.             Next
    ; }& x; i/ g5 b/ Y
  29.         Next5 O# z$ Q# V6 `' S( e( X
  30.         If UBound(P, 2) < 0 Then; }7 T( Q7 G: H7 @5 V
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"6 m3 z4 d9 T( C+ b7 \, l* w' e
  32.         Else. ~) h/ e  z2 o+ R! i0 T
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"
    + a( F1 \  ^, E2 F3 O' q, ]
  34.             For I = 0 To UBound(P, 2)
    9 P5 |% F# u8 e+ f  u) n  I) G" K
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)! P+ r2 H" o- E4 B. W0 C$ F
  36.             Next6 n& D. I, m  z2 Z/ Y9 n! W9 _
  37.             MsgBox S, vbOKOnly, "AutoCAD"- H  W$ M) y7 N$ Z! S
  38.         End If
    , P( @. p2 @+ M5 y# P% k: O6 A
  39.     Else
    ( f% @( V" k6 \  a: b% T( B
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"! k8 K8 m; O7 Y; [! t5 M
  41.     End If  i9 `$ I$ g5 {! H$ c7 N. W& G
  42.     SS.Delete '删除用过的选择集
    8 P1 q1 T& {3 T+ K% {, S
复制代码

评分

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

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