整数点与Pick定理
1、线段上格点问题
格点:就是平面上坐标为整数的点。
问题:平面中一条线段上有多少个整数点?
2、线段上的格点数算法
//求数a、b的最大公因数
int gcd ( int a,int b){
if(b==0) return a;
else return gcd(b,a%b);
}
//线段AB上的格点个数由下列程序段给出:
int OnSegment(int n,POINT A,POINT B){
return gcd(fabs(A.x-B.x),fabs(A.y-B.y))+1;
}
Pick定理:设以整数点为顶点的多边形的面积为S,多边形内部的整数点数为N,多边形边界上的整数点数为L,则 S=L/2 + N-1。
3、计算
多边形边上的网格点个数:
int OnEdge(int n,POINT * p){
int i,ret=0;
for (i=0;i<n;i++)
ret+=gcd(fabs(p[i].x-p[(i+1)%n].x),fabs(p[i].y-p[(i+1)%n].y));
return ret;
}
多边形内部的网格点个数由下列程序段给出:
int InSide(int n,POINT* p){
int i, area =0;// area是面积
for (i=0;i<n;i++) area+=p[(i+1)%n].y*(p[i].x-p[(i+2)%n].x); return (fabs(area)-OnEdge(n,p))/2+1;
}