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

论坛 期权论坛 脚本     
匿名技术用户   2021-1-7 05:55   1273   0

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

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

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP