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

一个很简单的问题看了好久,但就是提交不过,也看不出是哪出了问题

问题为:判断一个多边形是否是凸多边形

我的思路是这样的:
建立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;
			}
		}
	
	}
	
}

猜你喜欢

转载自blog.csdn.net/Helloirbd/article/details/81584974
今日推荐