hdu 2036 (求多边形面积)
题目:给出n按逆时针排序号的点,求其组成多边形的面积。
转于:http://blog.csdn.net/greenappple/article/details/6299299#0-qzone-1-21151-d020d2d2a4e8d1a374a433f596ad1440
[cpp] view plaincopy
- #include <iostream>
- #include <math.h>
- #include <algorithm>
- using namespace std;
- typedef struct node{
- double x;
- double y;
- }Tpoint;
- //多边形公式,要求p[]中的点按逆时针排序号
- double polygonArea(Tpoint p[],int n)
- {
- double area=0;
- int i;
- for(int i=1;i<=n;i++)
- {
- area+=p[i-1].x*p[i%n].y-p[i-1].y*p[i%n].x ;
- }
- return fabs(area/2.0);
- }
- int main()
- {
- //freopen("input.txt","r",stdin);
- Tpoint p[105];
- int n;
- while(cin>>n&&n)
- {
- for(int i = 0; i<n;i++)
- {
- cin>>p[i].x>>p[i].y;
- }
- printf("%.1lf/n",polygonArea(p,n));
- }
- return 0;
- }
若题目中的点不是逆时针排序好的,还需要排序。排序算法如下:
[cpp] view plaincopy
- //矢量差积
- double multiply(Tpoint p1,Tpoint p2,Tpoint p0)
- {
- return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
- }
- //两点距离
- double dist(Tpoint p1,Tpoint p2)
- {
- return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
- }
- //p为输入的点集,n为p中的点的数目,按照逆时针方向排列
- void sort_anticlockwise(Tpoint p[],int n)
- {
- int i,j,k=0;
- Tpoint tmp;
- // 选取p中y坐标最小的点p[k],如果这样的点有多个,则取最左边的一个
- for(i=1;i<n;i++)
- if ( p[i].y<p[k].y || (p[i].y==p[k].y) && (p[i].x<p[k].x) )
- k=i;
- tmp=p[0];
- p[0]=p[k];
- p[k]=tmp; // 现在p中y坐标最小的点在p[0]
- for (i=1;i<n-1;i++) /* 对顶点按照相对p[0]的极角从小到大进行排序,极角相同的按照距离p[0]从近到远进行排序 */
- {
- k=i;
- for (j=i+1;j<n;j++)
- if ( multiply(p[j],p[k],p[0])>0 || // 极角更小
- (multiply(p[j],p[k],p[0])==0) && /* 极角相等,距离更短 */
- dist(p[0],p[j])<dist(p[0],p[k])
- )
- k=j;
- tmp=p[i];
- p[i]=p[k];
- p[k]=tmp;
- }
- }