多边形面积计算的演变推导过程
来源:互联网 发布:行知中学官网 编辑:程序博客网 时间: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() )
- 多边形面积计算的演变推导过程
- 计算多边形的面积
- 计算多边形的面积
- 计算多边形的面积
- 计算多边形的面积
- 计算多边形的面积
- hdu2036 (计算多边形的面积)
- 计算任意多边形的面积
- 任意多边形面积的计算
- 任意多边形的面积计算
- 计算任意多边形的面积
- 任意多边形的面积计算
- 计算几何--多边形面积的计算
- VBA之计算选中多边形的面积
- HDU 2036 多边形的面积计算
- 计算多边形与圆的面积交
- 不规则多边形区域的面积计算算法
- 计算不规则多边形的面积、中心、重心
- FreeBSD error when installation on ports
- CI框架自带的验证工具及汉化
- 第十二章 存储类,链接和内存管理 总结 1406015
- 利用BADI WORKORDER_INFOSYSTEM在COOIS中添加自定义列办事处
- postgres 之 initdb 源码分析 一
- 多边形面积计算的演变推导过程
- 黑马程序员——Foundation学习总结7-11
- 嵌入式编程进化史
- ACdream OJ 1099 瑶瑶的第K大 --分治+IO优化 - whatbeg
- 【足迹C++primer】表达式求值
- Java环境变量配置&解决版本不一致问题
- Android开发之自定义控件--ViewPager
- 程序员如何保持持续的进步
- 基于rman的坏块恢复