皮克定理


对于每个顶点都落于整点上的多边形,有S = N + M/2 - 1(其中,S为多边形面积,N为多边形内部的整点数,M为多边形边上的点数)
该定理一般用于求N,因为S和M都相对好求。下面简单提一下S和M的求法。
对于多边形的面积,我们可以将其划分为若干三角形,然后用向量的叉积。

inline ll cross(P a,P b)
{
    return a.fi*b.se-b.fi*a.se;
}
ll area(P* p,int n)
{
    ll res=0;
    p[n]=p[0];
    for (int i=0;i<=n;++i)
        res+=cross(p[i],p[i+1]);
    return abs(res/2);
}

对于一条边上的点数,可以

gcd( abs(p[i].fi - p[i-1].fi), abs(p[i].se - p[i-1].se) ) + 1;

得到p[i]与p[i-1]之间的点数(包括两端点)。
求得S与M后,代入公式求得N。

猜你喜欢

转载自www.cnblogs.com/orangee/p/9644352.html