POJ 1265 Pick公式的应用,多边形与整点的关系(存在一个GCD的关系)

本文介绍了一种使用皮克定理计算由整数坐标顶点构成的简单多边形面积的方法。通过分析多边形的内部格点数和边界上的格点数,实现了多边形面积的精确计算。文章提供了C++代码实现,展示了如何应用皮克定理进行面积计算。

http://acm.pku.edu.cn/JudgeOnline/problem?id=2954

给定顶点座标均是整点(或正方形格点)的简单多边形皮克定理说明了其面积A和内部格点数目i、边上格点数目b的关系:A = i + b/2 - 1.


  
#include < iostream >
#include
< math.h >
#include
< stdio.h >
using namespace std;
#define Abs(x) (((x)>0)?(x):(-(x))) /*验证*/
#define MAXN 500
typedef
double TYPE;

// 空间中的点,可以用来作为二维点来用
struct POINT { /* 验证 */
TYPE x; TYPE y; TYPE z;
POINT() : x(
0 ), y( 0 ), z( 0 ) {};
POINT(TYPE _x_, TYPE _y_, TYPE _z_
= 0 )
: x(_x_), y(_y_), z(_z_) {};
// 要用 G++ 提交 ,可以不用这个
POINT operator = ( const POINT & A){
x
= A.x;
y
= A.y;
z
= A.z;
}
};

POINT p[MAXN];

int gcd( int a, int b)
{
if (b == 0 ) return a;
else return gcd(b,a % b);
}

// 求多边形面积 只要是多边形就可以求其面积
TYPE Area( int n, POINT p[] ) {
if ( n < 3 )
return TYPE( 0 );
double s = p[ 0 ].y * (p[n - 1 ].x - p[ 1 ].x);
for ( int i = 1 ; i < n; i ++ ) {
s
+= p[i].y * (p[i - 1 ].x - p[(i + 1 ) % n].x);
}
return s / 2 ;
}
void PolyPick( int n, POINT p[], int & _I, int & _E, TYPE & _area){
int dx, dy;
_E
= 0 ;
for ( int i = 1 ; i <= n; i ++ ){
dx
= p[i % n].x - p[(i + 1 ) % n].x;
dy
= p[i % n].y - p[(i + 1 ) % n].y;
_E
+= gcd(Abs(dx),Abs(dy));
}
_area
= Area(n,p);
_I
= ( 2 * _area + 2 - _E) / 2 ;

}

int main()
{
int tc,m,i,j,k;
cin
>> tc;
TYPE dx,dy;
for (k = 1 ;k <= tc;k ++ )
{
scanf(
" %d " , & m);
TYPE x
= 0 ;
TYPE y
= 0 ;
for (i = 0 ;i < m;i ++ )
{
scanf(
" %lf%lf " , & dx, & dy);
p[i].x
= x + dx;
p[i].y
= y + dy;
x
= p[i].x;
y
= p[i].y;
}
int I,E;
double area;
PolyPick(m,p,I, E, area);

printf(
" Scenario #%d:\n%d %d %.1f\n\n " ,k,I,E,area);
}
return 0 ;
}

转载于:https://www.cnblogs.com/laipDIDI/articles/2041710.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值