[计算几何]POJ 1031 计算点对多边形的偏转角度

首先,由于题目可以得到dI=I0*|cosα|*dl*h 

 

其中下,X1,X2为一条边的坐右端点,a为这条边对原点所张的角度
所以实际上本题是要求整个FENCE区域对原点所张开的总角度,
定义FENCE为一有向回路 那么每条边都是有向的。如果按照边的方向对原点所张开的角度为顺时针,那么定义为正,逆时针为负。并且每输入一条边就把本边对原点张开的角度计算进去加到一个数里去那么对于包含原点的区域。这个数应该为正负2∏ ;对于不包含原点的区域,这个数在按边过程中的最大值-最小值就是这个区域对原点所张开的角度。

还有一种情况,那就是区域不包含原点,但是总共张开的角度大于2∏ ,那么只要计算为2∏ 即可因为原点对任何区域最多只能张开2∏

#include <stdio.h>
#include 
<math.h>

#define M_PI 3.14159265358979323846

double k,h,x[101],y[101];
 
double angle(double x0, double y0, double x1, double y1) {
     
double a=atan2(y0, x0);
     
double b=atan2(y1, x1);
     
if(b-a>M_PI) a+=2*M_PI;
     
if(a-b>M_PI) b+=2*M_PI;
     
return a-b;
}
 
int main(void) {
     
int i,n;
     scanf(
"%lf %lf %d",&k,&h,&n);
     
for(i=0;i<n;i++)
          scanf(
"%lf %lf",&x[i],&y[i]);
     x[n]
=x[0],y[n]=y[0];
        
     
double min=0,max=0,sum=0;
     
for(i = 0; i < n; i++) {
         
double temp=angle(x[i],y[i],x[i + 1],y[i + 1]);
          
//printf("temp = %lf\n", temp);
         sum+=temp;
         
if(sum<min) min=sum;
         
if(sum>max) max=sum;
         
if(max-min>=2*M_PI) {
              max
=min+2*M_PI;
              
break;
         }
     }
     printf(
"%.2lf\n", k*h*(max - min));
     
return 0;
}

 

你可能感兴趣的:(poj)