POJ 1265 Area(Pick定理)

根据pick定理来做

皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式该公式可以表示为

2S=2a+b−2

其中a表示多边形内部的点数,b表示多边形边界上的点数,S表示多边形的面积。

还有就是求边上的点的话,如果x或y对于零,边上点数等于x+y,否则就加他们的最大公约数。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
double maxx = -1e18;
struct Point
{double x, y;Point(double x = 0, double y = 0):x(x),y(y) {}
};
typedef Point Vector;
Vector operator + (Vector A, Vector B)
{return Vector(A.x+B.x, A.y+B.y);
}
Vector operator - (Point A, Point B)
{return Vector(A.x-B.x, A.y-B.y);
}
Vector operator * (Vector A, double p)
{return Vector(A.x*p, A.y*p);
}
Vector operator / (Vector A, double p)
{return Vector(A.x/p, A.y/p);
}
bool operator < (const Point& a, const Point& b)
{if(a.x == b.x)return a.y < b.y;return a.x < b.x;
}
const double eps = 1e-16;
int sgn(double x)
{if(fabs(x) < eps)return 0;if(x < 0)return -1;return 1;
}
bool operator == (const Point& a, const Point& b)
{if(sgn(a.x-b.x) == 0 && sgn(a.y-b.y) == 0)return true;return false;
}
double Dot(Vector A, Vector B)
{return A.x*B.x + A.y*B.y;
}
double Length(Vector A)
{return sqrt(Dot(A, A));
}
double Angle(Vector A, Vector B)
{return acos(Dot(A, B)/Length(A)/Length(B));
}
double Cross(Vector A, Vector B)
{return A.x*B.y-A.y*B.x;
}
double Area2(Point A, Point B, Point C)
{return Cross(B-A, C-A);
}
Vector Rotate(Vector A, double rad) //rad为弧度 且为逆时针旋转的角
{return Vector(A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad));
}
Vector Normal(Vector A) //向量A左转90°的单位法向量
{double L = Length(A);return Vector(-A.y/L, A.x/L);
}
double ToLeftTest(Point a, Point b, Point c)
{return Cross(b - a, c - a) ;
}struct Line
{Point v, p;Line() {}Line(Point v, Point p):v(v), p(p) {}Point point(double t){return v+(p-v)*t;//返回点P = v + (p - v)*t}
};Point GetLineIntersection(Point P, Vector v, Point Q, Vector w)
{Vector u = P-Q;double t = Cross(w, u)/Cross(v, w);return P+v*t;
}bool LineIntersection(Point a, Point b, Point c, Point d) //直线ab与线段cd相交
{return sgn(Cross(b - a, c - a)) *sgn( Cross(b - a, d - a)) <=0;
}double DistanceToLine(Point P, Point A, Point B)
{Vector v1 = B-A, v2 = P-A;return fabs(Cross(v1, v2)/Length(v1));
}
double PolygonArea(Point* p, int n){//p为端点集合,n为端点个数double s = 0;for(int i = 1; i < n-1; ++i)s += Cross(p[i]-p[0], p[i+1]-p[0]);if(s <0)s = -s;return s;
}
int gcd(int x, int y)
{if(y)return gcd(y,x%y);else return x;
}
int main()
{int Case = 0;scanf("%d", &Case);for(int _ = 1;_<=Case;_++){int in = 0, out = 0;double area = 0;if(_ >1)printf("\n");int n;scanf("%d", &n);Point p[200];scanf("%lf%lf", &p[0].x, &p[0].y);for(int i = 1;i<n;i++){scanf("%lf%lf", &p[i].x, &p[i].y);p[i].x += p[i-1].x, p[i].y +=p[i-1].y;}area = PolygonArea(p,n);p[n] = p[0];Vector v[300];for(int i = 0;i<n;i++)v[i] = p[i] - p[i+1];for(int i = 0;i<n;i++){if(v[i].x == 0 || v[i].y == 0){out += abs(v[i].x) +abs(v[i].y);}else{out += gcd(abs(v[i].x),abs(v[i].y));}}in = (area +2-out)*0.5;area = area*0.5;printf("Scenario #%d:\n%d %d %.1f\n", _, in, out,area);}return 0;
}

POJ 1265 Area(Pick定理)相关推荐

  1. poj 1265 Area(pick 定理)

    链接:poj 1265 题意:从原点出发.给出一些dx,dy移动增量,终于形成一个多边形, 求多边形内部的格点数目,边上的格点数目 .以及面积. 补充知识: 1.以格子点为顶点的线段.覆盖的点的个数为 ...

  2. 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_ ...

  3. POJ 1265 Area

    题目大意: 给一个平面上的简单多边形,求边上的点,多边形内的点,多边形面积. 解题思路: 这个题用了很多知识点: 1.以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其中,dxdy分别为线 ...

  4. POJ 1265 pick 定理

    首先来脑补一下几个几何知识 非常奇妙的证明:图形必在格点之外 从cut-the-knot上看到的. 问题:     设想一个平面上布满间距为1的横纵直线,形成由一个个1×1正方形组成的网格.任意给一个 ...

  5. poj 2954 Triangle (pick 定理 的应用 )

    题意 : 求一个三角形中的 整数 点有多少个? 题接: Pick定理证明:http://translate.google.com/translate?u=http://episte.math.ntu. ...

  6. POJ1265(Pick定理的应用)

    题目:Area 先说说什么是Pick定理吧 Pick定理:设以整数点为顶点的多边形的面积为S,多边形内部的整数点数为N,多边形边界上的整数点数为L,则 S=L/2 + N-1. 而对于线段上的整点数我 ...

  7. POJ 1265-Area(计算几何+皮克定理+多边形面积公式)

    题目地址:POJ 1265 题意:给定一个格点多边形,求出内部点数in,边上点数on,和面积S. 思路:运用的定理很多. 1.皮克定理:S=in+on/2-1,即in=(2*S+2-on)/2. 2. ...

  8. 整数点与Pick定理

    Pick 定理   设以整数点为顶点的多边形的面积为S,多边形内部的整数点数为N,多边形边界上的整数点数为L,则 N+1/2L-1=S. 对于N与L的计算由下面的程序给出: typedef struc ...

  9. poj 1654 Area 多边形面积

    /* poj 1654 Area 多边形面积题目意思很简单,但是1000000的point开不了 */ #include<stdio.h> #include<math.h> # ...

最新文章

  1. django报错500排查方法
  2. 西部数据硬盘支持linux,西部数据开发新的Linux文件系统“Zonefs” 支持在分区块设备上运行...
  3. Linux文件属性4——读取目录文件
  4. id图像上传,方便超链接。
  5. 绘制Python代码的UML图
  6. swoole 安装测试
  7. 语音处理的分帧,帧移,加窗,滤波,降噪,合成
  8. JetBrains 快捷键技巧:IntelliJ IDEA 中,你完全不需要鼠标的 10 种情况
  9. python代码300行程序_Python小游戏之300行代码实现俄罗斯方块
  10. iOS蓝牙开发(4.0)详解
  11. MYSQL命令(超详细)
  12. 时间与相关类型(2) - TDate、TTime、TTimeStamp
  13. 5. 等可能概型(古典概型)
  14. 计算机系统的cpu是指什么意思,电脑cpu参数是什么意思
  15. 为什么建议大家一定要办一张大流量卡!
  16. import androidx.core.app.Fragment;报红
  17. VC/PE乐见:简化基金注册程序,鼓励险资流向股权投资...
  18. fedora dnf_如何使用DNF升级Fedora Linux系统
  19. Jetbrains系列软件常用快捷键/模板/调试
  20. Web服务器控件和HTML控件区别

热门文章

  1. 黑猴子的家:JavaWeb 之 Title icon
  2. 完全备份、增量备份和差异备份
  3. 内联函数有什么优点?内联函数和宏定义的区别
  4. http://jingyan.baidu.com/article/0eb457e5208cbb03f0a9054c.html
  5. [原创]一种复制多轨加密VCD光盘(无文件怪碟)的心得
  6. You probably need to get an updated matplotlibrc file from
  7. 小米路由器 不显示 连接设备连接到服务器,小米路由器隐藏网络后怎么连接
  8. Defensive Programming 防御式编程(Defensive Programming)
  9. 今日芯声 | 一张壁纸!让你的小米MIX 3华丽变身“MIX Alpha”
  10. c语言梅森素数求完数,梅森素数与完全数.doc