整数点与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;

}

 

posted @ 2015-02-14 11:01  Doli  阅读(189)  评论(0编辑  收藏  举报