【HDU2108】Shape of HDU:几何问题,多边形的凹凸性判断

题目原链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2108

分析:

给一个多边形的各个顶点坐标,进而判断多边形的凹凸性,这个一般利用向量叉乘方法,详细内容可以参考我的另一篇博客:

判断多边形的凹凸性

其实总共就是三步:

  • 三点为一组来判断,按顺序设为P1,P2,P3。得两个向量P1P3和P1P2
  • 计算两个向量叉乘P1P3×P1P2,计算结果记忆为xy-yx,2131 2131
  • 计算如果是正,对应凸。否则为凹。只要出现一个凹,那就是凹多边形。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
	int n,x[1005],y[1005];
	while(scanf("%d",&n),n)
	{
		for(int i=0;i<n;i++)
		{
			scanf("%d %d",&x[i],&y[i]);
		}
		// 到了最后一个点,还要判断n-1和0和1,所以要把0和1的点复制放到后面 
		x[n]=x[0];y[n]=y[0];x[n+1]=x[1];y[n+1]=y[1];  
		// 设为凸多边形 
		int flag = 1;  
		int cnt = 1;
		for(int i=0;i<=n-1;i++)  //3个点为一组判断,最后一组是n-1,n,n+1 
		{  
			int ans = (x[i+1]-x[i])*(y[i+2]-y[i])-(y[i+1]-y[i])*(x[i+2]-x[i]);
			// 计算为正还是凸,如果出现负,那就是凹 
			if(ans <= 0)
			{  
				flag=0;  
				break;  
			}
		} 
		
		if(flag)  
			printf("convex\n");  // 凸多边形 
		else  
			printf("concave\n");  		
	}
} 

猜你喜欢

转载自blog.csdn.net/Mikchy/article/details/81491150