题目链接:1127. 多边形面积(计算几何)

题意

按逆时针顺序给出 \(n\) 个点的坐标,求这些点围成的多边形的面积。

思路

选择多边形上的一个点,然后每次枚举之后的两个点,计算叉积,注意要保留符号,对所有的叉积的结果相加就是多边形的面积。

举个栗子:

计算上图多边形 \(ABCDEFGH\) 的面积,选择 \(A\) 点,则面积等于 \(\frac{1}{2} (\boldsymbol {AB \times AC} + \boldsymbol {AC \times AD} + \boldsymbol {AD \times AE} + \boldsymbol {AE \times AF} + \boldsymbol {AF \times AG} + \boldsymbol {AG \times AH})\)。其中 \(\triangle ABC\) 的面积是负的,而 \(\triangle ACD\) 与 \(\triangle ADE\) 的面积都是正的,则多边形 \(ABCDE\) 的面积相当于多边形 \(ACDE\) 的面积减去 \(\triangle ABC\) 的面积。

代码

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <vector>
  4. #include <cmath>
  5. #include <algorithm>
  6. using namespace std;
  7. typedef long long ll;
  8. typedef double db;
  9. const db eps = 1e-10;
  10. const db pi = acos(-1.0);
  11. const ll inf = 0x3f3f3f3f3f3f3f3f;
  12. const ll maxn = 100 + 10;
  13. inline int dcmp(db x) {
  14. if(fabs(x) < eps) return 0;
  15. return x > 0? 1: -1;
  16. }
  17. class Point {
  18. public:
  19. double x, y;
  20. Point(double x = 0, double y = 0) : x(x), y(y) {}
  21. void input() {
  22. scanf("%lf%lf", &x, &y);
  23. }
  24. bool operator<(const Point &a) const {
  25. return (!dcmp(x - a.x))? dcmp(y - a.y) < 0: x < a.x;
  26. }
  27. bool operator==(const Point &a) const {
  28. return dcmp(x - a.x) == 0 && dcmp(y - a.y) == 0;
  29. }
  30. db dis2(const Point a) {
  31. return pow(x - a.x, 2) + pow(y - a.y, 2);
  32. }
  33. db dis(const Point a) {
  34. return sqrt(dis2(a));
  35. }
  36. db dis2() {
  37. return x * x + y * y;
  38. }
  39. db dis() {
  40. return sqrt(dis2());
  41. }
  42. Point operator+(const Point a) {
  43. return Point(x + a.x, y + a.y);
  44. }
  45. Point operator-(const Point a) {
  46. return Point(x - a.x, y - a.y);
  47. }
  48. Point operator*(double p) {
  49. return Point(x * p, y * p);
  50. }
  51. Point operator/(double p) {
  52. return Point(x / p, y / p);
  53. }
  54. db dot(const Point a) {
  55. return x * a.x + y * a.y;
  56. }
  57. db cross(const Point a) {
  58. return x * a.y - y * a.x;
  59. }
  60. };
  61. Point p[maxn];
  62. int n;
  63. db area() {
  64. if(n < 3) return 0.0;
  65. db ans = 0.0;
  66. for(int i = 2; i < n; ++i) {
  67. ans += (p[i] - p[1]).cross(p[i + 1] - p[1]);
  68. }
  69. return ans * 0.5;
  70. }
  71. int main() {
  72. while(~scanf("%d", &n) && n) {
  73. db s = 0;
  74. for(int i = 1; i <= n; ++i) {
  75. p[i].input();
  76. }
  77. s = area();
  78. printf("%.1lf\n", fabs(s));
  79. }
  80. return 0;
  81. }

EOJ 1127. 多边形面积(计算几何)的更多相关文章

  1. poj 3348 Cows 凸包 求多边形面积 计算几何 难度:0 Source:CCC207

    Cows Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7038   Accepted: 3242 Description ...

  2. EOJ 1058. 挤模具 (多边形面积)

    题目链接:1058. 挤模具 题意 给出模具的底和体积,求模具的高. 思路 模具的底为多边形,因此求出多边形面积,用体积除以底的面积就是答案. 多边形的面积求解见 EOJ 1127. 多边形面积(计算 ...

  3. [知识点]计算几何I——基础知识与多边形面积

    // 此博文为迁移而来,写于2015年4月9日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxaq.html 1.前言 ...

  4. hdu 2528:Area(计算几何,求线段与直线交点 + 求多边形面积)

    Area Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. poj 1654 Area(计算几何--叉积求多边形面积)

    一个简单的用叉积求任意多边形面积的题,并不难,但我却错了很多次,double的数据应该是要转化为long long,我转成了int...这里为了节省内存尽量不开数组,直接计算,我MLE了一发...,最 ...

  6. poj 1265 Area【计算几何:叉积计算多边形面积+pick定理计算多边形内点数+计算多边形边上点数】

    题目:http://poj.org/problem?id=1265 Sample Input 2 4 1 0 0 1 -1 0 0 -1 7 5 0 1 3 -2 2 -1 0 0 -3 -3 1 0 ...

  7. HDU 2036 改革春风吹满地【计算几何/叉乘求多边形面积】

    改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  8. 多边形面积(Area_Of_Polygons)

    原理: 任意多边形的面积可由任意一点与多边形上依次两点连线构成的三角形矢量面积求和得出. 分析: 由于给出的点是相对于我们的坐标原点的坐标,每个点实际上我们可以当作一个顶点相对于原点的向量,如下图所示 ...

  9. 简单几何(向量旋转+凸包+多边形面积) UVA 10652 Board Wrapping

    题目传送门 题意:告诉若干个矩形的信息,问他们在凸多边形中所占的面积比例 分析:训练指南P272,矩形面积长*宽,只要计算出所有的点,用凸包后再求多边形面积.已知矩形的中心,向量在原点参考点再旋转,角 ...

随机推荐

  1. Markdown ![...](...) --> <img ... />

    search \!\[(\w+)\]\(([a-zA-Z0-9/.]+)\) replace <img src="$2" width="30%"/>

  2. Vim使用taglist功能

    下载 wget http://www.vim.org/scripts/download_script.php?src_id=19574 -O taglist.zip 然后解压taglist.zip到~ ...

  3. 1381. 删除 (Standard IO)

    题目描述: Alice上化学课时又分心了,他首先画了一个3行N列的表格,然后把数字1到N填入表格的第一行,保证每个数只出现一次,另外两行他也填入数字1到N,但不限制每个数字的出现次数.Alice现在想 ...

  4. 记录js中的兼容问题及解决办法

    1.获取非行内样式的兼容问题: 2.获取事件对象的兼容问题: 3.事件冒泡的兼容: 4.keyCode的兼容问题: 5.处理默认事件的兼容问题: 6.事件的绑定兼容问题:

  5. 用webdriver模仿浏览器 爬取豆瓣python书单

    用webdriver模仿浏览器 爬取豆瓣python书单 其中运用到os 模块 作用是生成文件夹 存储爬取的信息 etree 用于xpath解析内容 详细代码如下 可用我的上一篇博客存取到excel当 ...

  6. C语言博客作业04

    问题|答案 -|:-:|-: 这个作业属于哪个课程|c语言程序设计I 这个作业的要求在哪里|https://edu.cnblogs.com/campus/zswxy/CST2019-4/homewor ...

  7. MybatisPlus自动填充公共字段的策略

    背景:数据库中多个表有时间字段,并且字段名一致 需求:该时间字段由MybatisPlus自动插入和更新,业务代码无需处理 方法: 一.创建基础实体[BaseEntity],定义需要处理的公共字段(创建 ...

  8. css怎么解决表格边框线重复问题

    <ul> <li><a href="#">1</a></li> <li><a href="# ...

  9. vue - blog开发学习4

    1.新建页面的修改,集成富文本编辑 edit-post.vue(新建和修改都用该组件) <template> <div class="editor"> &l ...

  10. BUUCTF 梅花香自苦寒来

    梅花香自苦寒来 打开图片可以看到,在jpg后面有大量的数据,将它保存出来,可以看出是十六进制,将它转为ascii,写脚本 with open('hex.txt','r') as h: h=h.read ...