问题说明

实际操作中,发现有的多边形存在“尾巴”或者很细的部分。“尾巴”细长,明显不是有效建筑物区域,特点就是区域面积小,看起来细长,附着于大面积多边形外测或者连接两个多边形

需要去除尾巴或者分割多边形,为后面拟合多边形做准备。

算法思想

去除“尾巴”(凸出部分)和分割多边形的算法思想:

1.求平均距离。

针对环,遍历每个点,求到下一个点之间的距离,计算该环两点间的平均距离L,为之后设定阈值做准备。

具体做法:每个polyline(环)添加计算平均距离的函数calAvgDis,添加平均距离成员变量avgDis,在构造函数中调用calAvgDis函数初始化avgDis。

2.设定判断两点的距离阈值和下标阈值。

即存在两个点下标差超过阈值,距离差小于阈值,若两点与其之间的点构成的环面积小于阈值,则说明“尾巴”存在;若大于阈值,则说明多边形应该分割。

此处下标阈值设定为10,距离阈值设定为3个avgDis,面积阈值设定为固定值,具体效果和参数的改变要根据实际效果改变。

3.遍历环上的没点,找到最符合条件的两点。

计算每点到其他点的距离,针对每个点来说,遍历的起点是本点阈值+下标阈值。

当出现距离小于阈值时,记录下标号,得到(本点下标,距离小于阈值点的下标)的下标对。

每个点可能有不同的下标对,每个环可能有不同的疑似点及其下标对。

如何找到最合理的两点,遍历这些下标对:1)首先找下标号差距最大;2)相同的情况下距离最小的;

4.找到两点后:1)针对“尾巴”(面积小于阈值),消除两个点之间的点,得到除去尾巴的多边形。2)针对面积大于阈值的,分割多边形。

5.循环操作,直至某一次操作前后环的点个数一致。

实际操作

1.设置 距离阈值 和 下标差阈值,实际数值根据要求进行设置

int firstNum = circles[i]->pts.size();  //操作前点数
int lastNum = 0;   //操作后点数  初始为0
int t = circles[i]->pointDisThreshold; //下标差阈值
double length = circles[i]->calAvgDis(circles[i]->pts);  //距离阈值

2.针对环的每一个点,求与之距离超出阈值,下标差超过阈值且差值最大的点,形成一个点与另一个点的关系对(J和K),遍历所有的关系对,找到最合适的一个关系对(因为每次只删除一个尾巴)

while( count<1 && firstNum!=lastNum ){firstNum = circles[i]->pts.size();int num = circles[i]->pts.size()-1;  //环的点数(去除尾点)int finalJ = 0, finalK = 0, FinalDis = 0, finalType = 0;  //最后J,K,类型if(num > t) { //环的总点数大于点数差阈值时//找到所有环中下标差最大的两点for(int j = 0 ; j < (num - t); j++){ //遍历环的每个点,int tempDis = 0, tempk = 0, temptype = 0;for(int k = (j + t) ; k<num && (j+num-k)>=t ; k++) {  //针对每一个点,计算该点与符合要求的点的距离,找到下标差最大的另一个点,int dis = (j+num-k)>=(k-j)?(k-j):(j+num-k);   //取小的int type = (j+num-k)>=(k-j)?1:2;   // 1代表顺序,2代表非顺序if( (calDis(circles[i]->pts[j],circles[i]->pts[k])<(length*3)) && (tempDis<dis) ){  //寻找下标差最大tempDis = dis;tempk = k;temptype = type;}}if( FinalDis<=tempDis ){FinalDis = tempDis;finalJ = j;finalK = tempk;finalType = temptype;}} }

3.删除尾巴或者分割多边形

实验效果

            

总结

由于本算法自己原创,实际问题又非常复杂,所以效果并没有很理想,后期还有优化。实际操作中,部分尾巴去不掉,算法也耗时,这表明这种方法并不是一个很成熟的算法。而且由于数据的复杂性,考虑的问题很多。比如有的最理想的点对中,一个在环首附近的位置,另一个在环尾附近位置,需要考虑不同的取舍办法,等等。

该算法以后需要进一步考虑和优化。

转载于:https://www.cnblogs.com/fan-0802-WHU/p/9748689.html

(四)建筑物多边形化简系统——“去尾巴”和分割复杂多边形相关推荐

  1. 打造黑苹果(四)安装MACOS系统

    打造黑苹果(四)安装MACOS系统 前情回顾 打造黑苹果(一)组装硬件的选择与组装 打造黑苹果(二)制作黑mac系统安装U盘 打造黑苹果(三)COMS(BIOS)设置 前言 经过前面的步骤,我们可以正 ...

  2. (附源码)计算机毕业设计SSM英语四六级在线学习系统

    项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclis ...

  3. PID温控实验平台搭建(四)——PID温控系统实验代码讲解

    PID温控实验平台搭建 (一)PID基础知识介绍 (二)PID进阶知识介绍及源码分享 (三)从零开始搭建STM32温控实验平台 (四)PID温控系统代码讲解 (五)最终实验现象与总结 文章目录 前言 ...

  4. 第四章,简答题4-5,2017-4-6

    巫师属性类------- 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System ...

  5. linux 重启_四步见证linux系统重启过程,小心操作,防止后悔!

    linux小白到大神的成长之路:四步见证linux系统重启过程,小心操作,防止后悔! 本经验由宗龙龙原创,全文共880多字,阅读需要14分钟! 记得上篇文章给大家讲述linux系统的重启与关机操作,但 ...

  6. asp.net英语四六级考试报名系统

    英语是我国的第一外语,基本上每一个大学生在校期间都会考试英语四六级,传统的英语考试,四六级报名都是在学校的教务处或者通过班主任进行报考,这很不方便.尤其是在现在一个互联网这么发达的时代,如果还是通过这 ...

  7. 四六级考试报名系统c语言,四六级考试系统课程设计报告.doc

    四六级考试系统课程设计报告 <.NET架构及应用>期末考试 (课程设计总结) 设计名称: 英语四.六级考试报名系统 组 长: 白缔祖 参 加 人: 白缔祖.霍晓文 指导教师: 付向东 班 ...

  8. 计算机毕业设计(附源码)python英语四六级在线学习系统

    项目运行 环境配置: Pychram社区版+ python3.7.7 + Mysql5.7 + HBuilderX+list pip+Navicat11+Django+nodejs. 项目技术: dj ...

  9. Java计算机毕业设计四六级在线考试系统源码+系统+数据库+lw文档

    Java计算机毕业设计四六级在线考试系统源码+系统+数据库+lw文档 Java计算机毕业设计四六级在线考试系统源码+系统+数据库+lw文档 本源码技术栈: 项目架构:B/S架构 开发语言:Java语言 ...

最新文章

  1. 【面试题】C语言:模拟实现memcmp,试比较memcmp与strcmp,strncmp的区别
  2. 上传html 0字节,HTML ajax 上传文件限制文件的类型和文件大小
  3. C++文件操作的HelloWorld
  4. (博主可帮找错)Servlet.service() for servlet [dispatcherServlet] path [] threw exception feign.Feig,可截图私聊博主
  5. 数据库系统是采用数据库技术的计算机系统,1数据库系统是采用了数据库技术的计算机系统.doc...
  6. 兼容IE8的多文件上传实现
  7. 小卡与质数2全网最简单思路 看不懂你来打我
  8. HTML Table 表格斜线
  9. canvas教程16-滚动的车轮
  10. AndroidStudio打包AAR供Unity使用流程
  11. 在外远程登录公司内网OA系统
  12. 参数维纳滤波(Parametric Wiener Filter)
  13. 黑鲨一代启动Android密码,黑鲨一代(BlackShark) 刷入TWRP 获取完美ROOT权限 刷机教程...
  14. NID修改数据库名称时候碰到NID-00137
  15. 什么是服务器丢包?恒讯科技教你如何解决
  16. Android UI 组件开源软件(一)
  17. html 里面的 role 属性是什么意思
  18. 字符串左旋右旋——三步旋转法和移相法
  19. js下载文件的方法(H5、PC)(小程序)
  20. Cocos2d-x 3.0 屏幕触摸及消息分发机制

热门文章

  1. 微信终端跨平台组件 mars 系列(一) - 高性能日志模块xlog
  2. 浏览器获取文件MD5值
  3. oracle从一个表insert语句,Oracle 使用PLSQL 导出 一个表的insert 语句
  4. 计算机绘图cg,CG专业英语整理
  5. python哪个方向工资高_Python薪资最高的是一线城市,竟然平均月薪高达20k!
  6. linux npm安装_手把手教你appium框架的搭建—linux
  7. 期待的程序员的生活并非你想象的那么简单!
  8. visual studio无法更新_微软发布 VS Code Python 四月更新
  9. 粒子群(PSO)算法简介
  10. [总结] 平衡树总结