计算多边形面积
三角形的面积
1、在解析几何里, △ABC的面积可以通过如下方法求得:
点坐标 => 边长 => 海伦公式 => 面积
海伦公式: S=sqrt[p(p-a)(p-b)(p-c)],其中p=(a+b+c)/2(p为三角形的半周长)
2、 计算几何的方法
△ABC的面积就是“向量AB”和“向量AC”两个向量叉积的绝对值的一半。其正负表示三角形顶点是在右手系还是左手系。
Area(A,B,C)= 1/2 * (↑AB) × (↑AC)
得到是有向面积(有正负)
凸多边形的三角形剖分
1、 以 P1为扇面中心,连接P1Pi就得到N-2个三角形,由于凸性,保证这些三角形全在多边形内,那么,这个凸多边形的有向面积:
A=sigma(Ai) (i=1…N-2)
2、 我们能把多边形分成N-2个三角形,为什么不能分成N个三角形呢?
比如,以多边形内部的一个点为扇心,就可以把多边形剖分成 N个三角形。
我们可以得到:
A=sigma(Ai) ( i=1…N )
3 、既然内外都可以,为什么不设
P0为坐标原点呢?
简化的公式:A=sigma(( Xi *Y(i+1)- X(i+1) *Yi ))/2( i=1…N )
hdu2036:改革春风吹满地
#include <stdio.h>
#define _DEBUG 0
int main(){
int n,i;
int f_x,f_y;//第1个点
int l_x,l_y;//上一个点
int cur_x,cur_y;//当前点
double area = 0;
#if _DEBUG == 1
freopen("2036.in","r",stdin);
#endif
while(scanf("%d",&n) && n != 0){
area = 0;//重置为0
for(i=0;i<n;++i){
scanf("%d %d",&cur_x,&cur_y);
if(i == 0){
f_x = cur_x;
f_y = cur_y;
}else{
area += (l_x * cur_y - cur_x * l_y);//计算当前点与上一个点以及0点组成的三角形面积
}
l_x = cur_x; l_y = cur_y;
}
area += (cur_x * f_y - f_x * cur_y);
printf("%.1f\n",area/2);
}
return 0;
}