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

输入描述:

输入包括两行;
第一行是一个整数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;}
}

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

  1. 判断一个多边形是否是凸多边形

    一个很简单的问题看了好久,但就是提交不过,也看不出是哪出了问题 问题为:判断一个多边形是否是凸多边形 我的思路是这样的: 建立x[],y[]这两个数组用来存放坐标,计算两个向量,然后让计算它们的叉积, ...

  2. 判断一个多边形是凸多边形还是凹多边形

    题目: 判断一个多边形是凸多边形还是凹多边形 输入: 输入包含多组测试数据,每组数据占2行,首先一行是一个整数n,表示多边形顶点的个数,然后一行是2×n个整数,表示逆时针顺序的n个顶点的坐标(xi,y ...

  3. 判断一个多边形的凸凹性

    一.凹凸多边形定义   因为凸多边形刚好定义,所以还是先看凸多边形的定义,凸多边形(Convex Polygon)可以有以下三种定义: 没有任何一个内角是优角(Reflexive Angle)的多边形 ...

  4. Day14作业 三、编程题 写一个Student类,属性:名字,年龄,分数,班级 (注意分包)

    三.编程题 写一个Student类,属性:名字,年龄,分数,班级 (注意分包) 写一个测试类:创建一个集合,里面装6个学生(有三个班级class01,class02,class03) 例如:list. ...

  5. 编程题-判断数独是否正确

    判断数独是否正确 绪论 这个题目是我在校招面试某家大公司的在线笔试题(不是BAT),当时第一次用程序做数独,时间也来不及,就没有很好的做出来.(在这里吐槽一下,一个小时10道选择10道填空,2道编程题 ...

  6. linux shell 文件空,linux shell编程 如何判断一个文件是否为空

    shell 判断文件/目录是否为空 jfkidear144932015-01-15 shell中如何判断一个变量是否为空 l_nan365492014-07-14 在shell中如何判断一个变量是否为 ...

  7. java 判断是不是奇数_很火的Java题——判断一个整数是否是奇数

    请写一个方法,判断一个整数是否为奇数: public static boolean isOdd(int i); 最普通的写法,也体现了我们的思考过程 public static boolean isO ...

  8. 如何判断一个多边形的环是逆时针还是顺时针

    OGC关于数据格式有规定,多边形的外环应为逆时针,内环应为顺时针.GIS相关的库包,在对数据进行空间操作的时候,也基于这个规定,将数据标准化为外环逆时针,内环顺时针之后,再进行空间计算和分析. 这种标 ...

  9. linux判断文件是否为空,linux shell编程 如何判断一个文件是否为空

    最近在写一个小的shell程序,遇到这个问题,在diff -q 两个文件时,如果文件不相同就输出到result文件中,若相同则无输出,即result文件为空,但如何判断result文件是否为空并继续下 ...

最新文章

  1. expires与etag控制页面缓存的优先级
  2. 基于easyui开发Web版Activiti流程定制器详解(五)——Draw2d详解(一)
  3. 关于“插入图片”等功能无法使用的问题
  4. 多面体体积 matlab,matlab计算多面体体积实现代码
  5. 比较两个文件夹图像相似度
  6. 双线性插值算法ARM NEON优化
  7. Http协议(3)—HTTP实体和编码
  8. Java中抽象类和接口之间的区别
  9. processing动态代码大全_做一张动态海报需要多少步?
  10. Python模块_re正则表达式模块-2
  11. android文件搜索广播,Android 实现无网络传输文件
  12. windows ad 域下配置L2TP ***服务器 企业防火墙端口配置
  13. hibernate在不联网或者网络异常时不能解析配置文件
  14. 闭包 python_Python闭包思想与用法浅析
  15. php 获取刚插入的一条,php获得刚插入数据的id 的几种方法
  16. nginx.conf 配置详解
  17. pyspider 安装及问题处理(pyspider一直卡在result_worker starting的解决办法)
  18. python easygui进度条_Python模块EasyGui专题学习
  19. java批量pdf压缩代码_怎么批量压缩PDF文档?迅捷PDF转换器帮你解决难题!
  20. 风投 红杉资本 Sequoia Capital

热门文章

  1. Android N分屏(多窗口)适配
  2. bootloader的两种启动模式
  3. c语言工程合并报告,C语言《数据结构》实验报告】链表的合并
  4. 两化融合贯标是指什么
  5. 人生理财规划必备的“四笔钱”,你知道吗?
  6. SNAT和DNAT简介
  7. 【MPLAB X IPE】:XIPE烧写教程
  8. 视频编码零基础入门(1):视频编解码之理论概述
  9. mysql proxy atlas_mysql-proxy Atlas
  10. java aes 中文_从Java到Python的AES加密