一个很简单的问题看了好久,但就是提交不过,也看不出是哪出了问题
问题为:判断一个多边形是否是凸多边形
我的思路是这样的:
建立x[],y[]这两个数组用来存放坐标,计算两个向量,然后让计算它们的叉积,如果叉积小于零,说明后一个向量在前一个向量的右侧,即顺时针方向,只要有一个是这样的情况,则不符合条件。然后就是叉积大于零,符合条件,计数加一。等于零共线,直接跳过。最后,要是计数大于3,就说明是凸边形,因为三角形肯定是凸边形。
我觉得思路没啥问题呀,想不通
以下代码:
#include<iostream>
#include <cmath>
using namespace std;
double eps = 1e-10;
int main(){
int n;
while(cin>>n){
if(n==0){
break;
}
double x[10000],y[10000];
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
if(n==1||n==2){
cout<<"concave"<<endl;
continue;
}
x[n+1]=x[1];
y[n+1]=y[1];
x[n+2]=x[2];
y[n+2]=y[2];
int num=0;
for(int i=1;i<=n;i++){
if((x[i+1]-x[i])*(y[i+2]-y[i+1])-(x[i+2]-x[i+1])*(y[i+1]-y[i])>0){
num++;
// cout<<num<<'*'<<endl;
continue;
}else if(fabs((x[i+1]-x[i])*(y[i+2]-y[i+1])-(y[i+1]-y[i])*(x[i+2]-x[i+1]))<eps){
continue;
}else{
cout<<"concave"<<endl;
break;
}
}
if(num>=3){
cout<<"convex"<<endl;
}
}
}
终于想通了,哇哇哇哇哇哇,笨死
#include<iostream>
#include <cmath>
using namespace std;
double eps = 1e-10;
int main(){
int n;
while(cin>>n){
if(n==0){
break;
}
double x[10000],y[10000];
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
if(n==1||n==2){
cout<<"concave"<<endl;
continue;
}
x[n+1]=x[1];
y[n+1]=y[1];
x[n+2]=x[2];
y[n+2]=y[2];
int num=0;
for(int i=1;i<=n;i++){
if((x[i+1]-x[i])*(y[i+2]-y[i+1])-(x[i+2]-x[i+1])*(y[i+1]-y[i])>0){
num++;
// cout<<num<<'*'<<endl;
}else if(fabs((x[i+1]-x[i])*(y[i+2]-y[i+1])-(y[i+1]-y[i])*(x[i+2]-x[i+1]))<eps){
num==num;
}else{
cout<<"concave"<<endl;
break;
}
if(num>=3&&i==n){
cout<<"convex"<<endl;
}
}
}
}