【计算几何——直线相交】POJ 1039
2012-03-29 21:22
399 查看
黑书例题
#define eps 1e-9 #define pi acos(-1.0) struct Point{ double x,y; }; int dbl_cmp(double d){ if (fabs(d)<eps) return 0; return d>0?1:-1; } double det(double x1,double y1,double x2,double y2){ return x1*y2-x2*y1; } double cross(Point a,Point b,Point c){ return det(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y); } int segcross_simple(Point a,Point b,Point c,Point d){ if (dbl_cmp(cross(a,b,c))*dbl_cmp(cross(a,b,d))<=0) return 1;//相交 return 0;//不相交 } int segcross(Point a,Point b,Point c,Point d,Point &p){//求交点 double s1,s2; int d1,d2; s1=cross(a,b,c); s2=cross(a,b,d); d1=dbl_cmp(s1); d2=dbl_cmp(s2); //规范相交求交点 if ((d1^d2)==-2){ p.x=(c.x*s2-d.x*s1)/(s2-s1); return 1; } if (d2==0){ p.x=d.x; return 1; } if (d1==0){ p.x=c.x; return 1; } return 0; } int main(){ Point up[22],bottom[22],p; int n,i,j,k; bool all; double ans; while (scanf("%d",&n) && n){ all=false; ans=MIN; for (i=1;i<=n;i++){ scanf("%lf%lf",&up[i].x,&up[i].y); bottom[i].x=up[i].x; bottom[i].y=up[i].y-1.0; } for (i=1;i<=n && !all;i++){ for (j=1;j<=n;j++){ for (k=1;k<=n;k++) if (segcross_simple(up[i],bottom[j],up[k],bottom[k])==0) break; if (k>n){//都没有交点 all=true; break; } if (k>max(i,j)){ segcross(up[i],bottom[j],up[k],up[k-1],p); ans=max(ans,p.x); segcross(up[i],bottom[j],bottom[k],bottom[k-1],p); ans=max(ans,p.x); } } } if (all) printf("Through all the pipe.\n"); else printf("%.2lf\n",ans); } return 0; }
相关文章推荐
- POJ 1039——计算几何初步(判断线段与直线相交)
- POJ 1039 Pipe【计算几何+直线相交】
- POJ 1039 Pipe(计算几何---直线和线段的相交问题)
- POJ 3304 Segments(计算几何:直线与线段相交)
- POJ 1269(计算几何+直线相交)
- POJ 3304(计算几何初步——判断线段和直线相交,加上枚举)
- POJ 3304 Segments <计算几何(直线与线段相交判断)>
- POJ 3304 Segments(计算几何 判断直线与线段相交)
- POJ 3304 Segments (计算几何、判断直线与线段是否相交)
- POJ 3304 Segments(计算几何:直线与线段相交)
- POJ 3304:Segments 计算几何 是否有直线与所有线段相交
- POJ1269---Intersecting Lines (计算几何基础:直线相交求交点)
- POJ1127——Jack Straws(计算几何,直线相交)
- POJ 1039-Pipe(计算几何-线段相交、求交点)
- POJ 3304 计算几何 直线与线段相交
- 简单几何(直线与线段相交) POJ 1039 Pipe
- (计算几何step8.1.2.1)POJ 2653 Pick-up sticks(判断一根木棒的上面时候还有其他木棒——判断两条直线是否相交)
- POJ 1039 Pipe (计算几何、思维、线段相交)
- (计算几何step8.1.2.2)POJ 1269 Intersecting Lines(使用叉积来计算两条直线的交点)
- poj 1039 Pipe 直线与线段相交