QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

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

  1. & \- ^7 C5 |+ b7 B+ ^6 `0 {
  2.     Dim SS As AcadSelectionSet '声明选择集变量! k/ [5 q) L5 ]% [, ]
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量
    : [; `/ P) O, b4 E
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标) F4 B, |: Z" X$ ?4 d* a9 J% E
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点
    " S) g4 ?( c( {7 n/ z# |$ a
  6.     Dim I As Long, J As Long '循环变量" ]- z6 h9 h9 ?/ P* y8 t3 v8 P
  7.     Dim S As String '一个字符串,用于消息框4 k' n2 |+ T8 d
  8.     ; ~- P% E$ Q6 F4 s! e
  9.     On Error Resume Next2 r% Q' l5 i! r" c7 c: }: M# _3 V
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集
    # i- Z3 T0 T; n
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型$ M, h  I. S6 \3 v
  12.     Fd(0) = "line" '对象类型为直线
    , Y, C/ B( ^! N7 U, U: z2 _
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线
    $ {0 W( ^9 N' a# [% w9 q5 f
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点% z/ _  V* E- Z3 b1 l
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点2 |8 M$ W6 C  g" d
  16.             For J = I + 1 To SS.Count - 1  ^8 h* A3 [: q4 R
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式
    & v& T6 Y! B4 m! i$ V- l' a1 J4 d
  18.                 If UBound(V) = 2 Then '检查是否有交点+ k/ g  ?7 W) Z7 G- n
  19.                     If UBound(P, 2) < 0 Then '重定义数组
    + v7 r6 ?: m. H- C! x% \5 Q2 Y
  20.                         ReDim P(2, 0)
    3 s, s/ q- G' G& ?4 ~
  21.                     Else6 C* F6 {7 e$ a! I4 M! i
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)8 M- k/ y8 L) G7 J, G
  23.                     End If
    % x, u/ J' T% C
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组5 C$ Q2 g' [& K' q5 T/ u
  25.                     P(1, UBound(P, 2)) = V(1)( ]9 C' \4 @( A" V+ ?5 _: o
  26.                     P(2, UBound(P, 2)) = V(2)" U* S8 o: z/ r9 _0 q
  27.                 End If
    # [3 w! ]2 Z, m  @
  28.             Next9 v# K% {( }$ R5 y" `
  29.         Next
    ) s7 i- C2 z3 q) D3 G+ h
  30.         If UBound(P, 2) < 0 Then0 ~0 j& D0 M1 V) @
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"
    , H) W, V9 |0 o
  32.         Else
    0 ~% d/ k5 F1 C
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"* P7 L2 ~7 f) ^
  34.             For I = 0 To UBound(P, 2)
    ! e" ]/ {- m  v8 z: L" t' A
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)
    3 R% o  P6 S" Y
  36.             Next
    1 m  U9 F4 E  O6 s, A
  37.             MsgBox S, vbOKOnly, "AutoCAD"8 {# F! X4 @) w: R4 d4 Y( D
  38.         End If/ `# j( M; O0 ~/ [% p& v$ T2 Z
  39.     Else  _2 O" T0 Y3 A4 m
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"% j- a& c6 r# V2 e, r- W
  41.     End If
    * e1 s" t& W8 I8 @3 T
  42.     SS.Delete '删除用过的选择集# J. J( N9 \% o6 d
复制代码

评分

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

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