注意点:
1.根本没有障碍线段情况
2.障碍线段不一定一定在房和平地之间
3.求出房的右端点与障碍左端点连线在平地同一直线的交点x1和房的左端点与障碍右端点连线在平地同一直线的交点x2,将投影(x1,x2)从左向右排序
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
//#define dps (1e-8)
#define MAXN 1010
struct node{
double x1,x2,y;
}xy[MAXN];
double x11,x12,y1,x21,x22,y2,a1,a2,b1;
int n;
int cmp(const void *a,const void *b){//小的放前面
node c=*(node*)a,d=*(node*)b;
if(c.x1==d.x1) return c.x2>d.x2?1:-1;
return c.x1>d.x1?1:-1;
}
void cal(double &x3,double x1,double x2,double y2,double y3){
double k=(y1-y2)/(y2-y3);//xy[i].y-
x3=((1+k)*x2-x1)/k;
}
int main(){
//freopen("D:\\INPUT.txt","r", stdin);
while(scanf("%lf%lf%lf",&x11,&x12,&y1),x11!=0.0||x12!=0.0||y1!=0.0){
scanf("%lf%lf%lf%d",&x21,&x22,&y2,&n);
if(!n)
cout<<x22-x12<<endl;
int i=0;//,k=0;
bool flag=false;
for(;i<n;i++){
scanf("%lf%lf%lf",&a1,&a2,&b1);
//cout<<a1<<' '<<a2<<' '<<b1<<endl;
if(flag)
continue;
if(b1>=y1||b1<y2){//if(!in(b1-y1)||!in(b1-y2)){
// cout<<1<<' '<<i<<' '<<n<<endl;
n--;
i--;
//cout<<1<<' '<<i<<' '<<n<<endl;
}
else{
if(b1==y2){//if(!in(b1-y2)){
//cout<<2<<' '<<i<<' '<<n<<endl;
xy[i].x1=a1;
xy[i].x2=a2;
//cout<<2<<' '<<i<<' '<<n<<endl;
}
else{
cal(xy[i].x1,x12,a1,b1,y2);
cal(xy[i].x2,x11,a2,b1,y2);
}
if(xy[i].x1<=x21&&xy[i].x2>=x22){
//cout<<i<<' '<<xy[i].x1<<' '<<xy[i].x2<<endl;
flag=true;
continue;
}
}
}
if(flag){
cout<<"No View"<<endl;
continue;
}
qsort(xy,n,sizeof(xy[0]),cmp);
double d=0;
for(i=0;i<n;i++){
if(x21==x22)//if(!in(x21,x22))
break;
if(xy[i].x1>=x22||xy[i].x2<=x21){
continue;
}
if(d<xy[i].x1-x21){
d=xy[i].x1-x21;
}
x21=xy[i].x2>x22?x22:xy[i].x2;
}
if(d<x22-x21){
d=x22-x21;
//cout<<1<<endl;
}
//cout<<i<<endl;
//cout<<d<<endl;
if(d<=0){
cout<<"No View"<<endl;
}
else{
printf("%.2lf\n",d);
}
}
return 0;
}