hud2036 求多边形面积

hdu 2036 (求多边形面积)

题目:给出n按逆时针排序号的点,求其组成多边形的面积。

 

转于:http://blog.csdn.net/greenappple/article/details/6299299#0-qzone-1-21151-d020d2d2a4e8d1a374a433f596ad1440

 

 

[cpp] view plaincopy

  1. #include <iostream>  
  2. #include <math.h>  
  3. #include <algorithm>  
  4. using namespace std;  
  5. typedef struct node{  
  6.     double x;  
  7.     double y;  
  8. }Tpoint;  
  9. //多边形公式,要求p[]中的点按逆时针排序号  
  10. double polygonArea(Tpoint p[],int n)  
  11.   {  
  12.     double area=0;  
  13.     int i;  
  14.     for(int i=1;i<=n;i++)  
  15.     {  
  16.         area+=p[i-1].x*p[i%n].y-p[i-1].y*p[i%n].x ;  
  17.     }  
  18.     return fabs(area/2.0);  
  19. }  
  20. int main()  
  21. {  
  22.     //freopen("input.txt","r",stdin);  
  23.     Tpoint p[105];  
  24.     int n;  
  25.     while(cin>>n&&n)  
  26.     {  
  27.         for(int i = 0; i<n;i++)  
  28.         {  
  29.             cin>>p[i].x>>p[i].y;  
  30.         }  
  31.        
  32.       printf("%.1lf/n",polygonArea(p,n));  
  33.     }  
  34.     
  35.     return 0;  
  36. }  

 

 

若题目中的点不是逆时针排序好的,还需要排序。排序算法如下:

 

 

 

[cpp] view plaincopy

  1. //矢量差积  
  2. double multiply(Tpoint p1,Tpoint p2,Tpoint p0)  
  3. {  
  4. return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);  
  5. }  
  6. //两点距离  
  7. double dist(Tpoint p1,Tpoint p2)  
  8. {  
  9. return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));  
  10. }  
  11.   
  12. //p为输入的点集,n为p中的点的数目,按照逆时针方向排列  
  13. void sort_anticlockwise(Tpoint p[],int n)   
  14. {   
  15.     int i,j,k=0;   
  16.     Tpoint tmp;   
  17.     // 选取p中y坐标最小的点p[k],如果这样的点有多个,则取最左边的一个   
  18.     for(i=1;i<n;i++)   
  19.         if ( p[i].y<p[k].y || (p[i].y==p[k].y) && (p[i].x<p[k].x) )   
  20.             k=i;   
  21.     tmp=p[0];   
  22.     p[0]=p[k];   
  23.     p[k]=tmp; // 现在p中y坐标最小的点在p[0]   
  24.     for (i=1;i<n-1;i++) /* 对顶点按照相对p[0]的极角从小到大进行排序,极角相同的按照距离p[0]从近到远进行排序 */   
  25.     {   
  26.         k=i;   
  27.         for (j=i+1;j<n;j++)   
  28.             if ( multiply(p[j],p[k],p[0])>0 ||  // 极角更小      
  29.                 (multiply(p[j],p[k],p[0])==0) && /* 极角相等,距离更短 */          
  30.                 dist(p[0],p[j])<dist(p[0],p[k])  
  31.                 )   
  32.                 k=j;   
  33.         tmp=p[i];   
  34.         p[i]=p[k];   
  35.         p[k]=tmp;   
  36.     }   
  37. }  

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值