找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1430|回复: 15

[原创]:简约而不简单,判断两复线是否相同的程序

[复制链接]
发表于 2005-9-25 09:26:28 | 显示全部楼层 |阅读模式

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

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

×
整天的工作郁闷的很..很少有时间出去逛快累扁了..
所以乘老板不在偷偷来晓东看看..顺便讲讲自己的心得
,发表一些自己的作品呵呵..希望大家喜欢.
这个功能好象以前在哪里看到过,不过好象很烦琐..
我写了一个希望大家指教..
思路:如果两复线的顶点增量坐标一致并且凸度列表也一致的话
那么这两个复线一定相同..
    增量坐标是指后一点相对于前一点的坐标增量列表
[php]
(defun hy_samepoly(en1 en2);;t nil相同返回T不同返回NIL
   (if (and (equal (mapcar '(lambda(x y) (list (- (car y) (car x)) (- (cadr y) (cadr x))))
        (massoc 10 (entget en1)) (append (cdr (massoc 10 (entget en1)))
      (list (car (massoc 10 (entget en1))))))
     (mapcar '(lambda(x y) (list (- (car y) (car x)) (- (cadr y) (cadr x))))
        (massoc 10 (entget en2)) (append (cdr (massoc 10 (entget en2)))
      (list (car (massoc 10 (entget en2)))))) 0.000001)
     (equal (massoc 42 (entget en1)) (massoc 42 (entget en2)) 0.000001)
     )
     t nil)
)

(defun massoc (key alist / x nlist)
  (foreach x alist
    (if (eq key (car x))
      (setq nlist (cons (cdr x) nlist))
      )
    )
   )
[/php]

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

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

 楼主| 发表于 2005-9-25 11:26:04 | 显示全部楼层
那就不能算完全一样啊..
如果想要算为一样的话..程序中稍微修改一点就好了.
应该很简单啊..
如果考虑反向则

  1. (defun hy_samepoly(en1 en2);;?耞ㄢ確絬琌??璓 t nil
  2.    (if (or (and (equal (mapcar '(lambda(x y) (list (- (car y) (car x)) (- (cadr y) (cadr x))))
  3.                (massoc 10 (entget en1)) (append (cdr (massoc 10 (entget en1)))
  4.                                                 (list (car (massoc 10 (entget en1))))))
  5.      (mapcar '(lambda(x y) (list (- (car y) (car x)) (- (cadr y) (cadr x))))
  6.                (massoc 10 (entget en2)) (append (cdr (massoc 10 (entget en2)))
  7.                                                 (list (car (massoc 10 (entget en2)))))) 0.000001)
  8.             (equal (massoc 42 (entget en1)) (massoc 42 (entget en2)) 0.000001)
  9.             )
  10. (and (equal (mapcar '(lambda(x y) (list (- (car y) (car x)) (- (cadr y) (cadr x))))
  11.                (massoc 10 (entget en1)) (append (cdr (massoc 10 (entget en1)))
  12.                                                 (list (car (massoc 10 (entget en1))))))
  13.      (mapcar '(lambda(x y) (list (- (car y) (car x)) (- (cadr y) (cadr x))))
  14.                (massoc 10 (reverse (entget en2))) (append (cdr (massoc 10 (reverse (entget en2))))
  15.                                                 (list (car (massoc 10 (reverse (entget en2))))))) 0.000001)
  16.             (equal (massoc 42 (entget en1)) (massoc 42 (reverse (entget en2))) 0.000001)
  17.             )
  18. )
  19.      t nil)
  20.    )

最初由 eachy 发布
[B]宽度信息考虑了吗? [/B]

这个到没有考虑..因我工作上用不到
如果大家有兴趣过几天我写一个完整的程序传上来
这些只是抛砖引玉希望大家多多交流
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

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

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-9-25 11:41:36 | 显示全部楼层
最初由 eachy 发布
[B]宽度信息考虑了吗? [/B]

呵呵..
这个道没有考虑
因为做我们这行的很少很少用到线宽的
所以就没有考虑,如果大家有兴趣的话我过几天传一个完善的
程序出来..
这些知识抛砖引玉而已,见笑了..
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2005-9-25 11:47:08 | 显示全部楼层
判断完全重合,不考虑反向,含子段线宽,不包括全局宽度,考虑反向时只要对一个表的Bugle错位后再比较即可
仅适用 LightWeightPolyline

  1. ;;(samepoly (entget (car (entsel))) (entget (car (entsel))))
  2. (defun samepoly        (el1 el2 /)
  3.   (if (equal (assoc 90 el1) (assoc 90 el2));_首先顶点数要相同
  4.     (equal (member (assoc 10 el1) el1)
  5.            (member (assoc 10 el2) el2)
  6.     )
  7.     nil
  8.   )
  9. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-25 12:34:31 | 显示全部楼层
这个仅适用完全重合..我们很多情况要用到不完全重叠的相同图元..
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

 楼主| 发表于 2005-9-25 12:39:40 | 显示全部楼层
算的..不管你怎么旋转增量坐标还是相同的..所以这点已经考虑在内了..
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-9-25 20:16:15 | 显示全部楼层
最近我碰到一个问题,就是我在用boundary的时候,在同一个区域由于设置了不同的点,而构造出了许多边界多义线,这些多义线都是重叠封闭的,而且起点经常不同,方向也可能不同,我希望认为他们是相同多义线,并只保留其中一条,各位长老有什么好一点的代码么?非常感谢
我自己的想法是这样的
提取某条多义线的端点作为一个表,然后对这个表进行正向移位逐步得到以其他vertex为起点的其他n个顶点表,然后逆向移位得到n个表,把这些表组成一个新表。
假如还需要按照不重合的规则,则象上所述判别增量及bulge数值。
其他的多义线与这个表内元素逐一对比,如属于表中任何一种,则算相同,可以删除之。
不过似乎挺烦琐的:(
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-9-25 20:23:50 | 显示全部楼层
当然是一摸一样,除了dxf-1 dxf5是自动给的.

  1. (equal (vl-remove-if '(lambda(x)(member (car x) '( -1 5))(entget e1))
  2.           (vl-remove-if '(lambda(x)(member (car x) '( -1 5))(entget e2))
  3.            1e-4
  4.   )

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

使用道具 举报

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

使用道具 举报

发表于 2005-9-26 12:19:10 | 显示全部楼层
最初由 狂刀 发布
[B]外形一样,颜色不一样算不算一样? [/B]


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

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2005-9-26 12:20:50 | 显示全部楼层
最初由 aeo 发布
[B]当然是一摸一样,除了dxf-1 dxf5是自动给的.
[code]
(equal (vl-remove-if '(lambda(x)(member (car x) '( -1 5))(entget e1))
          (vl-remove-if '(lambda(x)(member (car x) '( -1 5))(entget e2))
   ... [/B]


就是 (equal (cddddr (entget e1)) (cddddr (entget e2)) 1e-4) 。
其实,如果考虑各种情况,这个题目是很复杂的,比如反向、旋转、闭合、非平行平面等等。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-28 15:47 , Processed in 0.320367 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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