题目链接:https://vjudge.net/problem/POJ-2074

题意:给定L1(Housing Line),L2(properity line),和一些L[i](obstructions line),求L2最长连续区间,使得在该区间能够完整地看见L1(视线不被L[i]遮挡)。

思路:

  简单几何题。对L[i],计算其遮挡的区间,假设Line( L1.e , L[i].s )和L2交点的横坐标为t1,Line( L1.s , L[i].e )和L2交点的横坐标为t2,那么L[i]遮挡的区间即为[t1,t2],求出所有的遮挡区间后按x坐标排序,遍历一遍求出最长未遮挡区间即可。

AC code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
using namespace std; const double eps=1e-;
const double inf=1e20;
int sgn(double x){
if(abs(x)<eps) return ;
if(x<) return -;
return ;
} struct Point{
double x,y;
Point(){}
Point(double xx,double yy):x(xx),y(yy){}
Point operator + (const Point& b)const{
return Point(x+b.x,y+b.y);
}
Point operator - (const Point& b)const{
return Point(x-b.x,y-b.y);
}
double operator * (const Point& b)const{
return x*b.x+y*b.y;
}
double operator ^ (const Point& b)const{
return x*b.y-b.x*y;
}
//绕原点旋转角度b(弧度值),后x、y的变化
void transXY(double b){
double tx=x,ty=y;
x=tx*cos(b)-ty*sin(b);
y=tx*sin(b)+ty*cos(b);
}
}; struct Line{
Point s,e;
Line(){}
Line(Point ss,Point ee){
s=ss,e=ee;
}
//两直线相交求交点
//第一个值为0表示直线重合,为1表示平行,为2表示相交
//只有第一个值为2时,交点才有意义
pair<int,Point> operator &(const Line &b)const{
Point res = s;
if(sgn((s-e)^(b.s-b.e)) == )
{
if(sgn((s-b.e)^(b.s-b.e)) == )
return make_pair(,res);//重合
else return make_pair(,res);//平行
}
double t = ((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));
res.x += (e.x-s.x)*t;
res.y += (e.y-s.y)*t;
return make_pair(,res);
}
}; double dis(Point a,Point b){
return sqrt((b-a)*(b-a));
} typedef pair<double,double> PDD;
const int maxn=;
Line L[maxn],L1,L2;
double x1,x2,y,ans;
int n,cnt,cnt2;
PDD pdd[maxn]; bool cmp(PDD p1,PDD p2){
if(p1.first==p2.first)
return p1.second<p2.second;
return p1.first<p2.first;
} int main(){
while(scanf("%lf%lf%lf",&x1,&x2,&y),sgn(x1)||sgn(x2)||sgn(y)){
L1.s.x=x1,L1.e.x=x2,L1.s.y=L1.e.y=y;
scanf("%lf%lf%lf",&x1,&x2,&y);
L2.s.x=x1,L2.e.x=x2,L2.s.y=L2.e.y=y;
scanf("%d",&n);
cnt=cnt2=;
for(int i=;i<n;++i){
scanf("%lf%lf%lf",&x1,&x2,&y);
if(y>=L1.s.y||y<=L2.s.y) continue;
L[++cnt].s.x=x1,L[cnt].e.x=x2,L[cnt].s.y=L[cnt].e.y=y;
}
for(int i=;i<=cnt;++i){
double t1=(L2&(Line(L1.e,L[i].s))).second.x;
double t2=(L2&(Line(L1.s,L[i].e))).second.x;
if(t2<L2.s.x||t1>L2.e.x) continue;
if(t1<L2.s.x) t1=L2.s.x;
if(t2>L2.e.x) t2=L2.e.x;
pdd[++cnt2].first=t1,pdd[cnt2].second=t2;
}
sort(pdd+,pdd+cnt2+,cmp);
ans=L2.e.x-pdd[cnt2].second;
double t1=L2.s.x;
int j=;
while(){
while(pdd[j].first<t1){
t1=max(t1,pdd[j].second);
++j;
}
if(j>cnt2) break;
if(pdd[j].first>=t1){
ans=max(ans,pdd[j].first-t1);
t1=pdd[j].second;
++j;
}
if(j>cnt2) break;
}
if(sgn(ans)!=)
printf("%.2f\n",ans);
else
printf("No View\n");
}
}

poj2074(求直线的交点)的更多相关文章

  1. poj1269 (叉积求直线的交点)

    题目链接:https://vjudge.net/problem/POJ-1269 题意:给出4个顶点,表示两条直线,求这两条直线的相交情况,重合输出LINE,平行输出NONE,相交于一点输出该点的距离 ...

  2. hdu 2857:Mirror and Light(计算几何,点关于直线的对称点,求两线段交点坐标)

    Mirror and Light Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  3. UVa 11437:Triangle Fun(计算几何综合应用,求直线交点,向量运算,求三角形面积)

    Problem ATriangle Fun Input: Standard Input Output: Standard Output In the picture below you can see ...

  4. POJ_1269_Intersecting Lines_求直线交点

    POJ_1269_Intersecting Lines_求直线交点 Description We all know that a pair of distinct points on a plane ...

  5. MATLAB—求直线或者线段之间的交点坐标

    function CrossPoint( ) %% 求两条直线的交点坐标 x1 = [7.8 8]; y1 = [0.96 0.94]; %line2 x2 = [8.25 8.25]; y2 = [ ...

  6. Uva 11178 Morley's Theorem 向量旋转+求直线交点

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=9 题意: Morlery定理是这样的:作三角形ABC每个 ...

  7. C++ 根据两点式方法求直线并求两条直线的交点

    Line.h #pragma once //Microsoft Visual Studio 2015 Enterprise //根据两点式方法求直线,并求两条直线的交点 #include"B ...

  8. 求两条线段交点zz

    "求线段交点"是一种非常基础的几何计算, 在很多游戏中都会被使用到. 下面我就现学现卖的把最近才学会的一些"求线段交点"的算法说一说, 希望对大家有所帮助. 本 ...

  9. hdu 2857 点在直线上的投影+直线的交点

    Mirror and Light Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

随机推荐

  1. Educational Codeforces Round 72

    目录 Contest Info Solutions A. Creating a Character B. Zmei Gorynich C. The Number Of Good Substrings ...

  2. 【原创】go语言学习(十六)接口

    目录 接口介绍与定义 空接口和类型断言 指针接收和值接收区别 接口嵌套 接口介绍与定义 1. 接口定义了一个对象的行为规范 A. 只定义规范,不实现B. 具体的对象需要实现规范的细节 2.Go中接口定 ...

  3. Linux下MySQL的操作(最全)

    注意:这里以mariadb为例 启动mysql服务 systemctl start mariadb 登录mysql mysql -u root -p SQL语言分类 - 数据定义语言:简称[DDL]( ...

  4. vue从一个组件跳转到另一个组件页面router-link的试用

    需求从helloworld.vue页面跳到good.vue页面 1.helloworld.vue页面代码 <template> <div class="hello" ...

  5. [转载]virtual topology虚拟拓扑

    原文地址:topology虚拟拓扑">virtual topology虚拟拓扑作者:一丝尘埃 topology虚拟拓扑" title="[转载]virtual to ...

  6. BigDecimal 相关

    一.BigDecimal 精度设置 BigDecimal setScale(int newScale, int roundingMode): newScale:小数位数, RoundingMode是一 ...

  7. C语言--输入输出格式

    一.PTA实验作业 题目1:7-3 温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1 ...

  8. sklearn.GridSearchCV选择超参

    from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.model ...

  9. Dataeye计算任务架构

    https://mp.weixin.qq.com/s/9Q5-oU3bPIBieScwzrawDg 资源消耗降低2/3,Flink在唯品会实时平台的应用(有彩蛋) 王新春 DBAplus社群 2018 ...

  10. linux/videodev.h: No such file or directory错误解决方法

    sudo apt-get install libv4l-dev* file yum install libv4l-dev* yum install libv4l-dev* 上面错误的问题是两个2.4以 ...