要想计算多边形的面积我们可以转化为求多个三角形的面积之和得到:
在解析几何里, △ABC的面积可以通过如下方法求得: 点坐标 => 边长 => 海伦公式 => 面积 但是问题就出现在这里了,用这种方法做的话,计算量大,精度损失。
这里就利用到叉积了:
叉积的几何意义
叉积的长度 |a × b| 可以解释成以a和b为边的平行四边形的面积。进一步就是说,三重积可以得到以a,b,c为边的平行六面体的体积。
a x b = a*b*sin θ ;
a = (x1,y1) ,b = (x2,y2) ; a x b = x1y2 - x2y1 ;
所以得到
多边形面积公式:A=sigma(Ai) (i=1…N-2)(凹多边形也适用,如凹四边形,相当于一个大三角形减去一个小三角形,减去的小三角形其实就是加上负的有向面积)
http://acm.hdu.edu.cn/showproblem.php?pid=2036
朴素做法,
View Code
1 #include<stdio.h> 2 double getArea(double x1,double y1,double x2,double y2,double x3,double y3){ 3 return ((x2-x1)*(y3-y1) - (y2-y1)*(x3-x1)) ; 4 } 5 int main(){ 6 int n; 7 while(scanf("%d",&n) ,n ){ 8 double x1,y1,x2,y2,x3,y3 ; 9 scanf("%lf%lf%lf%lf%lf%lf",&x1,&y1,&x2,&y2,&x3,&y3) ; 10 n -= 3; 11 double ans = getArea(x1,y1,x2,y2,x3,y3) ; 12 while(n--){ 13 x2 = x3, y2 = y3 ; 14 scanf("%lf%lf",&x3,&y3) ; 15 ans += getArea(x1,y1,x2,y2,x3,y3) ; 16 } 17 if( ans < 0) ans = -ans ; 18 printf("%.1lf\n",ans / 2) ; 19 } 20 return 0; 21 }
还可以更简单
依然成立: 因此 po为原点
View Code
1 #include<stdio.h> 2 struct Point{ 3 int x,y; 4 }p[110] ; 5 double getArea(Point a,Point b){ 6 return 1.0*(a.x * b.y - a.y * b.x) ; 7 } 8 int main(){ 9 int n; 10 while(scanf("%d",&n) , n){ 11 for(int i=1;i<=n;i++) 12 scanf("%d%d",&p[i].x,&p[i].y) ; 13 double ans = getArea(p[n],p[1]) ; 14 for(int i=1;i<n;i++) 15 ans += getArea(p[i],p[i+1]) ; 16 if(ans < 0) ans = -ans ; 17 printf("%.1lf\n",ans/2) ; 18 } 19 return 0; 20 }
来自 : (HDUACM2010版_07)计算几何基础