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的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁 ...
随机推荐
- Mongodb数据库命令端经常使用操作
数据库基本命令操作 数据库经常使用命令 1.Help查看命令提示 help db.help(); db.yourColl.help(); db.youColl.find().help(); rs.he ...
- org.xml.sax.SAXParseException: An invalid XML character (Unicode: 0x0) was found in the CDATA sectio
偶尔有一次beyond compare比较部署文件时,发现有一个JSP文件结尾的地方有一大堆空白的二进制符号,当时没有管,就覆盖上去了. =================背景分割线========= ...
- How To Set Dark Theme in Visual Studio 2010
Want to use the visual studio color theme editor to set the dark theme or other themes? Below shows ...
- JavaScript之Ajax
简介:AJax是在2005年被Adaptive Path的Jesse James Garrett发明的,用户概括异步加载页面内容的技术---说通俗点,Ajax就是实现局部页面通过JavaScript与 ...
- c++ 11 vs 98
在求最长子字符串中题中要遍历个上万字符数据 1.使用c++11代码 for (auto ch : s) { auto ss = vsi[ch]; vsi[ch].insert(i); i++; } 2 ...
- Android安装应用失败UID 和 PID
参考:http://blog.sina.com.cn/s/blog_62ef2f140101j6q2.html 安装任意第三方的一个apk,恢复出厂设置,再次安装相同的apk,提示安装失败,通过打印L ...
- 1)③爬取网易It方面部分新闻
__author__ = 'minmin' #coding:utf-8 import re,urllib,sgmllib,os #根据当前的url获取html def getHtml(url): pa ...
- IOS 特定于设备的开发:监测Retina支持
近年来,Apple在其旗舰设备上引入了Retina显示屏.根据Apple的说法,他的像素密度非常高,足以使人眼无法区分单独的像素. UIScreen类提供了一种容易的方式,用于监查当前设备是否提供了内 ...
- java 键盘输入多种方法 .(转载)
一.java不像C中拥有scanf这样功能强大的函数,大多是通过定义输入输出流对象.常用的类有BufferedReader,Scanner. 实例程序: 1.利用 Scanner 实现从键盘读入int ...
- 【转】几个常用的Oracle存储过程
http://blog.bossma.cn/database/some-oracle-storing-process/ 几个常用的Oracle存储过程 发布时间:2008年1月6日 / 分类:Data ...