加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2014-06-15 11:45:19)
标签:

it

数学与计算机

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

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

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

http://img.blog.csdn.net/20140615074551062?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW1fS0s=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


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

CH=a*sinB   

所以:

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

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

 

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

http://img.blog.csdn.net/20140615081615937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW1fS0s=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

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

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

http://img.blog.csdn.net/20140615082730390,同时可以得到cos(θ)=(两向量数量积) / (两向量模乘积)


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

http://img.blog.csdn.net/20140615083416296?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW1fS0s=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast


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

http://img.blog.csdn.net/20140615075616234?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW1fS0s=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

  


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

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

http://img.blog.csdn.net/20140615090445031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW1fS0s=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

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

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

http://img.blog.csdn.net/20140615091554593?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW1fS0s=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

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

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

http://img.blog.csdn.net/20140615092031031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSW1fS0s=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast

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

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

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

 

  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. double area(int x1,int y1,int x2,int y2);  
  6. int main()  
  7.  
  8.     int n,i;  
  9.     int x[100]={0},y[100]={0};  
  10.     double dArea;  
  11.     while(scanf("%d",&n)!=EOF && (n!=0)  
  12.      
  13.         dArea=0;  
  14.         for(i=0;i
  15.          
  16.             scanf("%d%d",x+i,y+i);  
  17.          
  18.         for (i=0;i
  19.          
  20.             if(i>0)  
  21.             {//交题库必须改成dArea+=area(x[i-1],y[i-1],x[i],y[i]);  
  22.   
  23.                 dArea+=area(x[i],y[i],x[i-1],y[i-1]);//以原点为参考点,当前点与前一点构成三角形  
  24.              
  25.             if (i==n-1)  
  26.             {//交题库必须改成dArea+=area(x[i],y[i],x[0],y[0]);  
  27.                 dArea+=area(x[0],y[0],x[i],y[i]);//注意,最后一点是与第一点构成三角形,而且第一点在前  
  28.              
  29.          
  1.                  //交题库必须把asb()去掉  
  2.         printf("%.1lf\n",abs(dArea));//计算方向会影响结果正负,所以必须取绝对值  
  3.      
  4.     return 0;  
  5.  
  6. double area(int x1,int y1,int x2,int y2)  
  7.  
  8.     return (x1*y2-x2*y1)*0.5;  
  9.  
不过上面直接交到题库去的话是错误的...改成注释那样就正确了.....不知道什么原因了..

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有