pick定理--zzuli1668

/**
*主要用了Pick定理:area=edge/2+in-1,证明如下:
*	假设整个平面是一个无穷大的铁板;在0时间,每个格点上都有一个单位的热量。
*	经过无穷长时间的传导后,最终这些热量将以单位密度均匀地分布在整个铁板上。
*	下面我们试着求多边形P内的热量。
*	考虑多边形的每一条线段e:它的两个端点均在格点上,因此线段e的中点是整个平面格点的对称中心,
*	因而流经该线段的热量收支平衡(这半边进来了多少那半边就出去了多少),即出入该线段的热量总和实际为0。
*	我们立即看到,P的热量其实完全来自于它自身内部的i个格点(的全部热量),以及边界上的b个格点(各自在某一角度范围内传出的热量)。
*	边界上的b个点形成了一个内角和为(b-2)*180的b边形,从这b个点流入P的热量为(b-2)*180/360 = (b-2)/2 = b/2-1。在再加上i个内部格点,于是S(P)=i+b/2-1。
*还有就是求  三角型面积  以及  线段上的点数
*三角型面积用叉乘
*/
#include<stdio.h>
#include<math.h>
int gcd(int m,int n)
{
	int r;
	if(m<n)
	{
		r=m;
		m=n;
		n=r;
	}
	while(n!=0)
	{
		r=m%n;
		m=n;
		n=r;
	}
	return m;
}
int main()
{
	int x1,x2,x3,y1,y2,y3;
	int edge,in,area;
	while(scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3))
	{
		if(x1==0&&x2==0&&x3==0&&y1==0&&y2==0&&y3==0)
			return 0;
		area=abs((x2-x1)*(y3-y1)-(x3-x1)*(y2-y1));
		edge=gcd(abs(x2-x1),abs(y2-y1));
		edge+=gcd(abs(x3-x1),abs(y3-y1));
		edge+=gcd(abs(x2-x3),abs(y2-y3));
		in=(area+-edge+2)/2;
		printf("%d\n",in);
	}
	return 0;
}

你可能感兴趣的:(pick定理--zzuli1668)