明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 18404|回复: 125

[源码] 基于图元形位特征码的重复对象检测技术,快速分析图形文件中重复对象

  [复制链接]
发表于 2018-5-5 23:26:12 | 显示全部楼层 |阅读模式
本帖最后由 vectra 于 2018-5-5 23:28 编辑

本文介绍了一种利用散列函数分析图形文件中重复对象的方法

一般图元的位置和形状通过1 2 10 11 12 13 14 15 40 50 51等组码来表达,为加快比对分析的效率,对上述组码通过散列函数提取该图元的特征码,特征码为一个整数型数值,相当于将一个图元压缩成一个整数,只要该整数相同,即可认为图元相同,由于整数便于排序,大大加快了对比的效率。
核心HASH函数,为BKDR
这个算法来自Brian Kernighan 和 Dennis Ritchie的 The C Programming Language。是一个非常简单高效的哈希算法。


  1. (defun hash-1 (e h /)
  2.   (+ (fix e) (* 31 h))
  3. )


点的HASH方法,本例中对浮点数进行了取整操作,对于一般工程制图没有影响。
  1. (defun hash-p (lst h /)
  2.   (foreach e lst
  3.     (setq h (hash-1 e h))
  4.   )
  5. )



生成块表对象中所有图元的HASH代码,如果需要对对象的图层,颜色等进行判断,可以表中加入8 62等组码。句柄及运行时生成的图元名不应加入。

  1. (defun hash-block (block / dxf h ht)
  2.   (vlax-for item block
  3.     (setq dxf (entget (p-ensure-ename item))
  4.     h   (hash
  5.     (mapcar
  6.       'cdr
  7.       (vl-remove-if-not '(lambda (e) (member (car e) '(1 2 10 11 12 13 14 15 40 50 51))) dxf)
  8.     )
  9.         )
  10.     )
  11.     (setq ht (cons (cons h (p-cls-get dxf 5)) ht))
  12.   )
  13.   ht
  14. )


性能:
对于两三万对象的图形一般可以数秒内完成,而且算法时间复杂度为N,数据量增加时耗时线性增长。


存在的问题:

一个整数不可能完全代表所有对象,即会产生碰撞,但几率比较小,对于有数万个图元的图形来说,几乎难以发生。对于需要高度可靠的场景,可以对相同HASH值的图元进行二次排查。


完整的代码见附件




本帖子中包含更多资源

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

x
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2022-3-23 00:21:32 | 显示全部楼层
每组重复对象,只选中n-1个对象

本帖子中包含更多资源

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

x
回复 支持 1 反对 0

使用道具 举报

发表于 2018-5-9 08:13:38 | 显示全部楼层
看来楼主的消重只能针对 完全重叠的 图元,那这个意义不大了,因为
第一:重叠必定存在一定的容差,所以程序必须能有容差值参数
第二:多段相重叠的直线,必须获取其最长线的点
第三:圆弧同直线,如果是封闭成圆的圆弧,那消重后就是圆了
还有很多情况需要考虑,单纯消除完全重叠 其实很简单,效率也很快
发表于 2018-5-9 08:09:20 | 显示全部楼层
关于消重 程序,我已经写了,并且优化了 2年了,就是 效率稍慢,超过6000个图元就会卡,2000以内图元还是比较轻松消重的,看看楼主的算法 效率怎么样,最主要是 效果是否完美
发表于 2018-5-6 07:21:46 | 显示全部楼层

学习一下!
学习一下!
发表于 2018-5-6 08:10:01 | 显示全部楼层
什么好东西,谢谢分享
发表于 2018-5-6 08:10:35 | 显示全部楼层
回复学习,学习!
发表于 2018-5-6 08:12:34 | 显示全部楼层
感谢楼主分享,学习一下!
发表于 2018-5-6 08:29:19 | 显示全部楼层
回复学习,学习了!!!!!
发表于 2018-5-6 09:04:03 | 显示全部楼层
新思想,一定要学习学习
发表于 2018-5-6 09:08:22 | 显示全部楼层
这个好,不知道删除重复能用不,先谢谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-17 06:25 , Processed in 0.188691 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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