Intersection
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 12822   Accepted: 3347

Description

You are to write a program that has to decide whether a given line segment intersects a given rectangle.

An example: 
line: start point: (4,9) 
end point: (11,2) 
rectangle: left-top: (1,5) 
right-bottom: (7,1)

 
Figure 1: Line segment does not intersect rectangle

The line is said to intersect the rectangle if the line and the rectangle have at least one point in common. The rectangle consists of four straight lines and the area in between. Although all input values are integer numbers, valid intersection points do not have to lay on the integer grid.

Input

The input consists of n test cases. The first line of the input file contains the number n. Each following line contains one test case of the format: 
xstart ystart xend yend xleft ytop xright ybottom

where (xstart, ystart) is the start and (xend, yend) the end point of the line and (xleft, ytop) the top left and (xright, ybottom) the bottom right corner of the rectangle. The eight numbers are separated by a blank. The terms top left and bottom right do not imply any ordering of coordinates.

Output

For each test case in the input file, the output file should contain a line consisting either of the letter "T" if the line segment intersects the rectangle or the letter "F" if the line segment does not intersect the rectangle.

Sample Input

1
4 9 11 2 1 5 7 1

Sample Output

F

解题思路:

题意很清楚,就是判断一个线段是否和矩形相交。而所谓“相交”,但是这个相交的定义是线段在矩形内或者线段与矩形的边相交。

判断方法:

判断线段的两端点是否在矩形内,若是,则线段在矩形内。

判断线段是否与矩形相交,即是否和矩形的四条边中的任意一条边相交(规范相交和不规范相交都算)。

其实这是一个很好的模板题,注意处理下就可以了!

ACcode:

#include<iostream>
#include<stdio.h>
#include<string>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#define PI 3.1415926
#define MOD 10000000007
#define N 1000005
#define INF 0x7fffffff
using namespace std;
typedef long long LL;
const double eps=1e-;
//点
struct point
{
double x,y;
};
//线段
struct line
{
point p1,p2;
} l;
//面
struct poly
{
int n;//几个面
double area;
point plist[];
} rec;
//点乘
double dotdel(double x1,double y1,double x2,double y2)
{
return x1*x2+y1*y2;
}
//叉乘
double crossmul(double x1,double y1,double x2,double y2)
{
return x1*y2-x2*y1;
}
//判断是否为0,达到一定精度即认为成立
int cmpzero(double d)
{
return (fabs(d)<eps)?:(d>?:-);
}
//右手螺旋定则,1:a在cd右侧,-1:a在cd左侧,0:三点共线
int cross(point a,point c,point d)
{
return cmpzero(crossmul(a.x-c.x,a.y-c.y,d.x-c.x,d.y-c.y));
}
//在cross(a,c,d)==0的基础上,可判断点a是否在cd内部
int between(point a,point c,point d)
{
return cmpzero(dotdel(c.x-a.x,c.y-a.y,d.x-a.x,d.y-a.y))!=;
}
//两线段相交情况:0:不相交,1:规范相交,2:不规范相交(交于端点或重合)
int seg_intersect(point a,point b,point c,point d)
{
int a_cd=cross(a,c,d);
if(a_cd== && between(a,c,d))
return ;
int b_cd=cross(b,c,d);
if(a_cd== && between(a,c,d))
return ;
int c_ab = cross(c, a, b);
if (c_ab == && between(c, a, b))
return ;
int d_ab=cross(d,a,b);
if(d_ab== && between(d,a,b))
return ;
if((a_cd^b_cd)==- && (c_ab^d_ab)==-)
return ;
return ;
}
//使用有向面积法判断点是否在多边形内
bool point_in_poly(point p)
{
double s=0.0;
for(int i=; i<rec.n; i++)
s+=fabs(crossmul(rec.plist[i].x-p.x,rec.plist[i].y-p.y,rec.plist[(i+)%rec.n].x-p.x,
rec.plist[(i+)%rec.n].y-p.y));
if(cmpzero(s-rec.area)==) return true;
else return false;
}
//判断线段是否与多边形相交
bool rec_seg_intersect()
{
if(point_in_poly(l.p1) && point_in_poly(l.p2))
return ;
else if(seg_intersect(l.p1,l.p2,rec.plist[],rec.plist[])
|| seg_intersect(l.p1,l.p2,rec.plist[],rec.plist[])
|| seg_intersect(l.p1,l.p2,rec.plist[],rec.plist[])
|| seg_intersect(l.p1,l.p2,rec.plist[],rec.plist[]))
return ;
return ;
}
//计算多边形面积
void getarea()
{
double s=rec.plist[].y*(rec.plist[rec.n-].x-rec.plist[].x);
for(int i=; i<rec.n; i++)
s+=rec.plist[i].y*(rec.plist[i-].x-rec.plist[(i+)%rec.n].x);
rec.area=s;
}
int main()
{
int T;
double x1,y1,x2,y2,t;
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf%lf%lf",&l.p1.x,&l.p1.y,&l.p2.x,&l.p2.y);
scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
if(x1>x2)
{
t=x1;
x1=x2;
x2=t;
}
if(y2>y1)
{
t=y1;
y1=y2;
y2=t;
}
rec.n=;
rec.plist[].x=x1;
rec.plist[].y=y1;
rec.plist[].x=x1;
rec.plist[].y=y2;
rec.plist[].x=x2;
rec.plist[].y=y2;
rec.plist[].x=x2;
rec.plist[].y=y1;
getarea();
puts(rec_seg_intersect()?"T":"F");
}
return ;
}

[POJ 1410] Intersection(线段与矩形交)的更多相关文章

  1. poj 1410 Intersection 线段相交

    题目链接 题意 判断线段和矩形是否有交点(矩形的范围是四条边及内部). 思路 判断线段和矩形的四条边有无交点 && 线段是否在矩形内. 注意第二个条件. Code #include & ...

  2. POJ 1410 判断线段与矩形交点或在矩形内

    这个题目要注意的是:给出的矩形坐标不一定是按照左上,右下这个顺序的 #include <iostream> #include <cstdio> #include <cst ...

  3. POJ 1410 Intersection(判断线段交和点在矩形内)

    Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9996   Accepted: 2632 Desc ...

  4. POJ 1410 Intersection(线段相交&amp;&amp;推断点在矩形内&amp;&amp;坑爹)

    Intersection 大意:给你一条线段,给你一个矩形,问是否相交. 相交:线段全然在矩形内部算相交:线段与矩形随意一条边不规范相交算相交. 思路:知道详细的相交规则之后题事实上是不难的,可是还有 ...

  5. poj 1410 Intersection (判断线段与矩形相交 判线段相交)

    题目链接 Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12040   Accepted: 312 ...

  6. POJ 1410 Intersection (计算几何)

    题目链接:POJ 1410 Description You are to write a program that has to decide whether a given line segment ...

  7. POJ 1410--Intersection(判断线段和矩形相交)

    Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16322   Accepted: 4213 Des ...

  8. POJ 1410 Intersection (线段和矩形相交)

    题目: Description You are to write a program that has to decide whether a given line segment intersect ...

  9. POJ 1410 Intersection --几何,线段相交

    题意: 给一条线段,和一个矩形,问线段是否与矩形相交或在矩形内. 解法: 判断是否在矩形内,如果不在,判断与四条边是否相交即可.这题让我发现自己的线段相交函数有错误的地方,原来我写的线段相交函数就是单 ...

随机推荐

  1. 201521123027 <java程序设计>第13周学习总结

    1.本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2.书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.e ...

  2. php环境和apache服务启动不的解决方法

    安装服务器,可能需要设置apache的端口号,用记事本打开httpd.conf  ctrl+F搜索80,在中间添加数字8 08 0,不解释 在sql中配置好了服务器 服务器安装路径中的WWW文件作为服 ...

  3. Spring - lookup-method方式实现依赖注入

    引言 假设一个单例模式的bean A需要引用另外一个非单例模式的bean B,为了在我们每次引用的时候都能拿到最新的bean B,我们可以让bean A通过实现ApplicationContextWa ...

  4. session get和load方法对比

    get测试代码如下: public class Test { public static void main(String[] args) { // TODO Auto-generated metho ...

  5. gephi安装后无法打开

    具体解决的方法是找到gephi.conf文件(在“gephi安装目录\etc”中)文件,添加下面的一行,指定jdkhome的路径. jdkhome="C:\Program Files (x8 ...

  6. idea导出war包

    使用idea一个月了还没有用到导出war,今天突然需要我来部署测试war包,想使用myeclipse的,转念一想太掉价了 废话少说,直接上菜 如果你没有第一步操作我建议你配置一下你的idea 当然还有 ...

  7. firefly rk3288 内核模块编译

    在驱动开发的过程中,常常需要对代码进行返回的调试,如果返回的编译再烧写内核,势必会浪费开发人员大量的时间和心力,加班加点那是时常的事.为此linux提供了编译内核模块的方式,无需返回烧写内核,只需in ...

  8. express 安装和运行

    1.npm install -g express-generator 2.进入服务目录(自己定义的文件夹,或者express Myapp && cd Myapp 新建Myapp文件夹并 ...

  9. HDFS概述(5)————HDFS HA

    HA With QJM 目标 本指南概述了HDFS高可用性(HA)功能以及如何使用Quorum Journal Manager(QJM)功能配置和管理HA HDFS集群. 本文档假设读者对HDFS集群 ...

  10. ObjectSNMP

    下面的例子,就是使用ObjectSNMP获取RFC1213-MIB的例子:其中的system和ifTable对象就是对应的SNMPMIB中的system组合interface中的ifTable表. p ...