[POJ 1410] Intersection(线段与矩形交)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 12822 | Accepted: 3347 |
Description
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
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
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(线段与矩形交)的更多相关文章
- poj 1410 Intersection 线段相交
题目链接 题意 判断线段和矩形是否有交点(矩形的范围是四条边及内部). 思路 判断线段和矩形的四条边有无交点 && 线段是否在矩形内. 注意第二个条件. Code #include & ...
- POJ 1410 判断线段与矩形交点或在矩形内
这个题目要注意的是:给出的矩形坐标不一定是按照左上,右下这个顺序的 #include <iostream> #include <cstdio> #include <cst ...
- POJ 1410 Intersection(判断线段交和点在矩形内)
Intersection Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9996 Accepted: 2632 Desc ...
- POJ 1410 Intersection(线段相交&&推断点在矩形内&&坑爹)
Intersection 大意:给你一条线段,给你一个矩形,问是否相交. 相交:线段全然在矩形内部算相交:线段与矩形随意一条边不规范相交算相交. 思路:知道详细的相交规则之后题事实上是不难的,可是还有 ...
- poj 1410 Intersection (判断线段与矩形相交 判线段相交)
题目链接 Intersection Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12040 Accepted: 312 ...
- POJ 1410 Intersection (计算几何)
题目链接:POJ 1410 Description You are to write a program that has to decide whether a given line segment ...
- POJ 1410--Intersection(判断线段和矩形相交)
Intersection Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16322 Accepted: 4213 Des ...
- POJ 1410 Intersection (线段和矩形相交)
题目: Description You are to write a program that has to decide whether a given line segment intersect ...
- POJ 1410 Intersection --几何,线段相交
题意: 给一条线段,和一个矩形,问线段是否与矩形相交或在矩形内. 解法: 判断是否在矩形内,如果不在,判断与四条边是否相交即可.这题让我发现自己的线段相交函数有错误的地方,原来我写的线段相交函数就是单 ...
随机推荐
- DAOFactory复用代码
工厂设计模式 public class DaoFactory { private static final DaoFactory factory = new DaoFactory(); private ...
- 深入理解计算机系统chapter3
栈在处理过程调用中起到至关重要的作用,栈向下增长,栈顶元素的地址是所有栈中元素最小的.栈指针%esp保存着栈顶元素的地址 控制: 重点: 基于条件数据传送的代码比基于条件控制转移(预测错误惩罚比较高) ...
- JAVA设计模式总结之23种设计模式
上一篇总结了设计模式的六大原则<JAVA设计模式总结之六大设计原则>,这一篇,正式进入到介绍23种设计模式的归纳总结. 一.什么是设计模式 ...
- 第6章 Overlapped I/O, 在你身后变戏法 ---1
这一章描述如何使用 overlapped I/O(也就是 asynchronous I/O).某些时候 overlapped I/O 可以取代多线程的功用.然而,overlapped I/O 加上co ...
- 混合高斯模型(Mixtures of Gaussians)和EM算法
这篇讨论使用期望最大化算法(Expectation-Maximization)来进行密度估计(density estimation). 与k-means一样,给定的训练样本是,我们将隐含类别标签用表示 ...
- struts2中的Ajax异步校验
登录时验证码的异步校验: 1.验证码生成的是图片因此在struts.xml文件里面配置action 时,result标签中type 属性是stream 2.验证码图片的src的值为配置action名字 ...
- java基础(Fundamental)
第一节 java开发环境 1.Linux操作系统 1)开源的操作系统.免费,主要作为服务器操作系统, 而Java主要是服务器端开发,所以部署环境都是Linux 2)Linux与Windows目录结构的 ...
- PE文件格式详解,第二讲,NT头文件格式,以及文件头格式
PE文件格式详解,第二讲,NT头文件格式,以及文件头格式 作者:IBinary出处:http://www.cnblogs.com/iBinary/版权所有,欢迎保留原文链接进行转载:) PS:本篇博客 ...
- vue2购物车ch2-(商品列表显示)
1 index.html <!DOCTYPE html><html lang="en"><head> <meta charset=&quo ...
- Oracle 之——子查询 DDL DML 集合 及其他数据对象
Oracle 学习笔记(二) 知识概要: 1.子查询 2.集合操作 3.DML语句操作 4.其他数据库对象 1.子查询 查询工资比SCOTT高的员工信息 1 select * 2 from emp ...