QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
8天前
查看: 6774|回复: 5
收起左侧

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

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

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

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

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

  1. 5 q3 ~- j: ^( G8 P4 [: w
  2.     Dim SS As AcadSelectionSet '声明选择集变量
    , V  d9 {" ?, v& v6 m2 m" F9 \
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量
    % @# u& c: P; h% m( L3 Y% k
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标8 \$ [9 h/ O8 s) h
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点
    * z  ^2 Y9 F% {
  6.     Dim I As Long, J As Long '循环变量
    * d9 |( Q# n- X3 ], ?2 ?
  7.     Dim S As String '一个字符串,用于消息框
    ( {# j5 F" l# _* Q; j% k, M/ X
  8.     7 z9 F4 U; L% o7 n. ]  ~
  9.     On Error Resume Next
    , @) ]: O' b1 e, e- V7 i# R7 D/ o
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集0 X& y0 b- [  R. H: u
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型
    & z. i! ^9 e9 U  }
  12.     Fd(0) = "line" '对象类型为直线
    " e1 c- W# z5 x" O( q  ~
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线
    $ O5 t0 C2 m3 L' r5 t! ^+ f
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点
    2 H# X2 U( R$ t0 l! [
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点/ i7 Q/ `3 C. K! O/ R1 E
  16.             For J = I + 1 To SS.Count - 1
    3 B: T1 z. G! {: V/ i& b* `! I
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式! B' \: n9 X2 a
  18.                 If UBound(V) = 2 Then '检查是否有交点
    8 W# V) r( ~, d/ h
  19.                     If UBound(P, 2) < 0 Then '重定义数组
    & @: ]6 P7 l6 [9 }
  20.                         ReDim P(2, 0)1 ?/ i/ T: c4 h5 n3 y; z, d* U
  21.                     Else, U6 _: e: O- O: R1 n( t
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)
    - u  C% S* Z: C9 k
  23.                     End If+ [+ h; p9 D% q! W0 h' ?
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组
    4 B- ~8 c* o* K1 j9 G$ _
  25.                     P(1, UBound(P, 2)) = V(1)
    & ^( Z2 k# i6 W* ~; ~
  26.                     P(2, UBound(P, 2)) = V(2)
    3 p# B3 \! {8 i: t
  27.                 End If
    2 \4 j7 N4 H+ Q! s9 T6 s. _
  28.             Next5 d* [, d2 m* g/ ]) m
  29.         Next: x' O' z% G2 o! X) A8 n
  30.         If UBound(P, 2) < 0 Then) l" H1 |2 i0 o' N3 P: E
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"
    7 \& f! d4 P3 x4 k* P* Q
  32.         Else$ w% j; W6 g9 D2 q' j3 _" Q
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"4 [  ^  r% u) n) |7 k
  34.             For I = 0 To UBound(P, 2)
    2 @9 e9 d* f! ]7 ?% U- t
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)
    7 y0 I0 v2 o' y& o6 _
  36.             Next7 L0 N! ], x5 W% _# H; J* c4 |( ]+ D
  37.             MsgBox S, vbOKOnly, "AutoCAD"6 k: P+ q/ |& e7 b% F8 a4 a+ ^
  38.         End If, \+ I$ p, K$ B, F; [9 Z" D- W
  39.     Else
    8 R5 I) n2 n* W; [5 ?8 O
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"
    $ r# }( N. k. [6 n3 M  p
  41.     End If- F' l5 D' o, \4 P1 W
  42.     SS.Delete '删除用过的选择集
    4 R5 b. F$ y( J
复制代码

评分

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

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