多边形面积计算的演变推导过程
标签:
it数学与计算机 |
多边形可以分割成多个三角形,倘若用向量法求三角形面积,则可以很简单求出来.
先来推导一下要用到的公式,因为我已经不记得了....
公式1 : S△ABC = 1/2*ac*sinB =
如上图.△ABC,由基本三角函数可以得到
CH=a*sinB
所以:
S△ABC=1/2*c*CH=1/2*a*c*sinB
同理可以得到其他两条公式
现在对两个向量数量积计算公式做一个推导,下面将会用到
两个向量数量积向量公式推导如下
如上图,向量数量积是一个数,没有方向,正负由θ决定,下面公式应该很容易看懂的,从力学的角度看
http://img.blog.csdn.net/20140615082730390,同时可以得到cos(θ)=(两向量数量积) /
(两向量模乘积)
两个向量数量积坐标公式推导如下
公式2,公式3直接截图百度文档
好了,复习到这里,已经把所有需要用到的公式都得到了.其中公式3,向量法求面积就是在计算机中要用到的(注意,公式3得到的是一个绝对值,符合实际面积,但是在计算机上做多边形切割的时候,会有不同.)
推导完成上面全部公式后,现在来推导多边形面积计算公式,先看一个图
图中O点是在多边形之外的一个点,分别链接多边形每一个顶点,所得到的三角形,如果我们直接按照向量公式计算面积,得到的4个三角形的面积那肯定是重复计算了.不过仔细观察可以发现,△ODA的方向跟其他三个刚好相反,所以面积不取绝对值的话,则刚好可以抵消前面三个三角形所多出来的面积部分.
那如果我把点O放在多边形内部又会怎样呢?试试看
图丑了点哈,仔细看又发现,现在所有三角形的方向都是一样的,也就是说面积就是每一个三角形面积之和.
上面讨论了两种情况都是凸多边形,那凹多边形能否适用?试试看
太幸运了,观察发现无论凸的还是凹的都一样使用第一种情况的分析,虽然说这种举例子观察法很不科学,但对于我们理解面积计算方法应该是很有帮助的.事实上,上面的猜测是正确的.现在可以用计算机来计算图形面积了.
下面给出一道题,题目是这样的
输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1,
y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
-
#include
-
#include
-
#include
-
#include
-
double
area( intx1, inty1, intx2, inty2); -
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 -
{ -
scanf("%d%d",x+i,y+i); -
} -
for (i=0;i -
{ -
if(i>0) -
{//交题库必须改成dArea+=area(x[i-1],y[i-1],x[i],y[i]); -
-
dArea+=area(x[i],y[i],x[i-1],y[i-1]);//以原点为参考点,当前点与前一点构成三角形 -
} -
if (i==n-1) -
{//交题库必须改成dArea+=area(x[i],y[i],x[0],y[0]); -
dArea+=area(x[0],y[0],x[i],y[i]);//注意,最后一点是与第一点构成三角形,而且第一点在前 -
} -
}
-
//交题库必须把asb()去掉 -
printf("%.1lf\n",abs(dArea));//计算方向会影响结果正负,所以必须取绝对值 -
} -
return 0; -
}
-
double
area( intx1, inty1, intx2, inty2) -
{
-
return (x1*y2-x2*y1)*0.5; -
}

加载中…