给fyt外包的同济C++题记录
原题
键盘依次输入顶点数量 num (4-7) 及 num 对直角标 (x,y),判断是否是凸多边形(如何判断是数学问题,答疑时不回答此方面的疑问),如果不是,则给出提示,如果是,则求面积
输出样式
输出格式要求:多行
Line1: 输入顶点数量的提示
Line2:键盘输入的顶点数
Line3: 坐标输入顺序提示
Line4: 第 1个顶点的坐标输入提示
Line5: 键盘输入的第一个顶点的 x,y 坐标
Line6-7/8-9/10-11/12-13/14-15/16-17: 第 2-7 个顶点的输入提示及键盘输入
Line12/14/16/18: 输出结果
“不是凸**边形”
“凸**边形的面积=**”(面积按 cout 缺省 double 输出即可)
额外要求
1、若有三点以上共线情况不算凸多边形,例如,4 对坐标有三点共线,则为三角形,输出“不是凸4边形”即可
2、输入时,先输入坐标点数量,再按序(要求顺时针/逆时针两种顺序输入同一组坐标点均可正确计算) 输入各点的 x,y 坐标值即可
3、输入错误的处理要求
-顶点数量 (int 型) 输入后,单独处理正确性
-后续的顶点坐标(double 型),成对处理,即每输入两人后判断正确性,任意一个不正确则两个一起重输
-处理原则 : cin 正确但合理不范围,不清缓冲区直接重读,cin 错误则清缓冲区
4、输出格式按 double 的缺省格式即可,因为求面积时不同方法可能带来的计算误差,不要求答案与 demo 完全相同,最多判断至小数点后两位相同即可
源代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
/**
* @brief 判断凸多边形
*
* @param points 顶点集合
* @return true
* @return false
*/
bool isConvexPolygon(vector<vector<double>> points){
int n = points.size(); // 顶点个数
int sign = 0; // 一个指示标志
for (int i = 0; i < n; i++) {
int j = (i + 1) % n; // 顶点下标
int k = (i + 2) % n; // 顶点下标
double x1 = points[j][0] - points[i][0];
double y1 = points[j][1] - points[i][1];
double x2 = points[k][0] - points[j][0];
double y2 = points[k][1] - points[j][1];
double cross = x1 * y2 - x2 * y1; // 叉乘
if (cross != 0) {
int newSign = cross > 0 ? 1 : -1; // 新的指示标志
if (sign == 0) {
sign = newSign; // 继续
} else if (sign != newSign) {
return false; // 凹多边形
}
}
else{
return false; // 三点共线
}
}
return true; // 凸多边形
}
/**
* @brief 计算凸多边形面积
*
* @param points 顶点集合
* @return 面积
*/
double polygonArea(vector<vector<double>> points){
double area = 0;
for (int i=0;i<points.size();i++) {
area+=points[i][0]*points[(i+1)%points.size()][1]-points[(i+1)%points.size()][0]*points[i][1];
}
return abs(area)/2;
}
int main(){
vector<vector<double>> points;
cout<<"请输入顶点数量:(4-7)"<<endl;
int n=0;
while(n<4||n>7){
cin>>n;
if(n<4||n>7){
cout<<"输入错误,请重新输入:"<<endl;
}
}
printf("请按顺时针/逆时针方向输入%d个顶点的x,y坐标:\n",n);
for(int i=0;i<n;i++){
printf("请输入第%d个顶点的坐标:\n",i+1);
vector<double> point;
double x=0,y=0;
cin>>x>>y;
point.push_back(x);
point.push_back(y);
points.push_back(point);
}
if(isConvexPolygon(points)){
printf("凸%d边形的面积=",n);
cout<<polygonArea(points)<<endl;
}
else{
printf("不是凸%d边形\n",n);
}
}