多边形面积计算的演变推导过程

来源:互联网 发布:行知中学官网 编辑:程序博客网 时间:2024/04/29 02:28

多边形可以分割成多个三角形,倘若用向量法求三角形面积,则可以很简单求出来.

先来推导一下要用到的公式,因为我已经不记得了....

公式1 : S△ABC = 1/2*ac*sinB = 1/2*ab*sinC = 1/2*bc*sinA



如上图.△ABC,由基本三角函数可以得到

CH=a*sinB   

所以:

S△ABC=1/2*c*CH=1/2*a*c*sinB

同理可以得到其他两条公式

现在对两个向量数量积计算公式做一个推导,下面将会用到

两个向量数量积向量公式推导如下

如上图,向量数量积是一个数,没有方向,正负由θ决定,下面公式应该很容易看懂的,从力学的角度看

,同时可以得到cos(θ)=(两向量数量积) / (两向量模乘积)


两个向量数量积坐标公式推导如下


公式2,公式3直接截图百度文档


  


好了,复习到这里,已经把所有需要用到的公式都得到了.其中公式3,向量法求面积就是在计算机中要用到的(注意,公式3得到的是一个绝对值,符合实际面积,但是在计算机上做多边形切割的时候,会有不同.)

推导完成上面全部公式后,现在来推导多边形面积计算公式,先看一个图


图中O点是在多边形之外的一个点,分别链接多边形每一个顶点,所得到的三角形,如果我们直接按照向量公式计算面积,得到的4个三角形的面积那肯定是重复计算了.不过仔细观察可以发现,△ODA的方向跟其他三个刚好相反,所以面积不取绝对值的话,则刚好可以抵消前面三个三角形所多出来的面积部分.

那如果我把点O放在多边形内部又会怎样呢?试试看

图丑了点哈,仔细看又发现,现在所有三角形的方向都是一样的,也就是说面积就是每一个三角形面积之和.

上面讨论了两种情况都是凸多边形,那凹多边形能否适用?试试看


太幸运了,观察发现无论凸的还是凹的都一样使用第一种情况的分析,虽然说这种举例子观察法很不科学,但对于我们理解面积计算方法应该是很有帮助的.事实上,上面的猜测是正确的.现在可以用计算机来计算图形面积了.

下面给出一道题,题目是这样的

输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。 输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。

#include <stdio.h>#include <math.h>#include <string.h>#include <stdlib.h>double area(int x1,int y1,int x2,int y2);int main(){int n,i;int x[100]={0},y[100]={0};double dArea;while(scanf("%d",&n)!=EOF && (n!=0) ){dArea=0;for(i=0;i<n;i++){scanf("%d%d",x+i,y+i);}for (i=0;i<n;i++){if(i>0){//交题库必须改成<span style="font-family: Arial, Helvetica, sans-serif;">dArea+=area(x[i-1],y[i-1],x[i],y[i]);</span>dArea+=area(x[i],y[i],x[i-1],y[i-1]);//以原点为参考点,当前点与前一点构成三角形}if (i==n-1){//交题库必须改成<span style="font-family: Arial, Helvetica, sans-serif;">dArea+=area(x[i],y[i],x[0],y[0]);</span>dArea+=area(x[0],y[0],x[i],y[i]);//注意,最后一点是与第一点构成三角形,而且第一点在前}}
                 //交题库必须把asb()去掉printf("%.1lf\n",abs(dArea));//计算方向会影响结果正负,所以必须取绝对值}return 0;}double area(int x1,int y1,int x2,int y2){return (x1*y2-x2*y1)*0.5;}
不过上面直接交到题库去的话是错误的...改成注释那样就正确了.....不知道什么原因了..( 知道原因了.绝对值函数用fabs() )

0 0
原创粉丝点击