求任意多边形面积-有向面积
给定多边形的顶点坐标(有序),让你来求这个多边形的面积,你会怎么做?
我们知道,任意多边形都可以分割为N个三角形,所以,如果以这为突破点,那么我们第一步就是把给定的多边形,分割为数个三角形,分别求面积,最后累加就可以了,把多边形分割为三角形的方式多种多样,在这里,我们按照如下图的方法分割:
图1
S点作为起始点(点1),a->e依次作为点2,3……。
一个三角形的面积是怎样的呢?
根据线性代数的知识,我们有如下的三角形面积公式,称之为有向面积(signed area):
将这个行列式以第三列展开可以得到:
这就是以点1、2、3构成的三角形的有向面积(点如果是顺时针给出,有向面积为负,逆时针给出,有向面积为正),那么继续我们的工作,通过三角形的面积公式,来得到多边形的面积公式:
对于图1而言,多边形的面积就是:
S(1->6)=S(1,2,3)+S(1,3,4)+S(1,4,5)+S(1,5,6)
这里我们不免有些疑问,第一,图1所给出的是凸多边形,那这种算法对于非凸多边形是否同样适用呢?比如下面这个最简单的凸多边形的图形:
图2
用刚才的划分方法的话,就会出现一个诡异的问题,那就是有一个三角形出现在了图形的外面,而另外一个又超出了多边形的范围(划分为了Sab,Sbc两个图形),那么这样再用刚才的公式求面积,结果还是正确的么?
S(1->4)=S(1,2,3)+S(1,3,4)
先公布结论,这个式子是正确的,等等,为什么?还记得刚才我提到了那个“有向面积”的概念么?忘了的话,请回头看看加重了的字。
请注意从图中看,Sab点为顺时针排列,Sbc点为逆时针排列,面积从数值上就是从Sab这个超过范围的大三角形中去掉Sbc这个小三角形,最后的结果神奇的就是多边形Sabc的面积,那么这个结论能否推广到任意多边形呢?
图3
在这里不做证明,下面给出的公式,就是任意多边形的面积公式:
题目:hdu2036 http://acm.hdu.edu.cn/showproblem.php?pid=2036
//任意多边形的面积计算
#include <iostream>
#include <utility>
#include <cmath>
using std::cout;
using std::cin;
using std::endl;
typedef std::pair<double ,double> point;
#pragma warning(disable:4244)
double det(point p0,point p1,point p2)
{
return (p1.first-p0.first)*(p2.second-p0.second)-(p1.second-p0.second)*(p2.first-p0.first);
}
double ploygon_area(int n,point p[])
{
double s=0.0f;
int i=1;
for(;i < n-1;i++)
s += det(p[0],p[i],p[i+1]);
return 0.5*fabs(s);
}
int main(int argc, char *argv[])
{
int i,n;
double s;
point *points = NULL;
cout<<"Enter the number of edges of the polygon <n>:";
cin>>n;
if(n < 2){
exit(1);
}
points = (point *)malloc(n*sizeof(point));
for(i=0; i<n; i++){
cout<<endl<<"points["<<i<<"]=";
cin>>points[i].first>>points[i].second;
}
s=ploygon_area(n, points);
cout<<"The area is:"<<s<<std::endl;
if(points)
free(points);
return 1;
}
代码大家可以自行修改,主要看公式
求任意多边形面积-有向面积相关推荐
- 已知三个点坐标求 三角形面积 || 求任意多边形面积公式||判断点在直线的左侧还是右侧
已知三个点坐标求 三角形面积 由A-->B-->C-->A 按逆时针方向转.(行列式书写要求) 设三角形的面积为S 则S=(1/2)*(下面行列式) |x1 y1 1| |x2 y2 ...
- 求任意多边形内部水平方向似最大矩形算法实现
背景说明 前段时间有个求点是否在多边形内部的需求,折腾了不少时间,现截取其中的的重点部分--求任意多边形内部水平方向似最大矩形--来搞篇博客. 求点是否在多边形内部这个算法很容易搞,一搜一大把,但数据 ...
- hdoj-2036题解-向量积法求任意多边形面积
首先看一道hdoj的算法题:hdoj-2036-改革春风吹满地 该题题意就是逆时针给出点的坐标,求这个多边形的面积.下面就写一下如何用向量积法求多边形面积. 向量积法与面积 上图说明了如何利用向量求得 ...
- 求任意两圆相交的面积(不限程序设计语言版本)
无所谓程序设计语言,不过是表达形式不一罢了 题目来源 理论知识 参考知识: 代码实现 C# 鼠标悬停此处预览测试样例 Java 鼠标悬停于此预览测试样例 Kotlin C++ C Python Jav ...
- 一种求任意多边形内部水平方向似最大矩形的算法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在前一篇中,我们探讨了如何求凸多边形中的似最大圆,但是针对实际 ...
- c++如何求任意多边形的面积
由于项目需要,求解任意不规则多边形的面积 ,想了很久,也不知道怎么叙述,直接代码展示吧 #include <iostream> #include <vector> using ...
- C++实现——任意多边形的面积
//求任意多边形的面积 /*语法:result = polygonarea(vector<Point>&polygon, int N); 参数: polygon:多变形顶点数组 N ...
- HDOJ2036改革春风吹满地笔记——任意多边形求面积
题目地址 学习了任意多边形的计算,通过向量叉乘来进行计算. 计算公式 如果逆时针给出坐标,求得是正的,就是答案.如果顺时针给出坐标,求得是负,需要变正 具体推导过程 博客地址1 还学了海伦公式求三角形 ...
- 初中生问题:求任意凸多边形的交叉面积
一个初中生问题:求任意凸多边形的交叉面积 类似的几种情况: 第一种0:两个多边形无交叉,没有相交多边形,且一方在另一方没有内点,相交面积为0. 第二种1:两个多边形无交叉,且一方在另一方有内点.称之为 ...
最新文章
- vmware中的网络(bridge,nat)(转载)
- Dom4j 解析Xml文档及XPath查询 学习笔记
- python有道翻译-Python版有道翻译
- jenkins+github+docker+maven自动化构建部署
- 【PP生产订单】入门介绍(十二)
- boost::typeindex::runtime_cast相关的测试程序
- Android总结 之 AsyncTask(二)
- Eclipse使用TODO标签管理任务及自定义TODO标签
- C++_程序内存模型_内存四区_代码区_全局区_每种区域都存放什么样的变量---C++语言工作笔记028
- [转]解读2014之前端篇:任性的颠覆式改变
- 用三方做的豆瓣电影页面
- 两向量叉乘的计算公式_向量的叉乘运算法则
- matlab中gain是什么,PID调理中的GAIN是啥意思?
- mysql5.7从锁表吗_5分钟了解MySQL5.7的Online DDL雷区
- Svn修改自己已经提交的备注
- API管理神器:Apifox
- 拼多多参谋在什么地方?多多参谋的作用是什么?
- CorelDRAW2023新增了哪些功能?
- Python常用库的用法介绍都给大家整理出来啦,非常实用,建议收藏
- 开源的OA办公系统,解决日常工作管理问题