什么是Pick定理(皮克定理)

来自wiki的介绍:

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

因为所有简单多边形都可切割为一个三角形和另一个简单多边形。考虑一个简单多边形 \(P\),及跟\(P\)有一条共同边的三角形\(T\)。若\(P\) 符合皮克公式,则只要证明\(P\)加上\(T\) 的\(PT\)亦符合皮克公式(I),与及三角形符合皮克公式(II),就可根据数学归纳法,对于所有简单多边形皮克公式都是成立的。

详细证明:Click Here

Pick定理有以下推广:

  • 取格点的组成图形的面积为一单位。在平行四边形格点,皮克定理依然成立。套用于任意三角形格点,皮克定理则是 \({\displaystyle A=2 \times i+b-2}\) 。
  • 对于非简单的多边形 \({\displaystyle P}\) ,皮克定理 \({\displaystyle A=i+{\frac {b}{2}}-\chi (P)}\) ,其中 \({\displaystyle \chi (P)}\) 表示 \({\displaystyle P}\) 的 欧拉特征数
  • 高维推广:Ehrhart 多项式
  • 皮克定理和 欧拉公式 ( \({\displaystyle V-E+F=2}\) )等价。

一道例题 (POJ 1265)

题目大意

给一个平面上的简单多边形,求边上的点,多边形内的点,多边形面积。

Solution

这道题目其实用了以下三个知识:

  • 以格子点为顶点的线段,覆盖的点的个数为 \(\gcd(dx,dy)\) ,其中, \(dx,dy\) 分别为线段横向占的点数和纵向占的点数。如果 \(dx\) 或 \(dy\) 为 \(0\) ,则覆盖的点数为 \(dy\) \(dx\) 。
  • Pick 定理:平面上以格子点为顶点的简单多边形的面积 = 边上的点数/2 + 内部的点数 - 1。
  • 任意一个多边形的面积等于按顺序求相邻两个点与原点组成的向量的叉积之和(这个也可以通过顺时针定积分求得)。

于是这题就愉快地做完了

// Author : RioTian
// Time : 20/10/21
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
typedef long long ll;
const int N = 100 + 10;
struct node {
int x, y;
} p[N];
inline int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
inline int area(int a, int b) { return p[a].x * p[b].y - p[a].y * p[b].x; }
int main() {
// freopen("in.txt", "r", stdin);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
int t, ncase = 1;
cin >> t;
while (t--) {
int n, dx, dy, x, y, num = 0, sum = 0;
cin >> n;
p[0].x = p[0].y = 0;
for (int i = 1; i <= n; ++i) {
cin >> x >> y;
p[i].x = x + p[i - 1].x, p[i].y = y + p[i - 1].y;
dx = x, dy = y;
if (x < 0) dx = -x;
if (y < 0) dy = -y;
num += gcd(dx, dy);
sum += area(i - 1, i);
}
if (sum < 0) sum = -sum;
if (sum < 0) sum = -sum;
printf("Scenario #%d:\n", ncase++);
printf("%d %d %.1f\n\n", (sum - num + 2) >> 1, num, sum * 0.5);
}
}

【计算几何 05】Pick定理的更多相关文章

  1. Luogu P2735 电网【真·计算几何/Pick定理】By cellur925

    题目传送门 刷USACO偶然遇到的,可能是人生中第一道正儿八经的计算几何. 题目大意:在平面直角坐标系中给你一个以格点为顶点的三角形,求三角形中的整点个数. 因为必修5和必修2的阴影很快就想到了数学中 ...

  2. HDU 3775 Chain Code ——(Pick定理)

    Pick定理运用在整点围城的面积,有以下公式:S围 = S内(线内部的整点个数)+ S线(线上整点的个数)/2 - 1.在这题上,我们可以用叉乘计算S围,题意要求的答案应该是S内+S线.那么我们进行推 ...

  3. 【POJ】2954 Triangle(pick定理)

    http://poj.org/problem?id=2954 表示我交了20+次... 为什么呢?因为多组数据我是这样判断的:da=sum{a[i].x+a[i].y},然后!da就表示没有数据了QA ...

  4. UVa 10088 - Trees on My Island (pick定理)

    样例: 输入:123 16 39 28 49 69 98 96 55 84 43 51 3121000 10002000 10004000 20006000 10008000 30008000 800 ...

  5. Area(Pick定理POJ1256)

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5429   Accepted: 2436 Description ...

  6. poj 2954 Triangle(Pick定理)

    链接:http://poj.org/problem?id=2954 Triangle Time Limit: 1000MS   Memory Limit: 65536K Total Submissio ...

  7. poj 1265 Area (Pick定理+求面积)

    链接:http://poj.org/problem?id=1265 Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:  ...

  8. poj1265Area(pick定理)

    链接  Pick定理是说,在一个平面直角坐标系内,如果一个多边形的顶点全都在格点上,那么这个图形的面积恰好就等于边界上经过的格点数的一半加上内部所含格点数再减一. pick定理的一些应用 题意不好懂, ...

  9. pick定理:面积=内部整数点数+边上整数点数/2-1

    //pick定理:面积=内部整数点数+边上整数点数/2-1 // POJ 2954 #include <iostream> #include <cstdio> #include ...

随机推荐

  1. java进阶(19)--异常处理机制

    一.基本概念 1.异常的作用: java将异常信息打印至控制台,供程序修改,增加其健壮性. int c=1/0;    //将抛出 java.lang.ArithmeticException 2.异常 ...

  2. python3-day4

    一.列表生成式,迭代器和生成器 1)列表生成式 把列表  [0,1,2,3,4,5,6,7,8,9]里的每个值添加1 1 >>>a = [0,1,2,3,4,5,6,7,8,9] 2 ...

  3. Redis 作者 Antirez 与 Contributor Mattsta 之间关于 CRC 的 Battle

    大家好,我是 yes. 昨天表弟说有个学妹问他 Redis 为什么要用 CRC16(key) mod 16384 来计算 key 所处槽的位置,我想这 CRC 一般都是用来校验的,通过多项式转换成二进 ...

  4. Python-在不在判断 in 和 in判断协议- in __contains__

    in 判断元素是否在序列中, 可以查看 in == is 区别 __contians__ 如果是对象则调用对象中的 __contains__方法 class BeiMenChuiXue: def __ ...

  5. Git入门教程,详解Git文件的四大状态

    大家好,欢迎来到周一git专题. git clone 在上一篇文章当中我们聊了怎么在github当中创建一个属于自己的项目(repository),简称repo.除了建立自己的repo之外,我们更多的 ...

  6. 01Linux系统简介

    Linux 简介 一.介绍 1.1 内容 Linux 的历史,Linux 与 Windows 的区别等知识. 1.2 知识点 linux为何物 linux历史简介 linux重要人物 linux与wi ...

  7. Java (三)APACHE Commons IO 常规操作

    上一篇:Java (二)基于Eclipse配置Commons IO的环境 例1:查看文件.文件夹的长度(大小). 1 import java.io.File; 2 3 import org.apach ...

  8. Python中list的合并

    ①差集 方法一: if __name__ == '__main__':     a_list = [{'a' : 1}, {'b' : 2}, {'c' : 3}, {'d' : 4}, {'e' : ...

  9. 1.入门篇十分钟了解Spring Cloud

    文章目录 Spring Cloud入门系列汇总 为什么需要学习Spring Cloud 什么是Spring Cloud 设计目标与优缺点 设计目标 优缺点 Spring Cloud发展前景 整体架构 ...

  10. Github 太狠了,居然把 "master" 干掉了!

    前段时间栈长有看到 Github 和 master 分支变更的新闻,当时没有注意细节,直到今天我创建仓库时: 看了半天感觉有点不对劲啊... 怎么 master 不见了,之前默认主干分支名称都是叫 m ...