HDU 2036(多边形计算面积模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2036
这是第一次求多边形面积,看了ppt自己写了这个模板代码
这题涉及几个知识点:1,矢量叉乘,表示一个垂直于两个矢量的矢量,有方向,假设叉乘的两个矢量为a,b,a逆时针可以走到b,那么,a×b为正,反之为负
2,叉乘过程:a(x1,y1),b(x2,y2),那么a×b=x1*y2-x2*y1;可以列出矩阵来求相乘结果。
3,多边形可以化成几个三角形,然后逐一用矢量相乘取绝对值在平分为二得到结果,这是以多边形某一点来做的,而又可以在多边形内取一个点为扇点,连接每个顶点,
然后计算每个三角形的面积再相加,而又,这个扇点可以放到多边形外面来,连接每个点,再逆时针逐一计算面积取半,因为这是有向的,所以可以直接相加
而又,这个扇点既然可以放到多边形外面来,不然将之放在原点,这样便于计算。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> int t,i; double x[110],y[110]; double area(int n) { return (x[n]*y[(n+1)%t])-(x[(n+1)%t]*y[n]);//这里的取模是因为当达到最后一个的时候,就应该拿最后一个向量跟第一个向量进行叉乘 //这里是把扇点放在原点的位置,每个向量在计算的时候都少了(x-0,y-0)这个过程,简便 } int main() { double s; while(scanf("%d",&t),t) { s=0; for(i=0;i<t;i++) { scanf("%lf%lf",&x[i],&y[i]); if(i)s+=area(i-1);//当有两个向量的时候就可以开始计算了,节省一点时间 } s+=area(i-1); printf("%.1lf\n",s/2.0); } return 0; }