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

news/2024/11/22 16:30:27/

文章目录

  • 一、多边形边界顺序
  • 二、数学原理
    • 2.1 Green公式
    • 2.2 鞋带公式
  • 三、代码实现


一、多边形边界顺序

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

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

在这里插入图片描述

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

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


二、数学原理

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)


三、代码实现

// 点 对象
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;
}

http://www.ppmy.cn/news/106798.html

相关文章

【高分论文密码】大尺度空间模拟预测与数字制图

详情点击链接&#xff1a;【高分论文密码】大尺度空间模拟预测与数字制图一&#xff0c;R语言空间数据及数据挖掘 1、R语言空间数据 1.1R语言基础与数据科学 1.2R空间矢量数据 1.3R栅格数据2、R语言空间数据挖掘关键技术​​​​​​​二&#xff0c;R语言空间数据高级处理技…

通信及信号处理领域期刊影响因子、分区及期刊推荐

期刊名IF(2023)中科院分区(2023)备注IEEE Journal on Selected Areas in Communications13.081计算机科学1区Top通信顶刊IEEE Transactions on Signal Processing4.875工程技术1区Top信号处理顶刊IEEE Transactions on Information Theory2.978计算机科学2区Top信息论顶刊IEEE …

第六章 组合数据类型

文章目录 第六章 组合数据类型6.1 组合数据类型的基本概念6.1.1 集合类型概述6.1.2 序列类型概述6.1.3 映射类型概述 6.2 列表类型6.2.1 列表的定义6.2.2 列表的索引6.2.3 列表的切片 6.3 列表类型的操作6.3.1 列表的操作函数6.3.2 列表的操作方法 6.4 字典类型6.4.1 字典的定义…

Tinder多账号注册怎样防关联?

Tinder是目前除了Facebook&#xff0c;用户数量较多的一款海外交友软件。它采用匹配的机制&#xff0c;双方只有互相表示感兴趣才能开始聊天。由于它的特殊机制&#xff0c;一上线就吸引了很多用户&#xff0c;有着很强的广告效应。因此&#xff0c;很多人把Tinder当作一个不错…

【复杂网络建模】——Pytmnet进行多层网络分析与可视化

目录 一、Pymnet介绍 二、安装步骤 三、多层网络的构建 1、单层网络的构建

KubeVirt技术介绍及实验部署

虚拟化简介 在云计算发展中&#xff0c;有两类虚拟化平台&#xff1a; openstack&#xff08;iaas&#xff09;&#xff1a;关注于资源的利用&#xff0c;虚拟机的计算&#xff0c;网络和存储Kubernetes&#xff08;pass&#xff09;&#xff1a;关注容器的编排调度&#xff…

数据挖掘--贝叶斯分类详解

贝叶斯分类是一种基于贝叶斯定理的分类方法&#xff0c;它通过先验概率和条件概率来计算后验概率&#xff0c;从而对数据进行分类。具体来说&#xff0c;对于一个待分类的数据样本&#xff0c;贝叶斯分类器会计算该样本属于每个类别的概率&#xff0c;并将其归为概率最大的那个…

【group by】mysql分组查询的案例和原理

【group by】mysql分组查询的案例和原理 【一】group by的使用场景【二】group by的基本语法【1】基本语法【2】常用的聚合函数&#xff08;1&#xff09;max函数&#xff1a;取出分组中的最大值&#xff08;2&#xff09;avg函数&#xff1a;取出分组中的平均值&#xff08;3&…