QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

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

  1. * z' j' p: w+ a6 x5 w
  2.     Dim SS As AcadSelectionSet '声明选择集变量! t* V7 u+ o: q+ b6 R, ?
  3.     Dim Ft(0) As Integer, Fd(0) As Variant '声明选择集过滤器数组变量
    6 u0 `# u: ?  \$ ?7 `, O3 Y$ n5 l  U
  4.     Dim P() As Double '声明一个双精度型动态数组,用于保存所有交点坐标; e' W3 R5 M  m: e& l# l& ?
  5.     Dim V As Variant '声明一个变体型变量,用于提取两直线的交点0 i" H( }( J' R( M  A& w; ^; _4 t9 s
  6.     Dim I As Long, J As Long '循环变量8 V5 J6 Y, T6 J$ F5 q5 m4 ^8 J
  7.     Dim S As String '一个字符串,用于消息框
    , {" W+ t6 B& ^
  8.    
    - s, t- S+ S4 X2 O
  9.     On Error Resume Next
    / x9 ?# A. U# t% V. p
  10.     Set SS = ThisDrawing.SelectionSets.Add("SS" ) '新建选择集
    " O5 ?+ H! }( P6 K+ F
  11.     Ft(0) = 0 '定义过滤器,组码为0,检查对象类型3 Z; t* T- k* s& J7 L% \
  12.     Fd(0) = "line" '对象类型为直线
    4 H" X7 k2 z0 @- V! J7 e, ?$ i
  13.     SS.Select acSelectionSetAll, , , Ft, Fd '选择所有直线
    2 q# r/ ?" z4 l; D4 K/ V
  14.     If SS.Count >= 2 Then '检查被加入选择集的直线数量,只有数量大于或等于2时才能检查交点
    , F* J3 L* f7 G: w/ {: [
  15.         For I = 0 To SS.Count - 2 '用嵌套循环方式检查某条直线与其它所有直线的交点; |9 m4 _6 [: }
  16.             For J = I + 1 To SS.Count - 1
    ! z. S8 a5 _1 c
  17.                 V = SS.Item(I).IntersectWith(SS.Item(J), acExtendNone) '获得交点,用两条直线均不延伸的模式
    : |' h+ f( [* L- P8 M
  18.                 If UBound(V) = 2 Then '检查是否有交点9 h. Y3 g$ n# K0 l+ V0 P# ]
  19.                     If UBound(P, 2) < 0 Then '重定义数组
    3 o1 h5 R, h$ @
  20.                         ReDim P(2, 0)
    6 r% h7 q2 B0 E, H% @0 t
  21.                     Else
    : F: z9 G; j; u5 I: K
  22.                         ReDim Preserve P(2, UBound(P, 2) + 1)
    ! m2 a0 d1 y/ v3 J/ O+ v
  23.                     End If
    6 q2 L5 q% H0 x# G  z5 ^( L
  24.                     P(0, UBound(P, 2)) = V(0) '把交点坐标存入动态数组9 X/ H2 i$ r' I$ ^% i
  25.                     P(1, UBound(P, 2)) = V(1)" b5 _8 h- j+ `* v5 q
  26.                     P(2, UBound(P, 2)) = V(2)
    / ~" `7 s4 ]: f# J5 c
  27.                 End If' i! Y' e1 z: z4 l6 R
  28.             Next
    2 O1 @7 [; U$ f3 U( g& H
  29.         Next, `; t4 B6 h* A. C. c  ^
  30.         If UBound(P, 2) < 0 Then8 I" _" {9 t6 [1 {
  31.             MsgBox "没有交点", vbOKOnly, "AutoCAD"/ Z9 O3 g' N/ l/ H  U) A
  32.         Else
    0 P% s, S7 F* F- n, J# c
  33.             S = "共有 " & UBound(P, 2) + 1 & " 个交点". `5 ~' Q* J! u4 F
  34.             For I = 0 To UBound(P, 2)1 r, T  L: r$ l( `
  35.                 S = S & vbCrLf & P(0, I) & "," & P(1, I) & "," & P(2, I)
    , b5 O, F  H( u
  36.             Next2 y; o/ ]* C# d: z+ b3 v) `
  37.             MsgBox S, vbOKOnly, "AutoCAD"
    ( K# S+ P  r. J
  38.         End If' V8 h/ {% z* R* s# Q7 G( O
  39.     Else0 p3 {. z7 v; d! \& r0 G# ]
  40.         MsgBox "直线少于两条", vbOKOnly, "AutoCAD"
    ; z6 n* T+ o9 {& n3 \! C1 \
  41.     End If, q" `3 U( G& W: D% {; F8 L9 ^
  42.     SS.Delete '删除用过的选择集
    5 `+ @& F# e" 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 )

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