明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: Gu_xl

[【Gu_xl】] 【Gu_xl】基于方位角计算的拓扑多边形自动构建快速算法

    [复制链接]
发表于 2012-9-9 01:36 | 显示全部楼层
终于给我找到了,哈哈,好东西啊
发表于 2012-9-9 23:32 | 显示全部楼层
好东西,学习了!!!
发表于 2012-9-13 15:38 | 显示全部楼层
Gu_xl 发表于 2011-1-26 19:48
优化算法后的代码:

请问版主一个问题:
最后一步"根据生成的多边形拓扑表绘制多边形",函数名是: gxl-DrawPolyLine
其中 您是如何构建出来多边形的? 是把弧段pedit吗? 还是按照坐标点绘制的呢?

我拿了一个很大的数据测试,其中面有大概 800多个的样子
最后发现,有的面 和原来的 line 线 不重合,有缝隙......

点评

程序对节点坐标按精度指标进行了取整,所以不会和原实体严格重合!  发表于 2012-9-21 11:59
发表于 2012-9-19 15:35 | 显示全部楼层
miraclelll 发表于 2012-9-13 15:38
请问版主一个问题:
最后一步"根据生成的多边形拓扑表绘制多边形",函数名是: gxl-DrawPolyLine
其中 您 ...

问题已解决

版主的最后构建多边形的函数, 无法知道原因
我自己写了一段替代的代码, 使用entmake的方式,就不会有缝隙产生了

ps: 版主, 外包多边形的删除,效率太慢了, 可以优化的
发表于 2012-9-19 23:57 来自手机 | 显示全部楼层
去年我看到这个帖子的时候就为之一震,认为这是一个绝好的算法,划分有限元网格十分方便,但当时缺少很多子函数就没有研究了,不知道这次补全了没?
发表于 2012-9-20 00:00 来自手机 | 显示全部楼层
miraclelll 发表于 2012-9-19 15:35
问题已解决

版主的最后构建多边形的函数, 无法知道原因

能否把你的替代代码发上来分享下,也请版主出来探讨下,能不能打造出一个精品来!…
发表于 2012-9-20 10:29 | 显示全部楼层
本帖最后由 miraclelll 于 2012-9-20 10:31 编辑
tm20038175 发表于 2012-9-20 00:00
能否把你的替代代码发上来分享下,也请版主出来探讨下,能不能打造出一个精品来!…


哦,对不起, 忘记附上去了.... 以下是我优化后的 删除外包多边形

原来的思路是: 将每一个多边形和其他比他面积小的多边形 进行比较判断是否是 需要删除的错误图形( 函数 PolyInLwpolyLine)
             循环次数 为 n*(n-1)/2
其中判断 这个是否为删除的错误图形 , 需要花费些时间,特别是节点很多的情况

优化后的思路是: 在进行判断是否需要删除的图形之前, 判断其是否有公边, 如果没有公边,就不要进去去判断了,肯定不是错误的图形, 然后如果判断为错误图形,就不需要拿这个图形继续和其他比较了
               循环次数, 会有所降低
               主要省的时间在于:  判断是否是 需要删除的错误图形( 函数 PolyInLwpolyLine) 这个函数不需要进行 N*(N-1)/2 次

ps: 如果图形比较简单,其实优化与否没有关系, 但是如果需要构建的图形比较多的情况,就会看到省了很多时间. 我测试的数据是: 近1000 的图形需要构建,  初始传入的 line线 有3000 多. 时间降低到1/3

附上代码:
  1. ;;; 删除外包多边形;;;
  2. (defun gxl-DelOutPolyline (ss0 / ssL ssL1 ent flag en1 rtn n i j en )
  3.   (princ "\n 删除外包多边形... ... ")
  4.   (setq t7 (getvar "cdate"))
  5.   (setq rtn (ssadd)
  6.           flag nil
  7.           )
  8.   (setq ss (vl-sort ss0 '(lambda (e1 e2) (> (GXL-GETAREA (car e1)) (GXL-GETAREA (car e2))))))
  9.   (setq ssl (mapcar 'car ss)
  10.         numlist (mapcar 'cadr ss)
  11.         )
  12.   (setq n (length ssl) i 0)
  13.   (setq m (length polytopolst) j 0)
  14.   (GXL-SYS-PROGRESS-INIT "删除外包多边形" n)

  15.   (while (< i n)
  16.     (setq en (nth i ssl)
  17.           num (nth i numlist)
  18.           numlist2 (member num numlist) ;;; 面积小的图元序号列表;
  19.           )
  20.     (setq topopoly (nth num polytopolst))
  21.     (foreach topo topopoly
  22.       (setq mn (length numlist2))
  23.       (setq j 1)
  24.       (while (and (< j mn) (= flag nil))
  25.         (setq num2 (nth j numlist2))
  26.         (setq poly (nth num2 polytopolst))
  27.         (setq poly (mapcar 'abs poly))
  28.         (if (and (/= j num)
  29.                  (member (abs topo) poly)
  30.                  )
  31.           (progn
  32.             (setq en1 (car (nth num2 ss0)))
  33.                   (if (PolyInLwpolyLine en1 en)
  34.                     (setq flag t)
  35.                     );_if
  36.           )
  37.           );_if
  38.         (setq j (1+ j))
  39.         ); _foreach
  40.       
  41.       ); _foreach
  42.    

  43.       (if flag (progn (vl-remove (nth i ss) ss) (entdel en)(setq flag nil)))
  44.       (setq i (1+ i))
  45.       (GXL-SYS-PROGRESS  n -1)
  46.       )
  47.   (GXL-SYS-PROGRESS-DONE)
  48.   (GXL-SYS-TIMEOUT t7)
  49.   ss
  50.   )
发表于 2012-9-20 10:36 | 显示全部楼层
tm20038175 发表于 2012-9-19 23:57
去年我看到这个帖子的时候就为之一震,认为这是一个绝好的算法,划分有限元网格十分方便,但当时缺少很多子 ...

里面还是缺少一些 函数, 但是不影响主线
我是自己补上去的
发表于 2012-9-20 11:13 来自手机 | 显示全部楼层
miraclelll 发表于 2012-9-20 10:36
里面还是缺少一些 函数, 但是不影响主线
我是自己补上去的

谢谢分享,缺函数很讨厌呀,你能做到自己补函数确实很了不起呀,其他人可不一定有这个本领了,呵呵。。。
要是能把缺的函数也补全,那程序就完美了,不知道这是不是版主的原意。。
发表于 2012-9-20 11:20 来自手机 | 显示全部楼层
建议大家研究下这个帖子,在划分单元时候很实用,也十分感谢miraclelll的完善和优化…
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 11:00 , Processed in 2.863201 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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