判断平面多边形的凹凸性

article/2025/9/18 10:20:32

对于平面多边形的三角化处理也是计算机图形学里面的一个领域,最近由于项目的需要,需要对平面多边形进行剖分,特此对其作了些研究。

在对平面多边形进行处理的时候,很多时候需要知道多边形的凹凸性,本文介绍两种方法来进行平面多边形凹凸性的判定,文章后面会给出示例代码。

1、使用角度和判断凹凸性

我们知道,任意n个顶点的凸多边形可以分解成(n-2)个三角形,一个三角形的内角和是180°,所有三角形的内角和是(n-2)*180°,这一点,对于凸多边形或者凹多边形来说都是一样的,但是对于一个凸多边形来说,不存在内角大于外角,而凹多边形则会存在。

因此,将多边形每个顶点处较小的角(内角或外角)相加,凸多边形得到(n-2)*180°,而凹多边形则小于它。至于如何判断小角,我们可以使用几何工具---向量点乘。我们知道,向量点乘可以用来等价求两个向量的夹角,它的值(即角度)总是以较短的弧度来度量的。

以下是代码的示例:

bool IsHollow(std::vector<Position3> curveloopPoints)const{//使用角度和判断凹凸性:凸多边形的内角和为(n-2)*180°auto num = curveloopPoints.size();float angleSum = 0.0;for (int i = 0; i < num; i++){Vector3 e1;if (i==0){e1 = curveloopPoints[num - 1] - curveloopPoints[i];}else{e1 = curveloopPoints[i - 1] - curveloopPoints[i];}Vector3 e2;if (i==num-1){e2 = curveloopPoints[0] - curveloopPoints[i];}else{e2 = curveloopPoints[i + 1] - curveloopPoints[i];}//标准化并计算点乘e1.normalize(); e2.normalize();float mdot = e1%e2;//计算较小值float theta = acos(mdot);//加和angleSum += theta;}//计算内角和float convexAngleSum = float((num - 2))*YZ_PI;//判断凹凸性if (angleSum<(convexAngleSum-(float(num)*0.00001))){/*if (HollowPoints.size()>0){*///m_IsHollow = true;//}return true;//是凹}return false;//否则是凸}

2、使用矢量判断凹凸性,检测多边形的凸点

检测多边形上是否有凹点,如果没有则为凸多边形。其原理是,凸多边形的每个顶点的转向都应该一致,不一致的点 就是凹点。

我们判断一个顶点的转向,使用的是另一个几何工具---向量叉乘。

这里我们需要平面的法向量,根据法向量来检测多边形的每个顶点:

用相邻的两个边向量计算该顶点的法向量,接着用多边形的法向量和点的法向量点乘,若点乘值为负(方向相反),则该顶点就是一个凹点。

如下图所示,红色旋转方向为逆时针的顶点是多边形的凸点。

以下是方法的示例代码,函数返回的是凹点坐标:

const std::vector<Position3>& IsHollow_Vec(std::vector<Position3> curveloopPoints)const{//假设传进来的顶点数组都是按照顺时针或者逆时针遍历的,且没有重复点//使用法向量判断凹凸性,检测多边形上是否有凸点,每个顶点的转向都应该一致,若不一致则为凹点std::vector<Position3> HollowPoints;auto num = curveloopPoints.size();Vector3 HollowNor = (curveloopPoints[num-1] - curveloopPoints[0])* (curveloopPoints[1] - curveloopPoints[0]);Vector3 Nor;for (int i = 0; i < num;i++){if (i==0)//第一个点{Nor = (curveloopPoints[0] - curveloopPoints[num - 1])* (curveloopPoints[1] - curveloopPoints[0]);if ((Nor%HollowNor)>0.0)//如果点乘大于0{HollowPoints.push_back(curveloopPoints[i]);}}else if (i==num-1)//最后一个点{Nor = (curveloopPoints[i] - curveloopPoints[i - 1])* (curveloopPoints[0] - curveloopPoints[i]);if (((Nor%HollowNor) > 0.0))//如果点乘大于0{HollowPoints.push_back(curveloopPoints[i]);}}else//中间点{Nor = (curveloopPoints[i] - curveloopPoints[i - 1])* (curveloopPoints[i+1] - curveloopPoints[i]);if (((Nor%HollowNor) > 0.0))//如果点乘大于0{HollowPoints.push_back(curveloopPoints[i]);}}}return HollowPoints;}
 

以上两种判断多边形凹凸性的方法来自于《3D数学基础图形与游戏开发》一书,并由自己编程实现。


http://chatgpt.dhexx.cn/article/pxup8w4r.shtml

相关文章

最小凸多边形(凸包)

描述 给出平面上n个点的坐标&#xff0c;计算最远两点间的距离&#xff0c;以及包含所有点的最小凸多边形&#xff08;凸包&#xff09; 输入 第一行一个整数n&#xff0c;接下来是n行的实数对&#xff0c;表示n个点坐标。2<n<10000 n x1 y1 x2 y2 … xn yn 输出 输出…

计算机几何 - 如何判断一个多边形是凸多边形还是凹多边形

什么是凸多边形和凹多边形&#xff1f; 凸多边形&#xff1a;每个内角都是锐角或钝角&#xff0c;没有大于180度的内角(例如&#xff0c;三角形、正方形)。 凹多边形&#xff1a;至少有一个大于180度的内角(例如&#xff0c;五角星)。 注&#xff1a;大于180度的角又被称为优角…

多边形扩展和收缩(凸多边形和凹多边形)

目录 背景介绍&#xff1a;知识积累&#xff1a;思路点拨&#xff1a;代码区域&#xff1a; 背景介绍&#xff1a; 如下图所示&#xff0c;黑色是原多边形&#xff0c;红色是扩展的多边形&#xff0c;蓝色是收缩的多边形。这是最终的效果。 PS&#xff1a;楼主使用的是ES6的语…

什么是凸多边形和凹多边形

GIS有时需要用算法判断线段是否在多边形内&#xff1b; 最基本的出发点如下&#xff0c; 线段在多边形内的一个必要条件是线段的两个端点都在多边形内&#xff0c;但由于多边形可能为凹&#xff0c;所以这不能成为判断的充分条件&#xff1b; 就是说&#xff0c; 如果线段的两…

判断多边形是凹多边形还是凸多边形,以及求凹点

转载&#xff1a;计算机几何 - 如何判断一个多边形是凸多边形还是凹多边形_刘建宁的博客-CSDN博客_凹多边形和凸多边形的区别 重点&#xff1a; 1.凸多边形指的是多边形的每个内角小于180度。 2.凹多边形指的是至少有一个内角大于180度。 判断多边形性质 多边形内角和等于(n…

凸多边形最优三角

前言&#xff1a;大三下算法课&#xff0c;自己看的凸多边形最优三角&#xff0c;最后上台讲解&#xff0c;和子涵苗子等一起的一段时间 1.相关概念 • 凸多边形&#xff1a;一个简单多边形及其内部构成一个闭凸集时&#xff0c;则 称该简单多边形为一个凸多边形。 • 边&#…

动态规划DP——凸多边形最优三角剖分

1.问题分析 我们可以把披萨饼看作是一个凸多边形&#xff0c;凸多边形是指多边形的任意两点的连线均落在多边形的内部或边界上。 &#xff08;1&#xff09;什么是凸多边形&#xff1f; 如下图所示&#xff0c;是一个凸多边形 如下图所示&#xff0c;不是一个凸多边&#xff0c…

凸多边形、凹多边形、凸包算法

凸多边形&#xff1a; &#xff08;Convex Polygon&#xff09;可以有以下三种定义&#xff1a; 1、没有任何一个内角是优角&#xff08;Reflexive Angle&#xff09;的多边形。 2、如果把一个多边形的所有边中&#xff0c;有一条边向两方无限延长成为一直线时&#xff0c;其他…

搜狗浏览器屏蔽广告插件_“云法庭”里“云勘验” 法院开审搜狗浏览器插件屏蔽优酷视频广告案...

在第20个世界知识产权日到来之际&#xff0c;北京海淀法院通过“北京法院云法庭”公开开庭审理原告优酷信息技术(北京)有限公司(下称优酷公司)与被告北京搜狗科技发展有限公司、被告北京搜狗信息服务有限公司(下合称搜狗公司)涉搜狗浏览器插件屏蔽优酷视频广告不正当竞争纠纷案…

搜狗浏览器屏蔽广告插件_“云法庭”里“云勘验”,海淀法院开庭审理搜狗浏览器插件屏蔽优酷视频广告不正当竞争纠纷案...

来源&#xff1a; 北京海淀法院 特别提示&#xff1a;凡本号注明“来源”或“转自”的作品均转载自媒体&#xff0c;版权归原作者及原出处所有。所分享内容为作者个人观点&#xff0c;仅供读者学习参考&#xff0c;不代表本号观点。 在第20个世界知识产权日到来之际&#xff0…

搜狗浏览器屏蔽广告插件_“云法庭”里“云勘验”法院开审搜狗浏览器插件屏蔽优酷视频广告案...

在第20个世界知识产权日到来之际&#xff0c;北京海淀法院通过“北京法院云法庭”公开开庭审理原告优酷信息技术(北京)有限公司(下称优酷公司)与被告北京搜狗科技发展有限公司、被告北京搜狗信息服务有限公司(下合称搜狗公司)涉搜狗浏览器插件屏蔽优酷视频广告不正当竞争纠纷案…

【视频广告位叫法】

例如&#xff1a;爱奇艺&#xff0c;优酷&#xff0c;腾讯视频&#xff0c;前贴&#xff0c;中插&#xff0c;暂停贴&#xff0c;后贴广告位&#xff01;

优酷 DSP 广告投放系统架构实践

作者 | 鸿雁 阿里文娱技术专家 导读&#xff1a;随着 RTB 网络在线展现广告交易模式的兴起&#xff0c;各大公司都纷纷搭建自己的 DSP ( Demand-Side Platform ) 广告投放系统进行获客。优酷在近几年也搭建 DSP 系统&#xff0c;并且在持续迭代。在这一过程中&#xff0c;经历…

优酷视频在网站里播放

工具/原料 准备一组代码&#xff1a; <embed srchttp://static.youku.com/v1.0.0149/v/swf/loader.swf?VideoIDS视频ID&winTypeadshow&isAutoPlaytrue quality"high" width"580" height"435" align"middle" allowScriptA…

网页引用优酷视频并添加封面自动播放

引用优酷视频可以减轻公司的服务器压力&#xff0c;而且和自己上传保存视频相比会方便轻松许多&#xff0c;不过相对的需要忍受广告。 首先你需要在优酷里找到你要引用的视频&#xff0c;或者自己上传。然后打开会有一个分享按钮&#xff1a; 以我使用的第二个为例&#xff0…

html上传优酷视频,如何将视频发布到自己的企业网站上?

郑州做网站是为了更好的宣传企业&#xff0c;如果网站要想有视频的表现形式&#xff0c;那就得花点心思去考虑了。一般情况下&#xff0c;要想把视频放到网站上&#xff0c;无外乎就两种方式&#xff1a;第一、直接把视频上传到网站目录&#xff0c;然后在合适的位置调用。由于…

php视频系统源码,基于ThinkPHP框架仿优酷视频源码带数据,后台功能强大

源码介绍 最新高仿优酷视频网源码带数据&#xff0c;后台功能齐全强大&#xff0c;而且是基于thinkphph内核开发&#xff0c;很不错&#xff0c;虽然是旧版模板&#xff0c;但是也值得学习&#xff0c;尤其是正在学习ThinkPHP框架的人拿来学习&#xff0c;相信你需要&#xff0…

鸿蒙os去广告,隐藏福利?华为鸿蒙OS新惊喜:优酷视频流转播放可免广告

近日&#xff0c;华为鸿蒙OS 2.0开发者公测版推送正式开启&#xff0c;包括华为Mate X2、Mate 40系列等机型均可先行尝鲜。 根据目前已知信息来看&#xff0c;华为手机从6月初开始将可升级鸿蒙系统。 随着参与开发者公测的用户逐渐增多&#xff0c;网上出现大量鸿蒙OS的测试体验…

优酷视频整段代理php,thinkphp仿优酷带数据源码|php仿优酷视频源码带后台功能强大...

本项目是仿优酷官网&#xff0c;优酷官网是一个集多种知识面为一体的网站&#xff0c;能全面的锻炼我们的技能,所以我们决定仿优酷网。 本项目后台主要实现了&#xff1a;用户管理、分类管理、视频管理、评论管理、权限管理、轮播管理、网站配置和广告管理以及登录退出等模块。…

android加载优酷视频播放器,使用android优酷视频云一些问题

最近项目迭代需要添加视频播放功能&#xff0c;由于若干原因就选择了优酷视频&#xff0c;本来挺简单的一个功能在做的时候居然碰到了若干意想不到的问题&#xff0c;果然还是优酷视频提供的demo最稳定啊&#xff0c;啥问题木有~~o(>_ 好了&#xff0c;闲话不多说&#xff0…