/**
大意:给定一个建筑--水平放置,给定n个障碍物, 给定一条街道,从街道上能看到整个建筑的最长的连续的区域
思路: 分别确定每一个障碍物所确立的盲区,即----建筑物的终点与障碍物的起点的连线,建筑物的起点与障碍物的终点的连线。。这段区域即为盲区,,,有多个盲区,需要去重。。
学习之处: 1、障碍物在输入时去重,非常巧妙
2、 盲区的去重。与重组,。。巧妙。。
3、 寻找最大连续区域,,
**/
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const double eps = 1e-;
double max(double a,double b){
return a>b?a:b;
} struct point{
double x,y;
}; struct segment{
point s,e;
}; struct line{
double a,b,c;
}; struct data{
double l,r;
}a[]; line getline(point p1,point p2){
line tmp;
tmp.a = p1.y-p2.y;
tmp.b = p2.x-p1.x;
tmp.c = p1.x*p2.y-p2.x*p1.y;
return tmp;
} double getInterx(line l1,line l2){
return (l1.b*l2.c-l2.b*l1.c)/(l1.a*l2.b-l2.a*l1.b);
} bool cmp(data a,data b){
return a.l<b.l;
} int main()
{
int n,i,j;
double x1,x2,y;
segment hou,pro,obs[];
while(cin>>x1>>x2>>y){
if(x1==&&x2==&&y==)
break;
hou.s.x = x1,hou.s.y = y;
hou.e.x = x2,hou.e.y = y;
cin>>x1>>x2>>y;
pro.s.x = x1,pro.s.y = y;
pro.e.x = x2,pro.e.y = y;
cin>>n;
for(i=;i<n;i++){
cin>>x1>>x2>>y;
obs[i].s.x = x1,obs[i].s.y = y;
obs[i].e.x = x2,obs[i].e.y =y;
if(y>hou.s.y||y<pro.s.y){
n--;
i--;
}
}
line l_pro = getline(pro.s,pro.e);
for(i=j=;i<n;i++,j++){
line l1,l2;
l1 = getline(hou.s,obs[i].e);
l2 = getline(hou.e,obs[i].s);
a[j].r = getInterx(l_pro,l1);
a[j].l = getInterx(l_pro,l2);
if(a[j].r<pro.s.x||a[j].l>pro.e.x){
j--;
continue;
}
if(a[j].l<pro.s.x) //对于盲区超出街道的区域。
a[j].l = pro.s.x;
if(a[j].r>pro.e.x)
a[j].r = pro.e.x;
}
n = j;
if(n==){ //若没有障碍物在建筑物与街道之间,,则输出整个街道的长度
printf("%.2lf\n",pro.e.x-pro.s.x);
continue;
}
sort(a,a+n,cmp);
double l[],r[];
l[] = a[].l,r[] = a[].r;
for(j=,i=;i<n;i++){ //盲区的重组与去重
if(r[j]<a[i].l){
j++;
l[j] = a[i].l;
r[j] = a[i].r;
}else
r[j] = max(r[j],a[i].r);
}
double ans = max(l[]-pro.s.x,pro.e.x-r[j]); //寻找最大值。
for(i=;i<j;i++){
ans = max(ans,l[i+]-r[i]);
}
if(ans<eps)
printf("No View\n");
else
printf("%.2lf\n",ans);
}
return ;
}

poj 2074 Line of Sight 计算几何的更多相关文章

  1. Poj 2074 Line of Sight

    地址:http://poj.org/problem?id=2074 题目: Line of Sight Time Limit: 1000MS   Memory Limit: 30000K Total ...

  2. 简单几何(直线求交点) POJ 2074 Line of Sight

    题目传送门 题意:从一条马路(线段)看对面的房子(线段),问连续的能看到房子全部的最长区间 分析:自己的思路WA了:先对障碍物根据坐标排序,然后在相邻的障碍物的间隔找到区间,这样还要判断是否被其他障碍 ...

  3. [poj] 2074 Line of Sight || 直线相交求交点

    原题 给出一个房子(线段)的端点坐标,和一条路的两端坐标,给出一些障碍物(线段)的两端坐标.问在路上能看到完整房子的最大连续长度是多长. 将障碍物按左端点坐标排序,然后用房子的右端与障碍物的左端连线, ...

  4. unity下的Line of Sight(LOS)的绘制

    先说说什么是Linf of Sight.在很多RTS游戏中,单位与单位之间的视野关系经常会受到障碍物遮挡.Line of Sight指的就是两个物体之间是否没有障碍物遮挡. 比如在dota中,玩家的视 ...

  5. 【转】Using Raycasts and Dynamically Generated Geometry to Create a Line of Sight on Unity3D

    http://www.linkedin.com/pulse/using-raycasts-dynamically-generated-geometry-create-line-thomas José ...

  6. 【转】unity下的Line of Sight(LOS)的绘制

    http://www.cnblogs.com/yangrouchuan/p/6366629.html 先说说什么是Linf of Sight.在很多RTS游戏中,单位与单位之间的视野关系经常会受到障碍 ...

  7. 2018.07.04 POJ 1654 Area(简单计算几何)

    Area Time Limit: 1000MS Memory Limit: 10000K Description You are going to compute the area of a spec ...

  8. POJ2074:Line of Sight——题解

    http://poj.org/problem?id=2074 题目大意:(下面的线段都与x轴平行)给两条线段,一个点在其中一条线段看另一条线段,但是中间有很多线段阻挡视线.求在线段上最大连续区间使得在 ...

  9. POJ 1066 Treasure Hunt(计算几何)

    题意:给出一个100*100的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁 ...

随机推荐

  1. BZOJ 2716 Violet 3 天使玩偶 CDQ分治

    题目大意:初始给定平面上的一个点集.提供两种操作: 1.将一个点增加点集 2.查询距离一个点最小的曼哈顿距离 K-D树是啥...不会写... 我仅仅会CDQ分治 对于一个询问,查询的点与这个点的位置关 ...

  2. Fix Some bytes have been replaced with the Unicode substitution character while loading file XXX.cs with Chinese Simplified (GB2312) encoding

    When we use <strong>visual studio</strong> open source file or any other file, we may en ...

  3. SQL 2008升级SQL 2008 R2完全教程或者10.00.4000升级10.50.1600

    今天将由于需要就将我的SQL 2008升级到SQL 2008 R2. 说到为什么要升级是因为,从另一台机器上备份了一个数据库,到我的机器上还原的时候提示“System.Data.SqlClient.S ...

  4. Matlab中边缘提取方法简析

    1.Matlab简述 Matlab是国际上最流行的科学与工程计算的软件工具,它起源于矩阵运算,已经发展成一种高度集成的计算机语言.有人称它为“第四代”计算机语言,它提供了强大的科学运算.灵活的程序设计 ...

  5. CloseHandle(),TerminateThread(),ExitThread()的区别

    线程的handle用处:线程的handle是指向“线程的内核对象”的,而不是指向线程本身.每个内核对象只是内核分配的一个内存块,并且只能由内核访问.该内存块是一种数据结构,它的成员负责维护对象的各种信 ...

  6. 《Pointers On C》读书笔记(第二章 基本概念)

    1.从源代码到生成可执行程序的过程整体上可以分为两个阶段:编译和链接.其中,编译过程大致上又可分为:预处理.编译和汇编.预处理阶段主要对源代码中的预处理指令(包含宏定义指令<如 #define& ...

  7. .net中不能在DropDownList中选中多个项的解决方法

    页面中放有多个DropDownList,点击修改时候,需要根据值来设置两个DropDownList的选中项,当值为空时则需要选中默认值. 页面报错:不能在DropDownList中选中多个项. 直接粘 ...

  8. Windows 安装 psutil

    第一步:下载pustil 网址:https://pipy.python.org  (http://yunpan.cn/cJg8aQpYwqfzh (提取码:7fa7)) 第二步:安装这个就没有什么好说 ...

  9. 阿里云ECS每天一件事D8:nginx1.7整合php5.4

    nginx本身的并不能解析php或者jsp,要转发给后端的php或者tomcat以及其他类似的应用程序服务器来提供服务. 首先我需要完成的配置是实现与php的整合,典型的配置信息如下: server ...

  10. 如何使ListView具有像ios一样的弹性

    ListView 是我们在开发过程中经常使用的控件之一,通常情况下,当我们没有对它进行自定义或者给添加headerview 或者footerView的时候,他都没有一个很好的反馈效果,但是相比较而言, ...