3.qt-图解Weiler-Atherton任意多边形剪裁算法
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任意多边形剪裁算法相关推荐
- python计算多边形的面积并保留两位小数_Python计算任意多边形面积算法
多边形面积求解的方法很多,其中比较多见的就是增加一个点P,然后分别连接多边形各个定点与P点,然后计算每个三角形的符号面积(面积有正负之分),求和就可以计算出面积. 鉴于上面的方法,我们也可以用另外一种 ...
- python计算图形面积的方法_Python计算任意多边形面积算法
多边形面积求解的方法很多,其中比较多见的就是增加一个点P,然后分别连接多边形各个定点与P点,然后计算每个三角形的符号面积(面积有正负之分),求和就可以计算出面积. 鉴于上面的方法,我们也可以用另外一种 ...
- 任意多边形三维屋顶自动生成算法
任意多变性三维屋顶自动生成算法 已经在CSDN猫了一年了,通过这里找到许多资源,特别是Android方面的.但是一直没有写过博客,很感激在一些牛人博客里找到自己问题的答案,所以从今天起我也将效仿大家, ...
- 矩形内接任意多边形抠图(可以羽化边缘)
矩形内接任意多边形抠图(可以羽化边缘) 2017年02月12日 14:13:13 阅读数:1052 抠出一个矩形区域的内接多边接(或封闭曲线),必须都是单连通的, 如果不是单连通的,实际上需要分解成多 ...
- python画椭圆-python opencv圆、椭圆与任意多边形的绘制实例详解
圆形的绘制 : OpenCV中使用circle(img,center,radius,color,thickness=None,lineType=None,shift=None)函数来绘制圆形 impo ...
- cv2 画多边形不填充_OpenCV python: 任意多边形填充和凸多边形填充(fillPoly和fillConvexPoly的区别,有图有真相!)...
我们经常会使用contour或者自己圈出来的区域填上对应的值或者,所以经常会使用这样两个函数:fillPoly和fillConvexPoly,至于这两个函数有什么区别呢?小伙伴从题目中就可以看出来了, ...
- 一种求任意多边形内部水平方向似最大矩形的算法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在前一篇中,我们探讨了如何求凸多边形中的似最大圆,但是针对实际 ...
- 凸多边形面积_C++计算任意多边形的面积
任意多边形的面积计算_拾忆楓灵的博客-CSDN博客blog.csdn.net 计算任意多边形的面积 - tenos - 博客园www.cnblogs.com 完美解决计算3D空间任意多边形面积_S ...
- python用circle画多边形_pythonopencv圆、椭圆与任意多边形的绘制
圆形的绘制 : OpenCV中使用circle(img,center,radius,color,thickness=None,lineType=None,shift=None)函数来绘制圆形 impo ...
最新文章
- 网站路径及文件路径问题
- FD.io/VPP — DNS Plugin
- HTTP Client 编写
- Python 技术篇-sha256()加密的使用方法,sha1、md5加密方法
- 为什么“不在乎别人的眼光”是个大谎言?
- sql的加减乘除运算_小白学sql(一)
- Testin云測与ARM 战略合作:推动全球移动应用加速进入中国市场
- Python更改数据类型——astype()方法和to_numeric()函数
- macos big sur 11 完整离线安装包v11.5.2正式版
- Excel数据分析工具安装步骤
- HTML网页制作代码大全——中华传统文化设计题材网站(html+css)
- 人类微笑表情识别(HOG算法)
- Drozer的安装和使用教程(入门)
- PHP: Fatal error:Call to undefined function com_create_guid()
- 实时股价——可以查询股票当前价格。用户可以设定数据刷新频率,程序会用绿色和红色的箭头表示股价走势。
- java 下载另存为_java中如何实现点击下载出现另存为的对话框
- 矩阵变换:矩阵是怎样变换向量的
- elementUI table隐藏行
- MATLAB显示剪切板不可用,电脑剪切板不能正常启动或者使用。
- Oracle 触发器trigger介绍