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

原题

给出一个房子(线段)的端点坐标,和一条路的两端坐标,给出一些障碍物(线段)的两端坐标。问在路上能看到完整房子的最大连续长度是多长。



将障碍物按左端点坐标排序,然后用房子的右端与障碍物的左端连线,房子的左端和前一障碍物的右端比较,得出在道路上的能看到的长度取Max即可

#include<cstdio>
#include<algorithm>
using namespace std;
double a,b,c,l,lmx,ans;
int n,pos;
struct point
{
    double x,y;
    bool operator < (const point &b) const
    {
        if (x==b.x) return y<b.y;
        return x<b.x;
    }
    bool operator == (const point &b) const
    {
        return x==b.x && y==b.y;
    }
}p1,p2,p3,p4;
struct hhh
{
    point left,right;
    void init(double a,double b,double c)
    {
        left.x=a;
        right.x=b;
        left.y=right.y=c;
    }
    bool operator < (const hhh &b) const
    {
        if (left==b.left) return right<b.right;
        return left<b.left;
    }
}house,surplus[110],line;

double max(double x,double y) { return x>y?x:y; }
double min(double x,double y) { return x<y?x:y; }

double find(point a,point b,point c,point d)
{
    double tmp=((a.x-c.x)*(c.y-d.y)-(a.y-c.y)*(c.x-d.x))/((a.x-b.x)*(c.y-d.y)-(a.y-b.y)*(c.x-d.x));
    return  (b.x-a.x)*tmp+a.x;
}

int main()
{
    while (~scanf("%lf%lf%lf",&a,&b,&c))
    {
    if (a==0 && b==0 && c==0) break;
    house.init(a,b,c);
    scanf("%lf%lf%lf",&a,&b,&c);
    line.init(a,b,c);
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%lf%lf%lf",&a,&b,&c);
        surplus[i].init(a,b,c);
    }
    sort(surplus+1,surplus+n+1);
    lmx=ans=-1;
    p3=line.left;
    p4=line.right;
    for (int i=1;i<=n+1;i++)
    {
        double l,r;
        if (surplus[i].left.y>=house.left.y) continue;
        if (i==1) l=line.left.x;
        else
        {
        p1=house.left;
        p2=surplus[i-1].right;
        l=find(p1,p2,p3,p4);
        }
        if (i==n+1) r=line.right.x;
        else
        {
        p1=house.right;
        p2=surplus[i].left;
        r=find(p1,p2,p3,p4);
        }
        l=max(l,line.left.x);
        r=min(r,line.right.x);
        l=max(l,lmx);
        lmx=max(lmx,l);
        ans=max(ans,r-l);
    }
    if (ans<=0) printf("No View\n");
    else printf("%.2f\n",ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/mrha/p/8168539.html

时间: 2024-10-29 21:30:44

[poj] 2074 Line of Sight || 直线相交求交点的相关文章

简单几何(WA中) POJ 2074 Line of Sight

题目传送门 题意: 分析: /************************************************ * Author :Running_Time * Created Time :2015/11/2 星期一 20:33:38 * File Name :POJ_2074.cpp ************************************************/ #include <cstdio> #include <algorithm> #i

POJ 2074 Line of Sight 计算几何

题意: 给出房子,障碍物,观光线(都为平行于x轴的线段).问在观光线上能看到整个房子的最长距离 分析: 将房屋的端点与障碍物的端点连线,求出与观光线的横坐标.这些坐标会把观光线分成多个区间,然后枚举每一个区间的中点,来判断这个区间是否能看到整个房子 要注意的是:不一定每个障碍物都在房屋与观光线之间,与房屋或观光线在同一条直线的可以忽略掉 如果你用的G++,double输出格式为%f #include <iostream> #include <cstdio> #include <

poj2074Line of Sight(直线相交)

链接 几何细节题. 对于每一个障碍物可以求出它在地产线上的覆盖区间,如下图. 紫色部分即为每个障碍物所覆盖掉的区间,求出所有的,扫描一遍即可. 几个需要注意的地方:直线可能与地产线没有交点,可视区间可能包含地产线的端点,扫描的时候保留当前扫到的最大值. 代码中的数据很经典,供参考. 1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #inc

POJ 1269 Intersecting Lines(判断直线相交)

题目地址:POJ 1269 直接套模板就可以了...实在不想自己写模板了...写的又臭又长....不过这题需要注意的是要先判断是否有直线垂直X轴的情况. 代码如下: #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdlib.h> #include <math.h> #include <ctype.h>

[poj] 1066 Treasure Hunt || 判断直线相交

原题 在金字塔内有一个宝藏p(x,y),现在要取出这个宝藏. 在金字塔内有许多墙,为了进入宝藏所在的房间必须把墙炸开,但是炸墙只能炸每个房间墙的中点. 求将宝藏运出城堡所需要的最小炸墙数. 判断点和直线相交. 枚举每道墙的两个端点和p的连线这条线段和墙的交点的次数最小值即为需要炸墙的最小次数. [注意当墙数为零时输出1:] #include<cstdio> #include<algorithm> #define N 33 using namespace std; int ans=0

两线段相交求交点

算法一 #include #include #include struct POINT { int x; int y; }; bool IsLineSegmentCross(POINT pFirst1, POINT pFirst2, POINT pSecond1, POINT pSecond2) { //每个线段的两点都在另一个线段的左右不同侧,则能断定线段相交 //公式对于向量(x1,y1)->(x2,y2),判断点(x3,y3)在向量的左边,右边,还是线上. //p=x1(y3-y2)+x2

POJ 3304 segments 线段和直线相交

Segments Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14178   Accepted: 4521 Description Given n segments in the two dimensional space, write a program, which determines if there exists a line such that after projecting these segments

【POJ 1269】判断两直线相交

题 利用叉积解方程 #include <cstdio> #define MAX 1<<31 #define dd double int xmult(dd x1,dd y1,dd x2,dd y2,dd x,dd y){ return (x1-x)*(y2-y)-(x2-x)*(y1-y); } int main(){ int n; dd x1,y1,x2,y2,x3,y3,x4,y4; scanf("%d",&n); puts("INTERSE

链表相交问题:判断两个链表是否相交,若相交求交点

默认为不带环链表,若带环则延伸为判断链表是否带环,若带环,求入口点 看看两个链表相交到底是怎么回事吧,有这样的的几个事实:(假设链表中不存在环) (1)一旦两个链表相交,那么两个链表中的节点一定有相同地址. (2)一旦两个链表相交,那么两个链表从相交节点开始到尾节点一定都是相同的节点. #include<iostream> #include<assert.h> using namespace std; template<class T> struct LinkNode