给定多边形的顶点坐标(有序),让你来求这个多边形的面积,你会怎么做?
我们知道,任意多边形都可以分割为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;
}

代码大家可以自行修改,主要看公式

求任意多边形面积-有向面积相关推荐

  1. 已知三个点坐标求 三角形面积 || 求任意多边形面积公式||判断点在直线的左侧还是右侧

    已知三个点坐标求 三角形面积 由A-->B-->C-->A 按逆时针方向转.(行列式书写要求) 设三角形的面积为S 则S=(1/2)*(下面行列式) |x1 y1 1| |x2 y2 ...

  2. 求任意多边形内部水平方向似最大矩形算法实现

    背景说明 前段时间有个求点是否在多边形内部的需求,折腾了不少时间,现截取其中的的重点部分--求任意多边形内部水平方向似最大矩形--来搞篇博客. 求点是否在多边形内部这个算法很容易搞,一搜一大把,但数据 ...

  3. hdoj-2036题解-向量积法求任意多边形面积

    首先看一道hdoj的算法题:hdoj-2036-改革春风吹满地 该题题意就是逆时针给出点的坐标,求这个多边形的面积.下面就写一下如何用向量积法求多边形面积. 向量积法与面积 上图说明了如何利用向量求得 ...

  4. 求任意两圆相交的面积(不限程序设计语言版本)

    无所谓程序设计语言,不过是表达形式不一罢了 题目来源 理论知识 参考知识: 代码实现 C# 鼠标悬停此处预览测试样例 Java 鼠标悬停于此预览测试样例 Kotlin C++ C Python Jav ...

  5. 一种求任意多边形内部水平方向似最大矩形的算法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 在前一篇中,我们探讨了如何求凸多边形中的似最大圆,但是针对实际 ...

  6. c++如何求任意多边形的面积

    由于项目需要,求解任意不规则多边形的面积 ,想了很久,也不知道怎么叙述,直接代码展示吧 #include <iostream> #include <vector> using ...

  7. C++实现——任意多边形的面积

    //求任意多边形的面积 /*语法:result = polygonarea(vector<Point>&polygon, int N); 参数: polygon:多变形顶点数组 N ...

  8. HDOJ2036改革春风吹满地笔记——任意多边形求面积

    题目地址 学习了任意多边形的计算,通过向量叉乘来进行计算. 计算公式 如果逆时针给出坐标,求得是正的,就是答案.如果顺时针给出坐标,求得是负,需要变正 具体推导过程 博客地址1 还学了海伦公式求三角形 ...

  9. 初中生问题:求任意凸多边形的交叉面积

    一个初中生问题:求任意凸多边形的交叉面积 类似的几种情况: 第一种0:两个多边形无交叉,没有相交多边形,且一方在另一方没有内点,相交面积为0. 第二种1:两个多边形无交叉,且一方在另一方有内点.称之为 ...

最新文章

  1. vmware中的网络(bridge,nat)(转载)
  2. Dom4j 解析Xml文档及XPath查询 学习笔记
  3. python有道翻译-Python版有道翻译
  4. jenkins+github+docker+maven自动化构建部署
  5. 【PP生产订单】入门介绍(十二)
  6. boost::typeindex::runtime_cast相关的测试程序
  7. Android总结 之 AsyncTask(二)
  8. Eclipse使用TODO标签管理任务及自定义TODO标签
  9. C++_程序内存模型_内存四区_代码区_全局区_每种区域都存放什么样的变量---C++语言工作笔记028
  10. [转]解读2014之前端篇:任性的颠覆式改变
  11. 用三方做的豆瓣电影页面
  12. 两向量叉乘的计算公式_向量的叉乘运算法则
  13. matlab中gain是什么,PID调理中的GAIN是啥意思?
  14. mysql5.7从锁表吗_5分钟了解MySQL5.7的Online DDL雷区
  15. Svn修改自己已经提交的备注
  16. API管理神器:Apifox
  17. 拼多多参谋在什么地方?多多参谋的作用是什么?
  18. CorelDRAW2023新增了哪些功能?
  19. Python常用库的用法介绍都给大家整理出来啦,非常实用,建议收藏
  20. 开源的OA办公系统,解决日常工作管理问题

热门文章

  1. 用户在命令行上发出了EULAS AGREED=1,表示不接受许可协议(虚拟机卸载残留)
  2. Armijo-Goldstein法则和Wolfe-power法则图解
  3. 【Linux 网络】IP校验和计算相关
  4. 【转】LVTTL与LVCMOS区别
  5. 阿里珍贵技术资料免费下载
  6. 电脑桌面宠物-开机自启
  7. 书法练习轨迹ReadMe
  8. c4d工作平面模式关闭不了
  9. 空间统计--空间关系建模工具集,Modeling Spatial Relationships
  10. 电商网站适合用什么服务器?