整数点与Pick定理
Pick 定理 设以整数点为顶点的多边形的面积为S,多边形内部的整数点数为N,多边形边界上的整数点数为L,则
N+1/2L-1=S.
对于N与L的计算由下面的程序给出:
typedef struct Point
{
int x,y;
}POINT;
int gcd(int a,int b) //求数a,b的最大公因数
{
if(b==0) return a;
else return gcd(b,a%b);
}
多边形边上的网格点个数有下列程序段给出:
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;
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;
}
问题描述
格点是一个有序(x,y),其中x和y都是整数。给定三角形的顶点坐标(碰巧是格点),要你计算完全在三角形中的顶点个数(三角形边上和三角形的顶点不必计算)。
输入
输入有多组测试数据。每组测试数据由6个整数x1,y1,x2,y2,x3和y3组成,其中,(x1,y1)、(x2,y2)和(x3,y3)是三角形的顶点坐标。输入中的所有三角形都是非退化的(有正的面积),-15000≤x1,y1,x2,y2,x3,y3≤15000。当输入的数满足x1=y1=x2=y2=x3=y3=0时表示输入结束,不必处理。
输出
对每组测试数据,单行上输出三角形内部格点的个数。
输入样例 输出样例
0 0 1 0 0 1 0
0 0 5 0 0 5 6
0 0 0 0 0 0
分析
本题可直接用Pick定理:area=OnEdge/2+InSide-1,其中area为顶点都是格点的多边形的面积,OnEdge为多边形上的格点数,InSide为多边形内部的格点数。
多边形的面积可用叉积计算,但注意可能为负值,需转换。给定两个格点A(x0,y0),B(x1,y1)。设C(X,Y)是线段AB上的一个结点。那么,x=x0+λ(x1-x0),y=y0+λ(y1-y0),(0≤λ≤1)。要使x与y均为整数,λ必为一个分数,而且λ的分母是x1-x0与y1-y0的公因数,因此可用最大公因数算法gcd求得。
参考程序
#include <cmath>#include <iostream>#include <algorithm>using namespace std;typedef struct Point{int x,y;}POINT;int gcd(int a,int b){if(b==0) return a;else return gcd(b,a%b);}int Int_area(POINT a,POINT b,POINT c) //平行四边形面积{return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);}int edgenum(POINT a,POINT b){int dx,dy; dx=a.x-b.x;if(dx<0) dx=-dx; dy=a.y-b.y;if(dy<0) dy=-dy;return gcd(dx,dy);}int main(){ POINT a,b,c;int area,OnEdge,InSide;while(cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y&&(a.x||a.y||b.x||b.y||c.x||c.y)) { area=Int_area(a,b,c);if(area<0) area=-area; OnEdge=edgenum(a,b)+edgenum(b,c)+edgenum(c,a); InSide=(area-OnEdge+2)/2; //Pick定理应用,area是三角形面积的2倍 cout<<InSide<<endl; }return 0;}
转载于:https://www.cnblogs.com/zzw818/archive/2011/11/02/2232720.html
整数点与Pick定理相关推荐
- pku 2954 Triangle pku 1265 Area Pick定理的应用 + 叉积求多边形面积
Pick定理证明:http://translate.google.com/translate?u=http://episte.math.ntu.edu.tw/articles/sm/sm_25_10_ ...
- POJ1265(Pick定理的应用)
题目:Area 先说说什么是Pick定理吧 Pick定理:设以整数点为顶点的多边形的面积为S,多边形内部的整数点数为N,多边形边界上的整数点数为L,则 S=L/2 + N-1. 而对于线段上的整点数我 ...
- 【总结】pick定理Farey序列
pick定理及其证明 pick定理 结论 在一个平面直角坐标系内,以整点为顶点的简单多边形,设其内部整点数为aaa,边上(包括顶点)的整点数为bbb,则它的面积S=a+b2−1S = a+\frac ...
- pick定理及其证明
转自:http://www.cnblogs.com/yujunyong/articles/2010482.html pick定理:在一个平面直角坐标系内,以整点为顶点的简单多边形(任两边不交叉),它内 ...
- poj 1265 Area(pick 定理)
链接:poj 1265 题意:从原点出发.给出一些dx,dy移动增量,终于形成一个多边形, 求多边形内部的格点数目,边上的格点数目 .以及面积. 补充知识: 1.以格子点为顶点的线段.覆盖的点的个数为 ...
- Luogu P2735 电网【真·计算几何/Pick定理】By cellur925
题目传送门 刷USACO偶然遇到的,可能是人生中第一道正儿八经的计算几何. 题目大意:在平面直角坐标系中给你一个以格点为顶点的三角形,求三角形中的整点个数. 因为必修5和必修2的阴影很快就想到了数学中 ...
- POJ 1265 Area(Pick定理)
POJ 1265 Area(Pick定理) 根据pick定理来做 皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式该公式可以表示为 2S=2a+b−2 其中a表示多边形内部的点数,b表示多边形边 ...
- poj 2954 Triangle (pick 定理 的应用 )
题意 : 求一个三角形中的 整数 点有多少个? 题接: Pick定理证明:http://translate.google.com/translate?u=http://episte.math.ntu. ...
- 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。 我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,
78,某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米. 我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点, 即0,1,2,--,L,都种 ...
最新文章
- AJAX实现页面选项卡、隔行换色、弹出层功能代码
- 给.net程序打内存补丁-转
- golden gate 错误集锦
- 学完java后学编译原理_一个资深程序员对Java初学者的学习思维路线建议
- java 静态方法_新手学Java,哪些知识点可以优先掌握?
- es html标签,ES 6 Number
- 三星 smarttv android,三星SmartView
- Android茶叶进销存源码分享
- .webp是什么文件?怎么打开这种文件
- 23岁IT男与女友分手,扔下200万元分手费走了。。。
- c语言程序设计上海理工,2017年上海理工大学医疗器械与食品学院854C程序设计考研题库...
- 数据结构实验题——一元多项式计算
- 农银e管家怎么显示服务器不对,农银e管家电脑版
- 【Spark】Spark基础教程
- UPP映象(A C++ GUI lib)
- 五,JavaScript数组·上
- 无障碍建筑设计相关术语
- java高并发synchronized学习
- 【java反射】简单说说静态代理和动态代理
- 海格里斯HEGERLS托盘式四向穿梭车批发定制|24小时全自动无人化立体仓库批量托盘作业