poj 2074 Line of Sight 计算几何
/**
大意:给定一个建筑--水平放置,给定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 计算几何的更多相关文章
- Poj 2074 Line of Sight
地址:http://poj.org/problem?id=2074 题目: Line of Sight Time Limit: 1000MS Memory Limit: 30000K Total ...
- 简单几何(直线求交点) POJ 2074 Line of Sight
题目传送门 题意:从一条马路(线段)看对面的房子(线段),问连续的能看到房子全部的最长区间 分析:自己的思路WA了:先对障碍物根据坐标排序,然后在相邻的障碍物的间隔找到区间,这样还要判断是否被其他障碍 ...
- [poj] 2074 Line of Sight || 直线相交求交点
原题 给出一个房子(线段)的端点坐标,和一条路的两端坐标,给出一些障碍物(线段)的两端坐标.问在路上能看到完整房子的最大连续长度是多长. 将障碍物按左端点坐标排序,然后用房子的右端与障碍物的左端连线, ...
- unity下的Line of Sight(LOS)的绘制
先说说什么是Linf of Sight.在很多RTS游戏中,单位与单位之间的视野关系经常会受到障碍物遮挡.Line of Sight指的就是两个物体之间是否没有障碍物遮挡. 比如在dota中,玩家的视 ...
- 【转】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é ...
- 【转】unity下的Line of Sight(LOS)的绘制
http://www.cnblogs.com/yangrouchuan/p/6366629.html 先说说什么是Linf of Sight.在很多RTS游戏中,单位与单位之间的视野关系经常会受到障碍 ...
- 2018.07.04 POJ 1654 Area(简单计算几何)
Area Time Limit: 1000MS Memory Limit: 10000K Description You are going to compute the area of a spec ...
- POJ2074:Line of Sight——题解
http://poj.org/problem?id=2074 题目大意:(下面的线段都与x轴平行)给两条线段,一个点在其中一条线段看另一条线段,但是中间有很多线段阻挡视线.求在线段上最大连续区间使得在 ...
- POJ 1066 Treasure Hunt(计算几何)
题意:给出一个100*100的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁 ...
随机推荐
- The Water Problem(排序)
The Water Problem Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- android部分控件应用解析
java中的接口回调机制图解 1. Adapter 接口概述 Adapter是一个顶层列表视图和底层数据的桥梁,通过adapter可以获取列表视图中所体现的数据条目,并且通过adapter可以为数 ...
- C# 文件帮助类
using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; us ...
- switch case default 的使用
switch_case从页面输入五个同学的成绩,求出平均成绩,如果大于等于90为优秀,小于90大于等于80为良好,小于80大于等于70为一般,小于70大于等于60为较差,小于60为很差 SWITCH语 ...
- 思考----拒绝单纯copy
工作4个多月以来感触最深的是: 做事情的时候遇到不会的可以上网查或者问别人,但是获取到的知识不能只是单纯的copy过来使用达到要求就ok, 更重要的是事后等有空了一定要仔细研究学习,使知识网络完整,这 ...
- 创建oracle数据库的表空间、用户、目录、导入\导出文件等信息
1.创建表空间 create tablespace ts_aw logging datafile 'd:\app\Administrator\product\tablespace\ts_aw.dbf' ...
- TOJ 1139.Compromise
2015-06-03 问题简述: 大概就是输入两段文本(用小写英文字母表示),分别用#表示一段话的结束输入,输出这两个文本的最长公共子序列. 简单的LCS问题,但是输入的是一段话了,而且公共部分比较是 ...
- Labview学习之程序Web发布
Labview学习之程序Web发布 1. LabVIEW Web服务器 在LabVIEW开发环境中,自身带了一个已连接好的Web服务器.LabVIEW Web服务器除了与其他Web服务器一样能 ...
- 一周学会Mootools 1.4中文教程:(4)类型
Mootools的类型主要包含下边几部分:String:字符串;Number:数字;Array:数组;Object:对象;Json:;Cookie:. 这也是我们今天的讲述重点.每一种数据类型Mt都为 ...
- 有关extern的用法
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同.作为一种欲与C兼容的语言, C++保留了一部分过程式 ...