[计算几何]POJ 1031 计算点对多边形的偏转角度
2008-09-05 00:07
218 查看
首先,由于题目可以得到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
=x[0],y
=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;
}
其中下,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
=x[0],y
=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-3348 Cows 计算几何 求凸包 求多边形面积
- POJ 1408 Fishnet(计算几何,多边形相关算法)
- POJ 1408-Fishnet(计算几何-根据交点求多边形面积)
- POJ-1584-A Round Peg in a Ground Hole-计算几何-凸多边形+多边形包含圆
- poj (1031) 计算几何
- poj 1584 计算几何 (点到线段距离+判断点是否在多边形内+判断多边形是否为凸包)
- POJ 1584(计算几何初步——凸包判断,圆与多边形,点是否在多边形内)
- poj 1265 Area【计算几何:叉积计算多边形面积+pick定理计算多边形内点数+计算多边形边上点数】
- POJ 1031 计算角度
- (计算几何POJ step 8.1.1.2)POJ 1654 Area(使用叉积来计算多边形面积)
- poj 1031 Fence 计算几何
- POJ 2420 A Star not a Tree?(计算几何 多边形的费马点 模拟退火)
- [POJ1654]Area(计算几何-多边形的面积)
- poj1654—Area(计算几何求多边形面积)
- poj 3348 Cows 凸包 求多边形面积 计算几何 难度:0 Source:CCC207
- POJ 1654(计算几何基础多边形面积)
- 计算几何基础与应用:HDU 1348&&ZOJ 1648&&POJ 2398&&ZOJ 1010
- POJ 1039 Pipe【计算几何+直线相交】
- POJ 3304 计算几何
- POJ1385 计算多边形的重心