poj 2165 Gunman
来源:互联网 发布:java简单聊天代码 编辑:程序博客网 时间:2024/06/14 11:10
//将三维坐标系转化为两个二维坐标系判断,分别x-z,z-y坐标系,相当于俯视图和左视图。
//若直线与Window相交,则在左视图和俯视图上必相交。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const double EP=1e-8;
struct Point{double x, y, z;};
struct Rect{Point lp, rp;}r[101];
struct Line{double a, b, c;}l1;
double xz_mult(Point sp, Point ep, Point op){
return (sp.x-op.x)*(ep.z-op.z)-(sp.z-op.z)*(ep.x-op.x);
}
Line makeline(Point p1, Point p2){
Line t1;
int sign=1;
t1.a=(p2.z-p1.z);
if(t1.a<EP){
t1.a*=-1;
sign=-1;
}
t1.b=sign*(p1.x-p2.x);
t1.c=sign*(p1.z*p2.x-p1.x*p2.z);
return t1;
}
int main(){
//freopen("1.txt", "r", stdin);
int n, i, j, k, cc, find, flag;
double kk, anx[101], any[101];
Point p0, p1, p2, p3;
scanf("%d", &n);
for(i=0; i<n; i++){
scanf("%lf %lf %lf %lf %lf", &r[i].lp.x, &r[i].lp.y, &r[i].rp.x, &r[i].rp.y, &r[i].lp.z);
r[i].rp.z=r[i].lp.z;
}
find=0;
for(i=0; i<n-1; i++){
if(find)break;
for(j=i+1; j<n; j++){
if(find)break;
for(cc=0; cc<4; cc++){
flag=0;
if(cc==0){p1=r[i].lp;p2=r[j].lp;}
else if(cc==1){p1=r[i].lp;p2=r[j].rp;}
else if(cc==2){p1=r[i].rp;p2=r[j].rp;}
else if(cc==3){p1=r[i].rp;p2=r[j].lp;}
for(k=0; k<n; k++){
if(xz_mult(p2, r[k].lp, p1)*xz_mult(p2, r[k].rp, p1)>EP){
flag=1;break;
}
}
if(!flag){
find=1;break;
}
}
}
}
if(!find){printf("UNSOLVABLE/n");return 0;}
find=0;
for(i=0; i<n; i++){
kk=(r[i].lp.y)/r[i].lp.z;
flag=0;
for(j=0; j<n; j++){
if(kk*r[j].lp.z-r[j].rp.y>EP||kk*r[j].lp.z-r[j].lp.y<-EP){
flag=1;break;
}
}
if(!flag){p3=r[i].lp; find =1; break;}
kk=(r[i].rp.y)/r[i].lp.z;
flag=0;
for(j=0; j<n; j++){
if(kk*r[j].lp.z-r[j].rp.y>EP||kk*r[j].lp.z-r[j].lp.y<-EP){
flag=1;break;
}
}
if(!flag){p3=r[i].rp; find =1; break;}
}
if(find){
l1=makeline(p1, p2);
double x0=-l1.c/l1.a;
for(i=0; i<n; i++){
anx[i]=-(r[i].lp.z*l1.b+l1.c)/l1.a;
any[i]=kk*r[i].lp.z;
}
printf("SOLUTION/n%.6f/n", x0);
for(i=0; i<n; i++)
printf("%.6f %.6f %.6f/n", anx[i],any[i],r[i].lp.z);
}
else printf("UNSOLVABLE/n");
return 0;
}
- poj 2165 Gunman
- poj 2165 Gunman
- POJ 2165 Going Home
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- POJ
- POJ
- POJ
- 存储过程与触发器
- Qt/E 的交叉编译
- Poedit国际化处理工具
- 用union来判断处理器的大小端
- 【推荐】jQuery应用程序架构设计工具(PPT)
- poj 2165 Gunman
- 无法找到AdbWinApi.dll问题解决
- 基于AFD驱动的进程流量控制
- C#的文件共享读写方式
- Android Intent用法详解 收藏
- android的intent使用方法
- 异步委托-等待委托
- CString
- 一些编程网站