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;
}

时间: 2024-10-12 19:27:53

Poj_1410 Intersection -线段类的相关文章

Java知多少(99)Graphics2D类的绘图方法

Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供.坐标转换.颜色管理以及文字布局等更精确的控制. 绘图属性 Graphics2D定义了几种方法,用于添加或改变图形的状态属性.可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式:设定平移.旋转.缩放或修剪变换图形:以及设定填充图形的颜色和图案等.图形状态属性用特定的对象存储. 1. stroke属性stroke属性控制线条的宽度.笔形

java学习笔记7--抽象类与抽象方法

1.终结类与终结方法 被final修饰符修饰的类和方法,终结类不能被继承,终结方法不能被当前类的子类重写 终结类的特点:不能有派生类 终结类存在的理由: 安全: 黑客用来搅乱系统的一个手法是建立一个类的派生类,然后用他们的类代替原来的类 设计: 你认为你的类是最好的或从概念上你的类不应该有任何派生类 终结方法的特点:不能被派生类覆盖 终结方法存在的理由: 对于一些比较重要且不希望子类进行更改的方法,可以声明为终结方法.可防止子类对父类关键方法的错误重写,增加了代码的安全性和正确性 提高运行效率.

python 类 练习

#encoding=utf-8from __future__ import divisionimport time# 13-5. 几何. 创建一个由有序数值对(x, y) 组成的 Point 类,它代表某个点的 X 坐标和 Y 坐# 标.X 坐标和 Y 坐标在实例化时被传递给构造器,如果没有给出它们的值,则默认为坐标的原点.class Point(object): def __init__(self,x = 0,y = 0): self.PointX = x self.PointY = y pr

浅谈类的组合

4. 类的组合 4.1 定义 类中的成员数据是另一个类的对象 4.2 类组合的构造函数设计原则 不仅要负责对本类中基本类型成员数据初始化,也要对对象成员初始化. 4.3 声明形式 类名::类名(对象成员所需的形参,本类成员形参):对象1(参数),对象2(参数),....... {  // 函数体其他语句 } 4.4 例子:类的组合,线段类. #include<iostream> #include<cmath> Using namespace std; Class Point{ Pu

Java中的Graphics2D类基本使用教程

Java语言在Graphics类提供绘制各种基本的几何图形的基础上,扩展Graphics类提供一个Graphics2D类,它拥用更强大的二维图形处理能力,提供.坐标转换.颜色管理以及文字布局等更精确的控制.绘图属性 Graphics2D定义了几种方法,用于添加或改变图形的状态属性.可以通过设定和修改状态属性,指定画笔宽度和画笔的连接方式:设定平移.旋转.缩放或修剪变换图形:以及设定填充图形的颜色和图案等.图形状态属性用特定的对象存储. 1. stroke属性stroke属性控制线条的宽度.笔形样

游戏底层逻辑,运动&amp;&amp;寻路(四)

接着上次的来,我们在群体算法之前把基本的个体运动解决掉. 9.WallAvoidance避开墙壁 此处的墙被抽象为一条线段,不论你的游戏使用的是一条线段作为墙面的碰撞检测,或者用一个几何形状作为墙面,几何形状我们可以看作多条线段的集合,都可以用此方法. 墙类的实现 首先是线段类,作为基类,拥有几种几何计算的方法,便于计算平面线段的交点,不多说. struct Seg { Seg(Point p1, Point p2): _from(p1), _to(p2) { } #define eps 1e-

计算几何导论

计算几何 计算几何是一门兴起于二十世纪七十年代末的计算机科学的一个分支,主要研究解决几何问题的算法.在现代工程和数学领域,计算几何在图形学.机器人技术.超大规模集成电路设计和统计等诸多领域有着十分重要的应用. 计算几何问题的输入一般是关于一组几何对象的描述,如一组点.一组线段,或者一个多边形的按逆时针顺序排列的一组顶点.输出常常是对有关这些对象的问题的回答,如是否直线相交,是否为一个新的几何对象,如顶点集合的凸包. 本文将介绍一些平面上的计算几何算法.在这些算法中,每个输入对象都是一组点{p1,

对象成员

--------------siwuxie095 对象成员 在对象中包含其它对象是一种非常普遍的现象 以坐标系中的线段为例:说明对象成员的定义和使用方法 如果要定义一个如上图所示的线段类,每条线段都由两个点连接而形成, 这意味着,需要定义一个表示点的类,该点类包含横坐标和纵坐标,而 线段类包含两个坐标对象 可见,要描述清楚这个数学问题,至少要定义两个类:一个定义坐标的 点,另一个定义点上的线段 坐标类:Coordinate 线段类:Line 定义完成后,通过实例化来描述一条线段: 当实例化 Li

十二,几何图形和图画

Path类是功能最强大的形状类,它能够包含任何简单形状.多级形状及更更复杂的曲线.Path.Data属性,该属性接受一个Geometry对象,该对象定义路径包含的一个或多个图形,Geometry是一个抽象类,指定Data时需要使用以下Geometry类的派生类: 路径和几何图形之间的区别:几何图形定义形状,而路径用于绘制形状,因此,Geometry对象为形状定义了坐标.尺寸等细节,而Path对象提供了绘制形状所使用的Stroke和Fill画刷,Path类还继承自UIElement基础架构中的特性