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

news2024/10/6 22:26:08

文章目录

  • 一、多边形边界顺序
  • 二、数学原理
    • 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.coloradmin.cn/o/589032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

InsCode AI 创作助手围绕《程序员应如何应付AI带来的影响》为主题

InsCode AI 创作助手围绕《程序员应如何应付AI带来的影响》为主题 作者&#xff1a;i阿极 作者简介&#xff1a;Python领域新星作者、多项比赛获奖者&#xff1a;博主个人首页 &#x1f60a;&#x1f60a;&#x1f60a;如果觉得文章不错或能帮助到你学习&#xff0c;可以点赞&a…

Fabric模块功能介绍(一)

主要有5个模块,分别是peer、orderer、cryptogen、configtxgen、configtxlator 模块功能peer主节点模块&#xff0c;负责存储区块链数据、运行维护链码orderer交易打包&#xff0c;排序模块cryptogen组织和证书生成模块configtxgen区块和交易生成模块configtxlator区块和交易解…

【小程序开发日记】django学习笔记4

在没有学完django的情况下匆匆上阵。。。 这次的任务主要是管理数据库并实现浏览的功能。 首先介绍一下微信小程序连接后端的接口&#xff1a;wx.request 基本上输入后会比较经常使用的就是这几个参数。 接下来明确一下这次的工作&#xff1a; 我需要管理两个数据库&#x…

Python - numpy basic

目录 数组array的创建 1 通过list创建array 2 通过list创建二维数组 3 通过arange函数创建 等差数组 4 通过zeros函数创建 零矩阵 5 通过eyes函数创建 单位矩阵 数组array的访问 1 访问形状/元素个数/数据类型 2 访问一维数组的位置/范围 3 访问二维数组的位置/范围 4…

Unity Emisson 自发光属性全局照明

给想要自发光的物体&#xff0c;选择Unity自带Standard Shader。然后勾选Emisson 如下图&#xff1a; 属性&#xff1a; Color指定发光的颜色和强度。单击 Color 框可打开 HDR Color 拾色器。在此处可以更改光照的颜色和发光的强度 (Intensity)。要指定材质的哪些区域发光&…

蓝库云:让销售人员搭配客服工单系统,已成销售企业必备的组合

让销售人员搭配客服工单系统&#xff0c;已成了众多销售企业必备的组合&#xff0c;这不但可以大大提高客户满意度和转化率&#xff0c;还有效跟踪客户及时收到客户的反馈&#xff0c;从而进一步优化产品及策略。站在企业的角度来说企业也可以可以进行数据分析和优化&#xff0…

Mybaits Oracle CLob类型处理

问题描述: 使用的是Oracle 数据库, 表中有一个字段类型为clob类型 问题 : 当使用mybatis查询返回map类型时, 该字段的值为clob对象,而不是数据库里面的字符串 解决方案: 1.手动进行转换,把clob类型转换为字符串(这种比较简单) if(map.get("MAIN_BIZ") instanceo…

【Linux】iptables 防火墙(SNAT/DNAT)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、SNAT 原理与应用二、SNAT转换三、DNAT的介绍1.DNAT概述2.DNAT转换前提条件 四、DNAT转换五、防火墙规则的备份和还原六、tcpdump抓包工具的运用 一、SNAT 原理与…

【Java 方法重写】@Override 注解,一般用法,重写的具体要求

&#x1f340; 博主&#xff1a;_LJaXi Or 東方幻想郷 &#x1f338; 专栏&#xff1a; Java | 从入门到入坟 从前有一只小鸟&#xff0c;它的父母都是优秀的飞行员&#xff0c;它也很想成为一名出色的飞行员。于是&#xff0c;它开始学习飞行技巧&#xff0c;不断练习&#xf…

微信支付, 小程序,公众号, 商户号 需要进行的配置

目录 一 微信公众号1.1 公众号基础信息配置1.2 白名单配置1.3 公众号开发人员配置1.4 域名授权配置1.5 服务器配置 二 微信小程序2.1 开发设置2.2 域名设置2.3 开发者管理2.4 版本管理 三 微信商户号3.1 支付服务3.2 授权域名3.3 配置API安全,支付证书申请3.4 设置支付信息3.5 …

CSDN上海城市开发者社区线下活动纪实

引言 5月27号中午&#xff0c;很高兴能和现CSDN副总裁、前微软 Azure 工程团队首席研发经理、技术畅销书《编程之美》及《构建之法》的作者邹欣邹老师&#xff0c;以及CSDN的 “上海城市开发者社区” 的部分成员齐聚一堂&#xff0c;参加CSDN上海城市开发者社区自5月初成立以来…

在windows环境下使用winsw将jar包注册为服务(实现开机自启和配置日志输出模式)

前言 Windows系统使用java -jar m命令行运行Java项目会弹出黑窗。首先容易误点导致程序关闭&#xff0c;其次我们希望能在Windows系统做到开机自动启动。因此对于SpringBoot程序&#xff0c;目前主流的方法是采用winsw&#xff0c;简单容易配置 1.下载winsw工具 https://git…

新手自媒体找素材必备的5个素材网站。

自媒体需要用到视频、音频、图片、字体等各类素材&#xff0c;对于新手朋友来说&#xff0c;网上搜素材怕侵权&#xff0c;商用素材又不知道哪里找。作为一个老手的我收藏了各类优秀的免费素材网站&#xff0c;下面分享几个&#xff0c;对你一定有帮助&#xff0c;记得收藏起来…

安科瑞预付费管理系统对于学生公寓的设计

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;论文设计了适用于学生公寓的自助式预付费控电控水管理系统&#xff0c;采用多种智能功能&#xff0c;可以监测和显示漏电现象&#xff0c;通过短路、跳线、零线接地等方式防范和记录用户的偷电行为&a…

zookeeper机制及消息队列kafka

目录 一、zookeeper1、zookeeper简介2、zookeeper特点3、zookeeper工作模式及机制4、zookeeper应用场景及选举机制5、zookeeper集群部署 二、消息队列kafka1、为什么要有消息队列2、使用消息队列的好处3、kafka简介4、kafka特点5、kafka系统架构名词介绍6、Kafka架构及流程7、k…

Docker理论基础

初识Docker 1.什么是Docker 微服务虽然具备各种各样的优势&#xff0c;但服务的拆分通用给部署带来了很大的麻烦。 分布式系统中&#xff0c;依赖的组件非常多&#xff0c;不同组件之间部署时往往会产生一些冲突。 在数百上千台服务中重复部署&#xff0c;环境不一定一致&…

Docker容器核心技术:Linux命名空间Namespaces、控制组cgroups、联合文件系统UnionFS

1.容器的本质——进程 Docker 使用 Google 公司推出的 Go 语言 进行开发实现&#xff0c;基于 Linux 内核的 cgroup&#xff0c;namespace&#xff0c;以及 OverlayFS 类的 Union FS 等技术&#xff0c;对进程进行封装隔离&#xff0c;属于 操作系统层面的虚拟化技术。由于隔离…

react 接入企业微信登录组件

需求简述 把某web登录页替换成使用企业微信的扫码登录。 具体实现 自建应用&#xff1a;登录企微后台/应用管理&#xff0c;滑到最底部&#xff0c;创建应用并填写应用相关信息&#xff1a; 2. 创建成功之后&#xff0c;进入应用详情&#xff0c;配置可信域名以及授权登录&a…

k8s中iptables与ipvs详解——2023.05

文章目录 背景介绍一、Iptables模式二、IPVS模式&#xff08;NAT模式&#xff09;三、内部原理理解Iptablesipvs区别 补充&#xff1a;CoreDNS 背景介绍 从k8s的1.8版本开始&#xff0c;kube-proxy引入了IPVS模式&#xff0c;IPVS模式与iptables同样基于Netfilter&#xff0c;…

mysql ACID实现基本原理(面试题)

mysql ACID实现基本原理&#xff08;面试题&#xff09; 原子性一致性隔离性持久性 ACID&#xff0c;是指数据库管理系统&#xff08;DBMS&#xff09;在写入或更新资料的过程中&#xff0c;为保证事务&#xff08;transaction&#xff09;是正确可靠的&#xff0c;所必须具备的…