【编程题】判断一个多边形是否为凸多边形

article/2025/9/18 10:17:05

题目:
顺序输入点的坐标,判断按这些点顺序连接起来的多边形是否为凸多边形还是凹多边形

输入描述:

输入包括两行;
第一行是一个整数n,n>=3,作为提示输入的顶点数量
第二行为2*n个整数,为各点的(x,y)

输出描述:

若为凸多边形,则输出为“这是凸多边形”
若不是凸多边形,则输出为“这不是凸多边形”

解析:
对于凸多边形有:
每个内角都为小于180度的角,没有大于180度的角。

解法1:
对于一个凸多边形,其每个顶点较小的角的和必为其边长减2再乘以180度:(n-2)*180
对于一个凸多边形,其每个顶点较小的角的和必小于其边长减2再乘以180度:(n-2)*180
在这里插入图片描述
对于凹多边形afbcd,对应的凸多边形aebcf,顶点f和顶点e所在角的较小角相等,可见相比凸多边形,凹多边形顶点较小角和缺少角eaf与角ebf

代码:

#include <iostream>
#include <vector>
#include <cmath>using namespace std;#define PI 3.1415926535897//获取角度
//其中(x1,y1)、(x3,y3)是角的两端,(x2,y2)是角的顶点
double get_angle(int x1,int y1,int x2,int y2,int x3,int y3)
{float v1_x = x1 - x2;float v1_y = y1 - y2;float v2_x = x3 - x2;float v2_y = y3 - y2;float t = (v1_x * v2_x + v1_y * v2_y) / (sqrt(pow(v1_x, 2) + pow(v1_y, 2)) * sqrt(pow(v2_x, 2) + pow(v2_y, 2)));float ans = acos(t) * (180 / PI);//cout << "角为:" <<ans << "度" << endl;return ans;
}
int main()
{int n;cin >> n;//为凸多边形时应为的总度数double angle_sum = (n - 2) * 180;//可以做一个点类//坐标x与y的数组vector<int> arr_x, arr_y;//读入for(int i=0;i<n;i++){int x, y;cin >> x >> y;arr_x.push_back(x);arr_y.push_back(y);}//实际较小较内角和double sum = 0;//陆续读入各角for(int i=0;i<n;i++){//需要判断第0个角和最后的一个角if(i==0){sum += get_angle(arr_x[n - 1], arr_y[n - 1], arr_x[i], arr_y[i], arr_x[i + 1], arr_y[i + 1]);}else if(i==n-1){sum += get_angle(arr_x[i - 1], arr_y[i - 1], arr_x[i], arr_y[i], arr_x[0], arr_y[0]);}else{sum += get_angle(arr_x[i - 1], arr_y[i - 1], arr_x[i], arr_y[i], arr_x[i + 1], arr_y[i + 1]);}}///判断if(sum<angle_sum){cout << "这不是凸多边形" << endl;}else{cout << "这是凸多边形" << endl;}
}

注:
实际上,由于计算机对于浮点数的存储是近似存储,在做浮点数的比较时可能出现误差的情况。

解法2:
如果把多边形的边顺序按同一侧作为起点来看,可以发现,凸多边形的边都按同一角度选择着
根据这一规律,我们对边的向量进行叉乘,便可判断

以下参考:https://www.cnblogs.com/wmxl/p/5294620.html
向量的叉乘如X叉乘Y就是一个垂直与X和Y组成的平面的一个向量,方向是这样决定的,右手四指与X的方向相同,大拇指与四指垂直,然后四指按照这样的方向绕,从X开始,经过X与Y的锐角的方向环绕,拇指所指的方向就是X叉乘Y的方向
在这里插入图片描述
叉乘是三维才有意义, 这里虽然是二维的, 但可以看成第三维z是0
所以计算结果就变成了(0, 0, x1y2 - x2y1)

叉乘的几何意义是 一个垂直于两个向量的方向, 如果所有边依次相乘的方向都是一样的, 就是凸多边形, 此题因为规定了必须逆时针, 所以所有相乘都必须是正的(这个可以自己试一下就知道)

代码:

#include <iostream>
#include <vector>using namespace std;int main()
{int n;cin >> n;//可以做一个点类//坐标x与y的数组vector<int> arr_x, arr_y;//读入for(int i=0;i<n;i++){int x, y;cin >> x >> y;arr_x.push_back(x);arr_y.push_back(y);}//这次用的是向量,为了方便求最后一组向量,直接把点0,点1再次压入,arr_x.push_back(arr_x[0]);arr_y.push_back(arr_y[0]);arr_x.push_back(arr_x[1]);arr_y.push_back(arr_y[1]);bool flag = true;//判断各向量for(int i=0;i<n;i++){//向量1int v1_x = arr_x[i + 1] - arr_x[i];int v1_y = arr_y[i + 1] - arr_y[i];//向量2int v2_x = arr_x[i + 2] - arr_x[i+1];int v2_y = arr_y[i + 2] - arr_y[i+1];//叉乘//小于0为凹多边形if(v1_x*v2_y-v2_x*v1_y<0){flag = false;break;}}if(flag){cout << "这是凸多边形" << endl;}else{cout << "这不是凸多边形" << endl;}
}

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

相关文章

10343 划分凸多边形(优先做)

题目描述 10343 划分凸多边形&#xff08;优先做&#xff09; 时间限制:800MS 代码长度限制:10KB 提交次数:0 通过次数:0 题型: 编程题 语言: G;GCC;VC;JAVA Description 问题描述&#xff1a;一个正凸N边形&#xff0c;可以用N-3条互不相交的对角线将正N边形分成N-2个三角形…

N顶点凸多边形中对角线交点的个数

题目描述 对于一个N个定点的凸多边形&#xff0c;他的任何三条对角线都不会交于一点。请求楚图形中对角线交点的个数。 例如&#xff0c;6边形&#xff1a; 我们可以发现&#xff0c;两条不平行对角线才会有一个交点&#xff0c;同时&#xff0c;两条对角线又确定了一个四边形…

凸多边形的划分

题目&#xff1a; 给定一个具有 NN 个顶点的凸多边形&#xff0c;将顶点从 11 至 NN 标号&#xff0c;每个顶点的权值都是一个正整数。 将这个凸多边形划分成 N−2N−2 个互不相交的三角形&#xff0c;对于每个三角形&#xff0c;其三个顶点的权值相乘都可得到一个权值乘积&a…

`算法知识` 多边形, 凸多边形, 外接矩形

catalog 图片引用图二 多边形分类周长多边形的外接矩形 凸多边形去除若干点, 仍为凸多边形 ID_COUNT: 3 图片引用 图二 多边形 以下讨论, 均在(笛卡尔坐标系)中, 即两点间的距离为 (欧几里得距离) 由N条边和N个点组成, N > 3, 面积一定> 0 每条边, 都是(线段) 线段: 必…

判断多边形的凹凸性和计算多边形面积:利用向量叉乘

根据百度百科的讲解&#xff1a; 凸多边形 现在重点讲解顶点凹凸性法&#xff08;最常用也是较为简单的方法&#xff09;&#xff1a;计算总结在最后。 利用向量叉乘的相关知识进行计算&#xff1a;假设当前连续的三个顶点分别是P1&#xff0c;P2&#xff0c;P3。计算向量P1P3…

判断点在凸多边形內

判断点在凸多边形內 判断点在凸多边形内的算法有很多&#xff0c;可以参考链接3&#xff0c;个人尝试使用了同侧法&#xff0c;此处也只解析这个方法 算法原理&#xff1a; 同侧法是判断点在向量哪一侧的一个方法&#xff0c;这个算法的概念是来自于参考文献一&#xff0c;参…

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

0014算法笔记——【动态规划】凸多边形最优三角剖分 分类&#xff1a; 算法 2013-03-05 20:10 612人阅读 评论(0) 收藏 举报 三角剖分 凸多边形最优解 动态规划 算法笔记 1、问题相关定义&#xff1a; (1)凸多边形的三角剖分&#xff1a;将凸多边形分割成互不相交的三角形的…

0014算法笔记——【动态规划】凸多边形最优三角剖分

1、问题相关定义&#xff1a; (1)凸多边形的三角剖分&#xff1a;将凸多边形分割成互不相交的三角形的弦的集合T。 (2)最优剖分&#xff1a;给定凸多边形P&#xff0c;以及定义在由多边形的边和弦组成的三角形上的权函数w。要求确定该凸多边形的三角剖分&#xff0c;使得该三角…

判断平面多边形的凹凸性

对于平面多边形的三角化处理也是计算机图形学里面的一个领域&#xff0c;最近由于项目的需要&#xff0c;需要对平面多边形进行剖分&#xff0c;特此对其作了些研究。 在对平面多边形进行处理的时候&#xff0c;很多时候需要知道多边形的凹凸性&#xff0c;本文介绍两种方法来…

最小凸多边形(凸包)

描述 给出平面上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;北京海淀法院通过“北京法院云法庭”公开开庭审理原告优酷信息技术(北京)有限公司(下称优酷公司)与被告北京搜狗科技发展有限公司、被告北京搜狗信息服务有限公司(下合称搜狗公司)涉搜狗浏览器插件屏蔽优酷视频广告不正当竞争纠纷案…