明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 5126|回复: 16

多边形多重包含关系的分析

  [复制链接]
发表于 2013-4-1 00:09 | 显示全部楼层 |阅读模式
本帖最后由 llsheng_73 于 2015-8-24 16:52 编辑





在测绘类工作中,经常碰到上图所示的一些情况(当然一般没这么复杂),比如宗地内含岛宗,大片旱地中间有几块水田,水田中间有个水池,而一般情况下,搞测绘的都习惯于用闭合多线段来表示一个面,这就给很多统计分析等带来了麻烦。
当这种情况出现的时候,要求得它们的面积就比较头痛了,头痛就在于它们嵌套包含,所以发现一个多边形内部有几个小多边形的时候,计算它的面积就不能直接把内部多边形都减掉就了事。。。比如左边那个白色多边形,它里边有5个多边形,但计算它的面积只能减掉那两个红色的
对这个问题的我处理的思路其实很简单,先是把每一个多边形弄成一个表,第一个元素是图元名,第二个元素是包含它的图元名(只有一个,暂时叫做母图元吧),第三个元素是所包含的图元名(这可以有0到N个,所以又是一个表,就先叫它们为子图元吧)
每个图元如果里边有多形,那么就去把其母图元的子图元表中去掉现在这个图元所包含的图元(就是把母图元的孙子去掉),接下看这些多边形,它们的母图元是不是在选中的多边形内,如果在话,那它就不是子图元,而是孙子辈的,这一类的多边形也要去掉,最后剩下的就是真正能计算在内的子图元。。。
源码附最后:函数名(dzfx s)参数s是一个只有闭合多线段的选择集,为了以后使用方便
最后返回的是一个表((图元名,母图元名,(子图元名,子图元名...))),可以根据各种需要对图元进行各种处理比如计算面积的时候就可以直接用图元名的面积直接去减子图元表中的所有子图元的面积,因为它里边已经没有它的孙子们存在了
  1. (defun plinexy(e / p i)
  2.   (setq i -1)
  3.   (mapcar(function(lambda(x)(list(car x)(cadr x))))(reverse(repeat(fix(1+(vlax-curve-getEndParam e)))
  4.     (setq i(1+ i)p(cons(vlax-curve-getPointAtParam e i)p)))))
  5.   (if(equal(car p)(last p))(reverse(cdr(reverse p)))p)
  6.   )
  7. (defun SStoES(s / m n e)
  8.    (if s(progn
  9.    (setq n(sslength s)m 0)
  10.    (while(< m n)
  11.      (setq e(if e(append e(list(ssname s m)))(list(ssname s m)))m(1+ m))))
  12.      )e)
  13. (defun dzfx(/ i ss e a b c d s1)
  14.   (repeat(length(setq i -1
  15.                       ss(mapcar(function(lambda(x)(list x""nil)))
  16.                                (vl-sort(SStoES(ssget"X"(list(cons 0 "LWPOLYLINE")(CONS -4 "&")'(70 . 1))))
  17.                                        (function(lambda(a b)(>(vlax-curve-getarea a)(vlax-curve-getarea b))))))))
  18.         (if(setq i(1+ i)e(nth i ss)
  19.                   s1(SStoES(ssget"WP"(plinexy(car e))(list(cons 0 "LWPOLYLINE")(CONS -4 "&")'(70 . 1))))
  20.                   f1(assoc(nth 1 e)ss))
  21.           (progn
  22.                 (setq d(nth 2 f1))
  23.                 (foreach a s1(if(member a d)(setq b(assoc a ss)c(nth 1 b)
  24.                                                   ss(subst(subst f c b)b ss)l 0)))
  25.                 (setq d(vl-remove-if(FUNCTION(LAMBDA(a)(member a s1)))d))
  26.                 (setq ss(subst(subst d(nth 2 f1)f1)f1 ss)l 0)))
  27.         (setq d nil)
  28.         (foreach a s1
  29.           (setq b(assoc a ss)c(nth 1 b)d nil)
  30.           (if(member c s1)(progn
  31.                             (if c(setq b(assoc c ss)c(nth 2 b)
  32.                                        ss(subst(subst(vl-remove a c)c b)b ss)l 0))
  33.                             (setq d(if d(append d(list a))(list a))))
  34.             (setq ss(subst(subst f c b)b ss))
  35.             ))
  36.         (setq s1(vl-remove-if(FUNCTION(LAMBDA(a)(member a d)))s1)
  37.               ss(subst(subst s1(nth 2 e)e)e ss))
  38.         )
  39.   )

本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
tryhi + 1 赞一个!

查看全部评分

发表于 2021-6-23 12:48 | 显示全部楼层
Gu_xl 发表于 2013-4-1 13:06
判断两个多边形之间的关系,可利用面域来判断!
假设将两个多边形转成面域1和面域2,分别计算出面域1和面 ...

学习了,mark
发表于 2019-7-17 00:34 | 显示全部楼层
嵌套比较多的会有错误。
发表于 2013-4-1 13:06 | 显示全部楼层
判断两个多边形之间的关系,可利用面域来判断!
假设将两个多边形转成面域1和面域2,分别计算出面域1和面域2的面积S1和S2,
然后,用 面域1 union 面域2,得到新面域1,计算新面域1的面积S3,
当 S3 = S1,则多边形1包含多边形2
当S3 = S2, 则多边形2包含多边形1
当 S3< S1+S2,则多边形1和多边形2相交
当S3 = s1+S2,则 当多边形1和多边形2无交点时,相离,当当多边形1和多边形2有交点时,多边形1和多边形2为邻接关系!
发表于 2013-4-1 16:29 | 显示全部楼层
Gu_xl 版主出手 学习了  之前也遇到过这个问题
发表于 2013-4-1 16:45 | 显示全部楼层
楼主  程序的执行命令是哪个呢?还是这只是程序的一部分?
发表于 2013-4-2 21:31 | 显示全部楼层
如果数据多的时候,面域会导致计算速度有点慢。
发表于 2013-5-9 12:53 | 显示全部楼层
写得非常好,思路不错
发表于 2013-10-14 13:13 | 显示全部楼层
没有人作完整的代吗?
 楼主| 发表于 2013-10-18 12:51 | 显示全部楼层
328302216 发表于 2013-4-1 16:45
楼主  程序的执行命令是哪个呢?还是这只是程序的一部分?

这就是程序的一部分,你可以把它当成一个函数用到你程序中,先测试下返回的表是什么样子自己决定怎么用它就是了,如果有对返回表有什么建议请一定说出来
 楼主| 发表于 2013-10-18 12:55 | 显示全部楼层
liujing95 发表于 2013-5-9 12:53
写得非常好,思路不错

谢谢夸奖
发表于 2014-4-4 18:42 | 显示全部楼层
加了 plinexy函数进去,怎么反回值是空呀,请问哪里出问题了
(cons 8 LDK)应该是 (cons 8 “ LDK”)吧,过滤LDK图层

点评

那是一个变量,不然直接写成(8 . "LDK")了  发表于 2014-4-4 18:49
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 12:32 , Processed in 0.498715 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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