给出一个多边形的n个顶点,判断这个多边形是凸多边形还是凹多边形
在这里需要清楚凸、凹多边形的定义!
对于凸多边形:多边形必然在任两点的连线的一侧
对于凹多边形:存在两点的连线将多边形分成两份
知道定义就很好写了
依次读取各个顶点,因为定点是逆时针给出,所以只用判断所有顶点是否在它前面两个定点所构成连线的左侧即可
设当前3个顶点依次为(xi, yi)、(xj, yj)、(xk, yk)
可以得到下面的不等式
(yk-yi)/(xk-xi) >= (yj-yi)/(xj-xi)
因为可能会出现分母为0的情况,所以要通分,通分的时候判别下分母的正负即可
还要注意要使用浮点类型存储分母计算结果
这个题其实可以不用数组写的,但是觉得用数组处理起来比较方便,所以就不改进了
0ms代码如下:
#include <cstdio>
#include <iostream>
#define MAXN 10000
using namespace std;
double a, b;
struct Point {
int x, y;
}c[MAXN];
bool judge(int i, int j, int k) {
double tmp = (c[k].x-c[i].x)*(c[j].x-c[i].x)*1.0;
if(tmp >= 0.0) {
if((c[j].x-c[i].x)*(c[k].y-c[i].y) >= (c[k].x-c[i].x)*(c[j].y-c[i].y))
return true;
return false;
} else {
if((c[j].x-c[i].x)*(c[k].y-c[i].y) <= (c[k].x-c[i].x)*(c[j].y-c[i].y))
return true;
return false;
}
}
int main(void) {
int i, n;
while(scanf("%d", &n) && n) {
for(i=0; i<n; ++i)
scanf("%d%d", &c[i].x, &c[i].y);
c[n].x = c[0].x;
c[n].y = c[0].y;
for(i=2; i<=n; ++i) {
if(!judge(i-2, i-1, i))
break;
}
if(i != n+1)
cout << "concave" << endl;
else cout << "convex" << endl;
}
}