找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1448|回复: 9

[日积月累]:检测 Lwpolyline 自交叉的函数

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-8-2 09:54:23 | 显示全部楼层 |阅读模式

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

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

×
只写了 lwpolyline 不包括 polyline

  1. ;;对 Pline 线检测自交叉, T 交叉,nil ok
  2. (defun checkpl (e / tf n obj nn tf0)
  3.   ;;(if (setq e (car (entsel)))
  4.   ;;(progn
  5.   (setq        tf  (vlax-curve-isclosed e)
  6.         n   (cdr (assoc 90 (entget e)))
  7.         obj (vlax-ename->vla-object e)
  8.   )
  9.   (setq        nn (/ (1+ (vlax-safearray-get-u-bound
  10.                     (variant-value (vla-intersectwith obj obj 0))
  11.                     1
  12.                   )
  13.               )
  14.               3
  15.            )
  16.   )
  17.   (if tf
  18.     (setq tf0 (= n nn))
  19.     (setq tf0 (= (- n 2) nn))
  20.   )
  21.   ;; )
  22.   ;;)
  23.   ;;(if (not tf0)
  24.   ;;  (princ "\n自交叉!")
  25.   ;;  (princ "\nOk!")
  26.   ;;)
  27.   ;;(princ)
  28.   (not tf0)
  29. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-8-2 10:17:04 | 显示全部楼层
也转载一个Luis Esquivel的自相交判断函数,对于封闭曲线的判断和eachy版主的有些不一样

  1. ;;; sample by Luis Esquivel, December 17, 2001
  2. ;;; self-intersect
  3. ;;; return: T or nil
  4. ;;; note: you must pass a polyline or spline object, no error catching
  5. (defun C:TEST (/ ent)
  6.   (lbx-self-intersect (setq ent (car (entsel))))
  7. )
  8. (defun lbx-self-intersect (ent / vla objname)
  9.   (vl-load-com)
  10.   (setq        vla        (vlax-ename->vla-object ent)
  11.         objname        (vla-get-objectname vla)
  12.   )
  13.   (if (= "AcDbSpline" objname)
  14.     (progn
  15.       (if (safearray-value
  16.             (vlax-variant-value
  17.               (vla-intersectwith vla vla acExtendNone)
  18.             )
  19.           )
  20.         T
  21.         nil
  22.       )
  23.     )
  24.     (progn
  25.       (apply
  26.         '/=
  27.         (list (- (/ (length (vlax-safearray->list
  28.                               (variant-value
  29.                                 (vla-get-coordinates vla)
  30.                               )
  31.                             )
  32.                     )
  33.                     2
  34.                  )
  35.                  2
  36.               )
  37.               (/ (length (vlax-safearray->list
  38.                            (variant-value
  39.                              (vla-intersectwith vla vla acExtendNone)
  40.                            )
  41.                          )
  42.                  )
  43.                  3
  44.               )
  45.         )
  46.       )
  47.     )
  48.   )
  49. )


原帖地址:
http://groups.google.com/group/a ... =1#dd24527910f01eca

其中,Le和John Uhden针对这个问题进行了讨论,似乎是说两个人在某些方面还没有考虑到一样,可惜我不大看的懂怎么回事
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2006-8-2 11:10:06 | 显示全部楼层
关于交点在很早的帖子中我也有过说明,对 spline 而言 IntersectWith 是有 Bug 的,你可以画一个 spline 首尾交叉(如图所示,注意各自有一点点出头),这时用 IntersectWith 是找不到交点的,INT捕捉也没有交点,实际上外观是有交点的。

对 lwpolyline 用 intersectwith 求交点,非闭合没有交叉时返回除端点外的点,闭合线没有交叉则返回所有节点;当自交叉时在上面返回的基础上增加交点。

Polyline 比较复杂,DXF 中 Code 0 只有 Polyline,实际上保扩了AcDb2dPolyline AcDb3dPolyline PolygonMesh PolyfaceMesh ,其中只查看过 lwpolyline 经过 fit 或者 spline 的 polyline ,fit 后的线为一段段的 arc 连接而成, spline 后的线为 Line 模拟。前面我写过一个 spline 模拟的程序,利用 acad 这个特性可以用 lisp 写出折线模拟 Spline 比较理想方案(相比较用 vlax-curve*函数要简单、理想)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2006-8-3 00:27:39 | 显示全部楼层
可能不完全

比如首尾相连不闭合

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

使用道具 举报

发表于 2006-8-3 11:41:44 | 显示全部楼层
老老实实作就是:
(and
(求自相交点集,过滤掉顶点。
T =自相交
nil  = 无自相交)
(无有重复顶点)
)

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

使用道具 举报

发表于 2006-8-3 17:38:42 | 显示全部楼层
请教一个问题,
闭合的轻多义线(非自相交的),其方向(顺时针或逆时针)如何判断。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-8-3 21:13:14 | 显示全部楼层
确实spline端部各有些出头是交点是矛盾的,这个应该和它的数学表达式有些关系吧,不知道pline在s之后的交点又是如何,可能也很奇怪

顺逆时针可能只能针对某种特征,比如凸多变形
否则,一个空心C曲线的顺逆时钟就无法定义
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-12-7 15:03:12 | 显示全部楼层
如果有几个顶点位于一条直线上,是否算自相交?本程序结果表明是自相交的,但我觉得这种情况不能算自相交
同样,如果一条自相交多义线,而其直线段上有一个顶点,程序判断结果是不自相交的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2007-6-14 10:57:15 | 显示全部楼层
如果多段线自相交的交点和其中的一个定点重合,那么程序判别出来的结果是不是自相交呢?

经测试,1楼的对于这种情况不能判别出来,其返回值为nil。
而后面的lbx-self-intersect程序则可以怕别这种情况。

对于经fit 和 spline化后的多段线polyline,1楼的出错,lbx-self-intersect则不管是什么情况,都返回T,不能正确地反映实际情况。


2楼的程序经过改进,对于经fit 和 spline化后的多段线polyline同样适合。但是怎么也上传不了,需要的话请到我的网盘下载http://muzacad.ys168.com


最近又完成另外一个同样的功能函数,可以到我的网盘去下载
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-17 09:32 , Processed in 0.254042 second(s), 50 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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