博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【改革春风吹满地 HDU - 2036 】【计算几何-----利用叉积计算多边形的面积】
阅读量:4966 次
发布时间:2019-06-12

本文共 1287 字,大约阅读时间需要 4 分钟。

利用叉积计算多边形的面积

我们都知道计算三角形的面积时可以用两个邻边对应向量积(叉积)的绝对值的一半表示,那么同样,对于多边形,我们可以以多边形上的一个点为源点,作过该点并且过多边形其他点中的某一个的多条射线,这样就可以把该多边形变为多个三角形,然后利用叉积求面积即可。

不过要注意,对于三角形可以简单的用叉积的绝对值的一半表示,但对于多边形不可随意将它分割成的几个三角形对应的叉积的绝对值相加,要有一定顺序才可。
对于三角形,有
1698539-20190824171426224-902328129.png

【该图片来源:】

对于多边形,若顶点是按逆时针方向排列的则方向为最终的值为正,反之为负。这里的排列方向是指你遍历其他顶点时相对于源点的走向。下面见 题解。
补充:关于凸多边形和凹多边形的的样子见下图。
1698539-20190824173229984-152362238.png

【该图片来源:】

以上内容参考博文:

AC代码

该题目不用多讲,直接上代码。

#include
#include
#include
#include
#include
using namespace std;const int maxn = 100 + 10;struct Point{ int _x, _y; Point operator-(Point b) { Point a; a._x = _x - b._x; a._y = _y - b._y; return a; }};int n;Point p[maxn];int Cross(Point a, Point b){ return a._x * b._y - a._y * b._x;}int Area(Point *p){ int ans = 0; for(int i = 1; i < n - 1; i++) ans += Cross(p[i]-p[0], p[i+1]-p[0]); //最好写成这样,清晰些,不容易出错 return ans; //题目说的逆时针,故ans为正值,直接返回即可}int main(){// freopen("input.txt", "r", stdin);// freopen("output.txt", "w", stdout); while(cin >> n && n) { for(int i = 0; i < n; i++) cin >> p[i]._x >> p[i]._y; int area = Area(p); printf("%.1lf\n", (double)area / 2.0); }}

转载于:https://www.cnblogs.com/KeepZ/p/11405415.html

你可能感兴趣的文章
课堂练习之《找水王》
查看>>
poj3255
查看>>
for循环
查看>>
iptables 设置肯限制流量
查看>>
cscope usage
查看>>
今天又是新的一周,把考勤做一下吧。
查看>>
特殊篮子问题——C语言暴力破解
查看>>
java环境变量的设置
查看>>
Spring 4 : 整合 SSH
查看>>
MongoDB学习笔记Day1
查看>>
[.NET] - EventSource类的使用
查看>>
过滤URL
查看>>
[Educational Round 59][Codeforces 1107G. Vasya and Maximum Profit]
查看>>
SaltStack配置管理--状态间的关系(六)
查看>>
Hexo搭建Github静态博客
查看>>
Java集合杂谈
查看>>
[C++] 用Xcode来写C++程序[6] Name visibility
查看>>
[UI] 精美UI界面欣赏[10]
查看>>
音乐波形图动画效果
查看>>
OpenGL投影矩阵(Projection Matrix)构造方法
查看>>