Poj_1410 Intersection -线段类

题意:直线是否与矩形(多边形)相交。

坑点:1、给定的矩形的点只是对角线的点,并没有规定是哪一对。

        2、矩形:不仅仅与四边相交,里面的面积也算。

        3、我竟然把输出搞错,wa无数次。

/************************************************
Author        :DarkTong
Created Time  :2016/8/12 15:09:58
File Name     :1_modify.cpp
*************************************************/

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>

#define INF 0x3f3f3f3f
#define esp 1e-9
typedef long long LL;
using namespace std;

typedef long long db;
const double eps = 1e-8;
const double pi = acos(-1.0);
/***************************************************************\
 *二维点基本运算
\***************************************************************/
int dcmp(db x){ if(x==0) return 0; else return x>0?1:-1; }
inline db sqr(db x){ return x*x;}

struct Point
{
    db x, y;
    Point(db x=0, db y=0):x(x), y(y){}
    //输入
    void Inputs(){ scanf("%lld%lld", &x, &y);}
    //向量运算
    friend Point operator+(const Point &a, const Point &b)
    {
        return Point(a.x+b.x, a.y+b.y);
    }
    friend Point operator-(const Point &a, const Point &b)
    {
        return Point(a.x-b.x, a.y-b.y);
    }
    friend Point operator*(const db &b, const Point &a)
    {
        return Point(a.x*b, a.y*b);
    }
    friend Point operator*(const Point &a, const db &b)
    {
        return Point(a.x*b, a.y*b);
    }
    friend Point operator/(const Point &a, const db &b)
    {
        return Point(a.x/b, a.y/b);
    }
    //逻辑运算
    friend bool operator==(const Point &a, const Point &b)
    {
        return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
    }
    const bool operator < (const Point &a) const
    {
        if(dcmp(x-a.x)) return y<a.y;
        else return x<a.x;
    }
};
//点积&叉积
db det(const Point &a, const Point &b){ return a.x*b.y - a.y*b.x;}    //意义:判平行,得平行四边形面积
db dot(const Point &a, const Point &b){ return a.x*b.x + a.y*b.y;}
struct Line
{
    Point a, b;
    Line(){}
    Line(Point a, Point b):a(a), b(b){}
};
//点是否在线段上(包括端点)
bool PointOnSegment(Point p, Point s, Point t)
{
    return dcmp(det(p-s, t-s))==0&&dcmp(dot(p-s, p-t))<=0;
}
//判平行,不判共线
bool parallel(Line a, Line b)
{
    return !dcmp(det(a.a-a.b, b.a-b.b));
}
/*************************************************************/
Point a, b, dl, ul, dr, ur;
bool isok(Line s, Line t)
{
    if(PointOnSegment(t.a, s.a, s.b)) return true;
    if(PointOnSegment(t.b, s.a, s.b)) return true;
    if(parallel(s, t)) return false;
    if(det(s.b-s.a, t.a-s.a)*det(s.b-s.a, t.b-s.a)<0
        &&det(t.b-t.a, s.a-t.a)*det(t.b-t.a, s.b-t.a)<0) return true;
//    cout<<"tax:"<<t.a.x<<" tay:"<<t.a.y<<"tb.x:"<<t.b.x<<" tby:"<<t.b.y<<" sax:"<<s.a.x<<" say:"<<s.a.y<<" sbx:"<<s.b.x<<" sby:"<<s.b.y<<endl;
//    cout<<"t"<<endl;
    return false;
}
bool solve()
{
    if(dl.x<=a.x&&a.x<=ur.x&&dl.y<=a.y&&a.y<=ur.y) return true;
    if(dl.x<=b.x&&b.x<=ur.x&&dl.y<=b.y&&b.y<=ur.y) return true;
    if(isok(Line(a, b),Line(ul, ur))) return true;
    if(isok(Line(a, b),Line(ur, dr))) return true;
    if(isok(Line(a, b),Line(dr, dl))) return true;
    if(isok(Line(a, b),Line(dl, ul))) return true;
    return false;
}

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    LL x1, y1, x2, y2;
    int T;
    scanf("%d", &T);
    while(T--)
    {
        a.Inputs();
        b.Inputs();
        cin>>x1>>y1>>x2>>y2;
        dl = Point(min(x1, x2), min(y1, y2));
        ul = Point(min(x1, x2), max(y1, y2));
        dr = Point(max(x1, x2), min(y1, y2));
        ur = Point(max(x1, x2), max(y1, y2));
        printf("%s\n", solve()?"T":"F");
    }
    return 0;
}

转载于:https://www.cnblogs.com/DarkTong/p/5767489.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值