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

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

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

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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值