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的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁 ...
随机推荐
- SurfaceView 和 View 区别
android.view.View 和 android.view.SurfaceView SurfaceView 是从 View 基类中派生出来的显示类,直接子类有 GLSurfaceView和Vid ...
- Ext.Net 使用总结之GridPanel的删除事件
1.关于Ext.net中GridPanel的删除事件 首先是GridPanel,如下: <ext:GridPanel ID="GridPanel1" runat=" ...
- mywebsite1
http://www.wuweierwei.com/ 个人网站 http://www.yyyweb.com/demo/icons-filling/index.html CSS3图标填充效果 http: ...
- jquery新增,删除 ,修改,清空select中的option
jQuery获取Select选择的Text和Value: 1. var checkText=jQuery("#select_id").find("option:selec ...
- firebreath注册接口
对firebreath文档进行翻译,顺便做个笔记,原地址:http://www.firebreath.org/display/documentation/JSAPIAuto 综述: 你可能会对需要转换 ...
- 一句代码美化你的下框之jquery.selectMM修复版(jquery.selectMM v0.9 beta 20141217)
一句代码美化你的下框之jquery.selectMM修复版(jquery.selectMM v0.9 beta 20141217) 浏览效果: http://www.beyond630.com/jqu ...
- 数组求最大最小值和排序java实现
public class ArrayDemo05 { public static void main(String[] args) { int list01[]={67,89,87,69,90 ...
- codeblock编译Object-C
http://blog.csdn.net/ldl22847/article/details/7482971 http://www.cnblogs.com/qingyuan/p/3524791.html ...
- 窗口嵌入到另一个窗口(VC和QT都有)
1.用vc新建一个dialog1工程.属性默认. 2.insert一个dialog2,改为child. 3.在dialog1中包含dialog2头文件,在一个按钮事件中显示dialog2: Cdial ...
- C功底挑战Java菜鸟入门概念干货(一)
一.认识Java 1.Java 程序比较特殊,它必须先经过编译,然后再利用解释的方式来运行. 2.Byte-codes 最大的好处是——可越平台运行,可让“一次编写,处处运行”成为可能. 3.使用 ...