1.Weiler-Atherton多边形剪裁算法

Weiler-Atherton剪裁算法是一个适用于凸的、凹的和带孔的多边形的裁剪算法。

裁剪窗口可以是矩形、任意凸多边形、任意凹多边形。

与 Sutherland – Hodgman 多边形裁剪算法不同,该算法能够裁剪凹多边形而不会留下任何残留物。

需要注意的是保证两个多边形的端点是顺时针的.当然也可以通过函数进行判断一下,从而进行反转:

WeilerAtherton::ClockWiseType WeilerAtherton::isClockWise(QVector<QPointF> points)
{if (points.length() < 3)    // 错误,points是一个点或者一条线return  ClockWiseUnknown;// Shoelace formula算法来计算多边形面积判断顺和逆qreal area = 0;for (int i = 0; i < points.length(); i++) {int j = (i + 1) % points.length();area += points[i].x() * points[j].y();area -= points[j].x() * points[i].y();}if(area / 2.0 > 0)return Anticlockwise;return ClockWise;
}

2.算法图解-简单示例1

找到所有交点,下图所示:

通过规律可以看出如果主多边形与裁剪多边形有交点,交点成对出现,然后我们可以将相交点规定为进点和出点(enter和exit)、然后找到所有的近点和出点相交点.如下图所示:

制作两个列表:

一个是裁剪多边形(VWXYZ),一个主多边形(ABCD):

找到第一个进点:

从裁剪多边形的列表(VWXYZ)开始,找到第一个进点为i1,然后我们就可以开始在ABCD区域绘制子方形,直到遇到第一个出点i2(出点代表另一个列表的入点).然后再次在ABCD列表中从i2开始,直到绘制到开始点i1为止(避免被漏掉).

然后继续往后遍历,得到:

3.算法图解-简单示例2

设P1 P2 P3 P4 P5 P6为裁剪多边形, V1 V2 V3 V4 V5 V6为主多边形

从裁剪多边形开始,找到第一个入点i2后,直到绘制到终点i2为止,遍历如下所示:

i2 –> i3(列表1的出点,相当于是列表2的入点)

跳转到列表2的入点i3遍历:

i3->i8(列表2的出点)

跳转到列表1的入点i8遍历:

i8->i1(列表1的出点)

继续跳到列表2的入口i1遍历:

i1->i2(遇到开始的入点则停止)

最后重复往后遍历,直到最后得到:

实现效果如下所示,代码很乱,后续整理后发出来(主多边形是一个带内环多边形)

3.qt-图解Weiler-Atherton任意多边形剪裁算法相关推荐

  1. python计算多边形的面积并保留两位小数_Python计算任意多边形面积算法

    多边形面积求解的方法很多,其中比较多见的就是增加一个点P,然后分别连接多边形各个定点与P点,然后计算每个三角形的符号面积(面积有正负之分),求和就可以计算出面积. 鉴于上面的方法,我们也可以用另外一种 ...

  2. python计算图形面积的方法_Python计算任意多边形面积算法

    多边形面积求解的方法很多,其中比较多见的就是增加一个点P,然后分别连接多边形各个定点与P点,然后计算每个三角形的符号面积(面积有正负之分),求和就可以计算出面积. 鉴于上面的方法,我们也可以用另外一种 ...

  3. 任意多边形三维屋顶自动生成算法

    任意多变性三维屋顶自动生成算法 已经在CSDN猫了一年了,通过这里找到许多资源,特别是Android方面的.但是一直没有写过博客,很感激在一些牛人博客里找到自己问题的答案,所以从今天起我也将效仿大家, ...

  4. 矩形内接任意多边形抠图(可以羽化边缘)

    矩形内接任意多边形抠图(可以羽化边缘) 2017年02月12日 14:13:13 阅读数:1052 抠出一个矩形区域的内接多边接(或封闭曲线),必须都是单连通的, 如果不是单连通的,实际上需要分解成多 ...

  5. python画椭圆-python opencv圆、椭圆与任意多边形的绘制实例详解

    圆形的绘制 : OpenCV中使用circle(img,center,radius,color,thickness=None,lineType=None,shift=None)函数来绘制圆形 impo ...

  6. cv2 画多边形不填充_OpenCV python: 任意多边形填充和凸多边形填充(fillPoly和fillConvexPoly的区别,有图有真相!)...

    我们经常会使用contour或者自己圈出来的区域填上对应的值或者,所以经常会使用这样两个函数:fillPoly和fillConvexPoly,至于这两个函数有什么区别呢?小伙伴从题目中就可以看出来了, ...

  7. 一种求任意多边形内部水平方向似最大矩形的算法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在前一篇中,我们探讨了如何求凸多边形中的似最大圆,但是针对实际 ...

  8. 凸多边形面积_C++计算任意多边形的面积

    任意多边形的面积计算_拾忆楓灵的博客-CSDN博客​blog.csdn.net 计算任意多边形的面积 - tenos - 博客园​www.cnblogs.com 完美解决计算3D空间任意多边形面积_S ...

  9. python用circle画多边形_pythonopencv圆、椭圆与任意多边形的绘制

    圆形的绘制 : OpenCV中使用circle(img,center,radius,color,thickness=None,lineType=None,shift=None)函数来绘制圆形 impo ...

最新文章

  1. 网站路径及文件路径问题
  2. FD.io/VPP — DNS Plugin
  3. HTTP Client 编写
  4. Python 技术篇-sha256()加密的使用方法,sha1、md5加密方法
  5. 为什么“不在乎别人的眼光”是个大谎言?
  6. sql的加减乘除运算_小白学sql(一)
  7. Testin云測与ARM 战略合作:推动全球移动应用加速进入中国市场
  8. Python更改数据类型——astype()方法和to_numeric()函数
  9. macos big sur 11 完整离线安装包v11.5.2正式版
  10. Excel数据分析工具安装步骤
  11. HTML网页制作代码大全——中华传统文化设计题材网站(html+css)
  12. 人类微笑表情识别(HOG算法)
  13. Drozer的安装和使用教程(入门)
  14. PHP: Fatal error:Call to undefined function com_create_guid()
  15. 实时股价——可以查询股票当前价格。用户可以设定数据刷新频率,程序会用绿色和红色的箭头表示股价走势。
  16. java 下载另存为_java中如何实现点击下载出现另存为的对话框
  17. 矩阵变换:矩阵是怎样变换向量的
  18. elementUI table隐藏行
  19. MATLAB显示剪切板不可用,电脑剪切板不能正常启动或者使用。
  20. Oracle 触发器trigger介绍

热门文章

  1. 新能源汽车Tesla的命名
  2. Impossible n‘est pas français (Exploit) 答案
  3. Exchange 2016无法执行ActiveSync测试
  4. DMOZ重新接受登录申请(转)
  5. 职场选择之大公司 VS 小公司
  6. python 自定义文件类型
  7. java 每日一练——英雄怪兽文字攻击实例(每步都有解释)
  8. 大创项目(记录自己的教训)
  9. 如何把pdf文件转换成eps文件
  10. empress和queen区别_女王英文如何表达 原来扑克牌和女王也有关吗