QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
请教一下大家,我在cad中用vb画了一系列直线,要提取所有直线的交点坐标,该怎么编程实现?
发表于 2009-4-2 22:04:57 | 显示全部楼层 来自: 中国辽宁鞍山
我觉得可以先提取所有直线的两个端点,然后以每条线为基准循环测试,逐个记录交点,求交点可以采用几何算法
发表于 2009-4-4 07:20:13 | 显示全部楼层 来自: 中国
  1. ! R6 Y; P) C6 m7 v6 T
  2.     Dim SS As AcadSelectionSet '声明选择集变量% L* B- H2 j7 _4 N
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量* `% M6 r8 \: Z# w
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标
    / \% v% Z4 q1 b/ {
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点
    9 H6 X6 v+ a/ @3 O8 o
  6.     Dim I As Long, J As Long '循环变量) R1 e/ V( r8 C4 C9 @+ T8 }  R
  7.     Dim S As String '一个字符串,用于消息框
    9 C) K1 E2 Q# S7 ~
  8.    
    2 c( w0 J7 p, R) O: i0 p
  9.     On Error Resume Next
    # X$ r. v: o" W1 b
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集9 [8 K0 w/ y! {. l
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型
    + G' K7 w1 v4 J& M0 t$ d( v
  12.     Fd(0) = "line" '对象类型为直线
      x; H0 I* E, y* m
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线: H& Q& F1 ?" k0 t. j3 t
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点; K) {' Y9 q# d* N; e8 V7 D/ m0 n
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点
    # p+ B7 D/ Z$ a) Q
  16.             For J = I + 1 To SS.Count - 1
    7 R2 h' G. K. T5 s6 J# Y
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式& v4 c. Q3 ]  R- N6 @
  18.                 If UBound(V) = 2 Then '检查是否有交点
    , q8 d, U, z! r3 O
  19.                     If UBound(P, 2) < 0 Then '重定义数组1 z9 ]/ E0 |! P: K  A& D; u& x  L
  20.                         ReDim P(2, 0)5 q/ v  X* a: d9 y& D1 b' ?: [$ b
  21.                     Else" S( u' G& V( p+ |8 p1 x0 S6 {' J
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)! L% S' J7 j1 o, M1 B2 i  {
  23.                     End If
    % U, B4 Z* Y. t. p- N2 u7 x4 `7 u3 X
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组8 [- q9 k* y  |) l8 _, r  i
  25.                     P(1, UBound(P, 2)) = V(1)
    ) S4 B$ y8 J. I
  26.                     P(2, UBound(P, 2)) = V(2)
    ( q% }# m. F9 U$ I( W; H; n
  27.                 End If1 r0 e* I% Q# _. L
  28.             Next
      b& K. f& O5 Z) h% Y5 G
  29.         Next3 D3 o! m& l" W1 |3 G+ T/ A
  30.         If UBound(P, 2) < 0 Then
    8 g; M4 }7 o. M% n' ~4 d
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"
    # P+ r: U4 u! d4 G& a/ k
  32.         Else
    8 S+ u4 ]9 r) g
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点"% X- E% b  ^. Q1 ~! Y% m% C
  34.             For I = 0 To UBound(P, 2)8 l4 J6 e& S! ~/ Q& n* {
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)4 |3 P1 U* w9 P+ v6 Y/ d
  36.             Next
    4 q5 |1 S6 d0 x, U, b( f
  37.             MsgBox S, vbOKOnly, "AutoCAD"- B1 s  L1 ~  ^, U3 }
  38.         End If3 w& j" q' M3 S2 \6 n* [
  39.     Else
    5 @# s8 [6 R, |" f! h
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"! x& l0 w. s0 B& a) W$ Q2 W/ p) R
  41.     End If6 i1 e2 J# ?" X* v9 o0 W; p
  42.     SS.Delete '删除用过的选择集% ?* z& A$ D6 S1 Y3 E3 r0 N- u
复制代码

评分

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

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