找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: aeo

[每日一码] 判断pl线自相交

[复制链接]
发表于 2013-12-3 00:44:41 | 显示全部楼层
本帖最后由 Free-Lancer 于 2013-12-3 01:02 编辑
/db_自贡黄明儒_ 发表于 2013-11-30 08:12
aeo版主请看,不论是否自交,返回的结果不对

测试下这个
  1. (defun Polyline:IsSelfIntersect        (e / obj pts ptl pams)
  2.   (setq obj (vlax-eanme->vla-object e))
  3.   (if (setq pts (vlax-invoke obj 'IntersectWith obj 0))
  4.     (progn
  5.       (while pts
  6.         (setq ptl (cons (list (car pts) (cadr pts) (caddr pts)) ptl)
  7.               pts (cdddr pts)
  8.         )
  9.       )
  10.       (setq
  11.         pams
  12.          (mapcar '(lambda (x) (vlax-curve-getparamatpoint e x))
  13.                  ptl
  14.          )
  15.       )
  16.       (if (vlax-curve-isclosed e)
  17.         (or (not (equal (vlax-curve-getendparam e) (length ptl)))
  18.             (not (apply '> (reverse (cdr (reverse pams)))))
  19.         )
  20.         (or (not (apply '> pams))
  21.             (member '0.0 pams)
  22.             (member (vlax-curve-getendparam e) pams)
  23.         )
  24.       )
  25.     )
  26.   )
  27. )

点评

有也问题(含测试文件)  详情 回复 发表于 2013-12-3 08:18
如果可行,用这个方法还可以做一个自交断开  详情 回复 发表于 2013-12-3 08:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-3 08:15:23 来自手机 | 显示全部楼层
Free-Lancer 发表于 2013-12-3 00:44
测试下这个

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

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-12-3 08:18:39 | 显示全部楼层

有也问题(含测试文件)

Drawing1.rar

20.32 KB, 下载次数: 7, 下载积分: D豆 -1 , 活跃度 1

点评

知道了非自交的 IntersectWith 规律, 那求出凡和这个不等的就是自交  详情 回复 发表于 2013-12-3 17:24
14#楼的版本测试结果都是对的![attachimg]6953[/attachimg]  详情 回复 发表于 2013-12-3 10:11
pline 的节点param为 (eq index (fix index))设是一个序列,自交总结几个情况, 1 交点的param不是"整数", 2 在节点处,param为"整数",此时得到的交点已经不是连续序列 3 不自交的闭合线intersectwith后的点 不  详情 回复 发表于 2013-12-3 08:43
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-3 08:43:09 来自手机 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-12-3 08:18
有也问题(含测试文件)

pline 的节点param为 (eq index (fix index))设是一个序列,自交总结几个情况,
1 交点的param不是"整数",
2 在节点处,param为"整数",此时得到的交点已经不是连续序列
3 不自交的闭合线intersectwith后的点 不是一个连续序列
4 单段pline求交为nil
待续…
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2013-12-3 10:11:17 | 显示全部楼层

14#楼的版本测试结果都是对的! q1.jpg

点评

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-3 17:24:13 | 显示全部楼层

知道了非自交的 IntersectWith 规律, 那求出凡和这个不等的就是自交

  1. (defun rrr (e / getlst ep obj pts ptl pams il)
  2.   (defun Getlst        (n / i il)
  3.     (setq i (fix n))
  4.     (repeat i (setq il (cons (setq n (1- n)) il)))
  5.     il
  6.   )
  7.   (setq        obj (vlax-ename->vla-object e)
  8.         ep  (vlax-curve-getendparam e)
  9.   )
  10.   (if (setq pts (vlax-invoke obj 'IntersectWith obj 0))
  11.     (progn
  12.       (while pts
  13.         (setq ptl (cons (list (car pts) (cadr pts) (caddr pts)) ptl)
  14.               pts (cdddr pts)
  15.         )
  16.       )
  17.       (setq il         (cdr (getlst ep))
  18.             pams (mapcar '(lambda (x)
  19.                             (vlax-curve-getparamatpoint e x)
  20.                           )
  21.                          ptl
  22.                  )
  23.       )
  24.       (if (vlax-curve-isclosed e)
  25.         (not (equal (reverse pams)
  26.                     (cons 1. (cons 0. (cdr il)))
  27.              )
  28.         )
  29.         (or (not (equal (reverse pams) il))
  30.             (member '0.0 pams) ;_假闭合情况
  31.         )
  32.       )
  33.     )
  34.   )
  35. )

点评

我提供样图的左上角情况不对,其它均可  详情 回复 发表于 2013-12-4 08:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2013-12-4 08:14:21 | 显示全部楼层
本帖最后由 /db_自贡黄明儒_ 于 2013-12-4 08:33 编辑
st788796 发表于 2013-12-3 17:24
知道了非自交的 IntersectWith 规律, 那求出凡和这个不等的就是自交


我提供样图的左上角情况不对,其它均可,(鼠标点取闭合情况不对)

点评

这个是假闭合情况,如果排除, 第二个 Or 改成 (not (equal (vl-remove '0. (reverse pams)) il))  详情 回复 发表于 2013-12-4 09:31
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-12-4 09:31:56 | 显示全部楼层
/db_自贡黄明儒_ 发表于 2013-12-4 08:14
我提供样图的左上角情况不对,其它均可,(鼠标点取闭合情况不对)

这个是假闭合情况,如果排除, 第二个 Or 改成
(not (equal (vl-remove '0. (reverse pams)) il))

评分

参与人数 1D豆 +3 收起 理由
/db_自贡黄明儒_ + 3 很给力!经验;技术要点;资料分享奖!

查看全部评分

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

使用道具 举报

已领礼包: 1094个

财富等级: 财源广进

发表于 2021-5-26 00:02:21 | 显示全部楼层
感谢分享判断pl线自相交 !
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-28 22:20 , Processed in 0.193055 second(s), 45 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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