判线段和矩形交+神坑——poj1410

摘要:
坑点:1.要重新组织一下左上右下的坐标2.在矩形内也算相交#include#include#include#includeusingnamespacestd;typedefdoubledb;constdbeps=1e-6;constdbpi=acos(-1);intsign{ifreturn1;elseifreturn-1;return0;}intcmp{returnsign;}structpoint{dbx,y;point(){}point:x,y{}pointoperator+const{return{k1.x+x,k1.y+y};}pointoperator-const{return{x-k1.x,y-k1.y};}pointoperator*const{return{x*k1,y*k1};}pointoperator/const{return{x/k1,y/k1};}};dbcross{returnk1.x*k2.y-k1.y*k2.x;}intintersect{ifswap;ifswap;returncmp!

坑点:

1.要重新组织一下左上右下的坐标

2.在矩形内也算相交

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>
using namespacestd;

typedef doubledb;
const db eps=1e-6;
const db pi=acos(-1);
int sign(db k){if (k>eps) return 1; else if (k<-eps) return -1; return 0;}
int cmp(db k1,db k2){return sign(k1-k2);}

structpoint{
    db x,y;
    point(){}
    point(db x,db y):x(x),y(y){}
    point operator + (const point &k1) const{return (point){k1.x+x,k1.y+y};}
    point operator - (const point &k1) const{return (point){x-k1.x,y-k1.y};}
    point operator * (db k1) const{return (point){x*k1,y*k1};}
    point operator / (db k1) const{return (point){x/k1,y/k1};}
};
db cross(point k1,point k2){return k1.x*k2.y-k1.y*k2.x;}
intintersect(db l1,db r1,db l2,db r2){
    if (l1>r1) swap(l1,r1); if (l2>r2) swap(l2,r2); return cmp(r1,l2)!=-1&&cmp(r2,l1)!=-1;
}
intcheckSS(point k1,point k2,point k3,point k4){
    return intersect(k1.x,k2.x,k3.x,k4.x)&&intersect(k1.y,k2.y,k3.y,k4.y)&&sign(cross(k3-k1,k4-k1))*sign(cross(k3-k2,k4-k2))<=0&&sign(cross(k1-k3,k2-k3))*sign(cross(k1-k4,k2-k4))<=0;
}

point k1,k2,k3,k4,k5,k6;
intjudgein(point k){
    if(k.x<=k4.x&&k.x>=k3.x&&k.y<=k3.y&&k.y>=k4.y)return 1;
    return 0;
}

intmain(){
    int t;cin>>t;
    while(t--){
        scanf("%lf%lf",&k1.x,&k1.y);//start
        scanf("%lf%lf",&k2.x,&k2.y);//end
        scanf("%lf%lf",&k3.x,&k3.y);//left top
        scanf("%lf%lf",&k4.x,&k4.y);//right bottom
        if(k3.x>k4.x)swap(k3.x,k4.x);
        if(k3.y<k4.y)swap(k3.y,k4.y);
        k5.x=k3.x;k5.y=k4.y;        //left bottom
        k6.x=k4.x;k6.y=k3.y;        //right top
        if(checkSS(k1,k2,k3,k6) ||checkSS(k1,k2,k3,k5) ||checkSS(k1,k2,k4,k5) ||checkSS(k1,k2,k4,k6) )
            puts("T");
        else if(judgein(k1) || judgein(k2))puts("T");
        else puts("F");
    }
}

免责声明:文章转载自《判线段和矩形交+神坑——poj1410》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Vault数据库还原/恢复问题在点击run之后,没有显示任何设备,这一般是adb的问题,解决方法是重新启动adb下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux时间操作(time、gettimeofday)

http://blog.chinaunix.net/uid/24148050.html  http://blog.csdn.net/scottgly/article/details/6568513 一、time函数    #include <time.h> time_t time(time_t *calptr); 返回距计算机元年的秒...

线段树_模版

线段树 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN)。而未优化的空间复杂度为2N,实际应用时一般还要开4N的数组以免越界,因此有时需要离散化让空间压缩。 区间修改与求和 给出数的个数n以及操作数q:对于q:...

2019CCPC秦皇岛

D - Decimal 代码: #include <bits/stdc++.h> using namespace std; const int maxn=1e6; int main() { int n,t; scanf("%d",&t); while(t--) { scanf("%d",&...

【转】探寻C++最快的读取文件的方案(方法未论证)

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来...

ATM管理系统(C语言)

1. 作业信息 这个作业属于哪个课程 软件工程 这个作业要求在哪里 作业要求 学号 3180701312 2.题目 编写一个ATM管理系统,语言不限,要求应包括以下主要功能: (1)开户,销户 (2)查询账户余额 (3)存款 (4)取款 (5)转账(一个账户转到另一个账户)等... 3. 代码提交与运行截图 3.1 源代码 (1)头文件...

链表的建立

#include <stdio.h> #include <stdlib.h> #define null 0 typedef struct snode { char *name; char *no; int score[5]; }typedefdata; typedef struct node { typedefdata data;...