C++外包业务01——判断凸多边形

给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);
    }
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇