【计算几何】判断多边形边界顺逆时针 & C++代码实现

这篇具有很好参考价值的文章主要介绍了【计算几何】判断多边形边界顺逆时针 & C++代码实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一、多边形边界顺序

多边形可以由一个点集 { v 1 , v 2 , . . . , v n } \{v_1,v_2,...,v_n\} {v1,v2,...,vn} 表示,构成多边形的点集确定,多边形边界的顺序也就确定了

有关多边形边界的顺序的示意图,如下图所示:

【计算几何】判断多边形边界顺逆时针 & C++代码实现

有时候关于数据格式有规定,要求多边形边界必须为顺时针或者逆时针。

因此,我们需要对多边形边界的顺序进行判断,如果不符合要求,则需要将构成多边形的点集进行反转


二、数学原理

2.1 Green公式

Green公式揭示了平面区域的二重积分和封闭曲线上的线积分的关系:沿着多边形的边求曲线积分,若积分为正,则是沿着边界曲线正方向(逆时针),反之为顺时针,且所得绝对值为多边形面积

判断多边形是逆时针还是顺时针,就更简单了,直接计算多边形面积(不取绝对值):

  • 如果面积为正值,是逆时针
  • 如果面积为负值,是顺时针

计算的时候要注意,多边形的边界是个环,首尾闭合,最后一点和起点,坐标相同,别少个节点。

2.2 鞋带公式

鞋带公式也叫高斯面积公式,是一种数学算法,可求确定区域的一个简单多边形的面积。

所谓“简单多边形”,可以是凹、或凸多边形,但原则上边与边之间不能有交叉。

鞋带公式如下:

S = 0.5 ⋅ ∣ ∑ i = 1 n ( x i ⋅ y i + 1 − y i ⋅ x i + 1 ) ∣ S = 0.5 · |\sum^n_{i=1}{(x_i·y_{i+1}-y_i·x_{i+1})}| S=0.5i=1n(xiyi+1yixi+1)

因为判断环的方向只需要知道多边形面积的正负,所以最终使用的“简化版鞋带公式”为:

S ′ = ∑ i = 1 n ( x i ⋅ y i + 1 − y i ⋅ x i + 1 ) S' = \sum^n_{i=1}{(x_i·y_{i+1}-y_i·x_{i+1})} S=i=1n(xiyi+1yixi+1)文章来源地址https://www.toymoban.com/news/detail-465055.html


三、代码实现

// 点 对象
struct Vertex{
    Vertex(double px=0.0, double py=0.0) {
        x = px;
        y = py;
    }
    double x;
    double y;
};

// 多边形对象
class Poly
{
public:
	vector<Vertex> vertex; // 顶点集
};

// 判断多边形顺逆时针(true:顺时针,false:逆时针)
bool judgePolyDirection(Poly poly){
	double s = 0;
	for (int i = 0; i < poly.vertex.size(); i++){
		int j = i + 1 < poly.vertex.size() ? i +1:0;
		s += (poly.vertex[i].x * poly.vertex[j].y - poly.vertex[i].y * poly.vertex[j].x);
	}
	return s < 0;
}

到了这里,关于【计算几何】判断多边形边界顺逆时针 & C++代码实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【3Ds Max】可编辑多边形“边界”层级的简单使用

    目录 示例 (1)挤出 (2)插入顶点 (3)切角 (4)利用所选内容创建图形 (5)封口 (6)桥 这里我们首先创建一个长方体,然后将其中键部分删除,形成上下底面缺失的长方体,这样就会有两个可选择的边界 (1)挤出 可以设置挤出的宽度和高度 (2)插入顶点 我们可以

    2024年02月11日
    浏览(52)
  • BoxPolyp:使用超粗边界框注释的提升广义多边形分割

    在本文中,提出了一种增强的BoxPolyp模型使用精确掩码和超粗框注释。在实践中,应用框注释来缓解先前息肉分割模型的过拟合问题,该模型通过迭代增强分割模型生成细粒度的息肉区域。 首先提出了一种融合滤波器采样(FFS)模块,用于从具有较少噪声的框注释中生成逐像

    2024年02月03日
    浏览(47)
  • opencv 判断点在多边形内外

            基于Python 和 OpenCV 画出多边形,以及判断某个点是不是在多边形内。         函数定义:cv2.pointPolygonTest(contour, pt, measureDist)         函数功能:找到图像里的点和轮廓之间的最短距离. 它返回的距离当点在轮廓外的时候是负值,当点在轮廓内是正值,如果

    2024年02月12日
    浏览(65)
  • 判断点在多边形内算法的C++实现

    本篇博客介绍了使用射线法判断点在多边形内部还是外部的算法,并通过C++做了具体实现 1. 算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况。该算法的思路很简单,就是从目标点出发引一条射线,看这

    2024年02月12日
    浏览(56)
  • 如何判断一个点是否在凸多边形内 - golang

    判断一个点是否在凸多边形内的方法很多,此处仅给出使用 向量叉积法 判断点是否在凸多边形内的方法。 以下图为例说明问题: 原理: 1. 将多边形的第 i 条边的第一个顶点指向点 P 得到向量 v1,然后将从第一个顶点指向第二个顶点得到向量 v2,叉乘这两个向量。 2. 如果叉

    2024年02月07日
    浏览(52)
  • 计算两个多边形的交集

    已知两个多边形Polygon1和Polygon2,分别由点集C1={P1,P2,...,Pm}和C2={Q1,Q2,...,Qn}表示,求这两个多边形的交集。 两个多边形相交后,其顶点要么是两个多边形边的交点,要么是在多边形内部的点。 计算两个多边形每条边之间的交点。 计算包含在多边形内部的点。 将交点和多边形内

    2024年02月12日
    浏览(70)
  • mysql如何实现根据经纬度判断某一个坐标是否在一个多边形区域范围内

    要根据经纬度判断一个坐标是否在一个多边形区域内,MySQL提供了几种函数来处理地理空间数据,其中包括用于处理多边形区域的函数。 首先,创建一个表来存储多边形区域。可以使用 ST_GeomFromText 函数将多边形的坐标转换为地理空间对象。我们给他插入两条数据,默认id第一

    2024年02月08日
    浏览(57)
  • python 如何判断点是否在多边形(三角形)内,或求点在3D面上的投影?

    方法1: 用shapely中的geometry包 1)polygon.covers(point) 如果point在多边形polygon上(包括边),返回True,否则False。 2)polygon.contains(point) 如果point在多边形polygon上(不包括边),返回True,否则False。 方法2: 用blender的内置python api。 将点投影到三角形平面上,并检查其是否在三角形

    2023年04月09日
    浏览(49)
  • 计算两个多边形的最近距离(MATLAB)

            本文意在介绍关于计算两组坐标点的最近距离的简单方法,可用此方法来计算两个多边形的最近距离以及距离最近的两个点。下面展示具体实例。 函数代码         该函数可以比较快速的计算两组坐标点之间的最小距离,并返回相应的坐标。缺点是只能计算整数

    2024年02月08日
    浏览(44)
  • 计算机图形学 第4章 多边形填充

    了解扫描转换的基本概念。 熟练掌握多边形有效边表填充算法。 掌握多边形边缘填充算法。 熟练掌握区域四邻接点和八邻接点区域填充算法。 掌握区域扫描线种子填充算法。 无论使用哪种着色模式,都意味着要使用指定颜色为多边形 边界内 的每一个像素着色。 多边形的

    2024年02月02日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包