找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 720|回复: 6

[讨论]:如何快速判断那些线相交

[复制链接]
发表于 2004-3-10 15:03:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
大家好!我有这样一个问题

1.我们首先在CAD中创建3个图层。Layer1,Layer2,Layer3
2. 任意在这三个图层中画 Line线(描画时故意让这些线彼此相交
但是,故意使一些交点不是所有线集合的首尾点

3.采用什么算法可以非常快速的判断出这些交点,并在交点处画一个圆

说明一下,如果您是从事GIS工作的人员,会理解这个检查程序目的是检查应该进行溶点的地方没有溶点的错误。

我有一个办法但太慢了!

我说说我的想法,遍历所有要处理的线实体,以首尾点做一个类似Fence的选择集(选择所有经过这两个点的实体)循环判断每一个返回的结果选择集中的线与当前线段求交点(使用CAD求交函数)如果交点不是结果选择集中线的首尾点,就报错,画圆。

但是如果我们需要处理的线是,没有规律的线,实体数量多达4万 - 5万 个Line实体, 如何才能更快的判断未溶断的点?



         希望大家踊跃发言   谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-3-10 15:48:41 | 显示全部楼层

Re: [讨论]:如何快速判断那些线相交

最初由 dubing 发布
[B]大家好!我有这样一个问题

1.我们首先在CAD中创建3个图层。Layer1,Layer2,Layer3
2. 任意在这三个图层中画 Line线(描画时故意让这些线彼此相交
但是,故意使一些交点不是所有线集合的首尾点

3.采用什么算法?.. [/B]

1 求选择集的交点集(去除重复)
2 求线的起始点集(去除重复)
3 两个点集运算

再快就只能求助ARX了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-10 16:07:10 | 显示全部楼层
请教 如何求选择集的交点集?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-3-10 16:21:33 | 显示全部楼层
最初由 dubing 发布
[B]请教 如何求选择集的交点集? [/B]

1 xdapi 中的 xdrx_getinterss 函数 使用方法 (xdrx_getinterss ss) ss---选择集

2 VLA 方法,论坛有现成的代码,搜索LUCAS,但是那个程序没有过滤重复点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-3-10 23:43:58 | 显示全部楼层
想不到可以这样实现,又学了一招,谢谢楼上的几位!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-3-11 09:30:37 | 显示全部楼层
不太理解 eachy 所说的 原理
1 xdapi 中的 xdrx_getinterss 函数 使用方法 (xdrx_getinterss ss) ss---选择集
2 VLA 方法,论坛有现成的代码,搜索LUCAS,但是那个程序没有过滤重复点。

如果使用选择集,我想基本的方法是这样:
  遍历,选择集中的实体 取出其中的一个Line线,接下来就是与谁求交点的问题
  .以这条Line线为范围选择所有与其相交的实体(参数CP)再求该线与所有结果集中的线的交点,这样做的结果是频繁调用选择集,如果当前数据库中的实体为万级,每做一次都需要时间,累级效应将是几个小时,而AutoCAD Map 的CleanUp功能中就有类似的功能(交点打断)它用几分钟甚至几秒钟就能够判断出来这是为什么?

   希望大家开动脑筋提出自己的好算法,算法是程序的灵魂。

                                                        沈阳 杜冰
                                                        dubing771216@hotmail.com
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2004-3-11 12:26:08 | 显示全部楼层
最初由 dubing 发布
[B]不太理解 eachy 所说的 原理
1 xdapi 中的 xdrx_getinterss 函数 使用方法 (xdrx_getinterss ss) ss---选择集
2 VLA 方法,论坛有现成的代码,搜索LUCAS,但是那个程序没有过滤重复点。

如果使用选择集,我想?.. [/B]

  1. [PHP]
  2. xdrx_getinters

  3. 功    能:1.求两个AcDbCurve(曲线)实体的交点.
  4.           2.求一个AcDbCurve(曲线)实体和一个选择集中所有AcDbCurve(曲线)的交点。
  5.           3.求一个选择集中所有AcDbCurve(曲线)实体的交点.
  6.           4.求一个选择集SS1中的所有AcDbCurve实体和另个选择集SS2所有AcDbCurve实体的交点。

  7. 调用格式: 1. (xdrx_getinters <实体图元1> <实体图元2> [扩展方式])
  8.            2. (xdrx_getinters <实体图元名> <选择集> [扩展方式])
  9.            3. (xdrx_getinters <选择集> [扩展方式])
  10.            4. (xdrx_getinters <选择集1> <选择集2> [扩展方式])
  11.            5. (xdrx_getinters (<pt1>...<ptn>) <曲线实体名> [扩展方式])
  12.            6. (xdrx_getinters (<pt1>...<ptn>) <选择集> [扩展方式])
  13.            7. (xdrx_getinters (<pt1>...<ptn>) (<pt1>...<ptn>) [扩展方式])

  14. 说    明:1.程序能求AcDbCurve(包括:AcDbLine、AcDbArc、AcDbCircle、AcDbEllipse、AcDbSpline、
  15.             AcDbPolyline(lwpolyline)交点。
  16.           2.参数[扩展方式]:
  17.           对于1种情况:
  18.                 0:不延伸实体
  19.                 1:延伸第一个实体
  20.                 2:延伸第二个实体
  21.                 3: 两个都延伸
  22.           对于第二、三、四种情况(选择集):
  23.                 0: 不延伸实体
  24.                 1: 两个都延伸

  25. 示    例: 1. 求天正建筑软件轴线层上,所有轴线的交点
  26.                 (if (setq ss (ssget "x" (list (cons 8 (xdrx_getlyrname "轴线")) '((0 . "line")))))
  27.                     (progn
  28.                         (setq intl (xdrx_getinters ss))
  29.                     )
  30.                 )

  31.            2. 点取一根轴线,然后求出与这个轴线相交的所有轴线交点。
  32.                 (setq lyr (xdrx_getlyrname "轴线"))
  33.                 (if (setq en (xdrx_entsel "\n请点取一个轴线<退出>:" (list (cons 8 lyr) '(0 . "line"))))
  34.                     (progn
  35.                         (xdrx_setentodb)
  36.                         (setq p1 (xdrx_getentdxf 10)
  37.                               p2 (xdrx_getentdxf 11)
  38.                               ss (ssget "f" p1 p2 (list (cons 8 lyr) '(0 . "line")))
  39.                         )
  40.                         (if (setq intl (xdrx_getinters (car en) ss))
  41.                             (progn
  42.                                .....;;intl中为交点表
  43.                             )
  44.                         )
  45.                     )
  46.                 )
  47. [/PHP]

2 LUCAS

  1. [PHP]
  2. ;;求所有线的交点
  3. (defun C:TT (/ SS M E1 N E2 PTS PL PT1)
  4.   (vl-load-com)
  5.   (setq        SS (ssget '((0 . "*LINE,ARC,CIRCLE,ELLIPSE")))
  6.         M  0
  7.   )
  8.   (while (< M (1- (sslength SS)))
  9.     (setq E1 (vlax-ename->vla-object (ssname SS M))
  10.           N  (1+ M)
  11.     )
  12.     (while (< N (sslength SS))
  13.       (setq E2        (vlax-ename->vla-object (ssname SS N))
  14.             PTS        (vlax-variant-value (vla-intersectwith E1 E2 0))
  15.       )
  16.       (if (> (vlax-safearray-get-u-bound PTS 1) 0)
  17.         (progn
  18.           (setq PTS (vlax-safearray->list PTS))
  19.           (while (> (length PTS) 0)
  20.             (setq PT1 (list (car PTS) (cadr PTS) (caddr PTS)))
  21.             (if        (not (member PT1 PL))
  22.               (setq PL (cons PT1 PL))
  23.               (setq PTS (cdddr PTS))
  24.             )
  25.           )
  26.         )
  27.       )
  28.       (setq N (1+ N))
  29.     )
  30.     (setq M (1+ M))
  31.   )
  32.   PL
  33. )[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-21 01:07 , Processed in 0.191125 second(s), 42 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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