[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 --几何,线段相交
题意: 给一条线段,和一个矩形,问线段是否与矩形相交或在矩形内. 解法: 判断是否在矩形内,如果不在,判断与四条边是否相交即可.这题让我发现自己的线段相交函数有错误的地方,原来我写的线段相交函数就是单 ...
随机推荐
- 201521123023《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...
- 201521123019 《Java程序设计》第9周学习总结
1. 本章学习总结 2. 书面作业 一.题目5-1.常用异常 1.1 截图你的提交结果(出现学号) 1.2 自己以前编写的代码中经常出现什么异常.需要捕获吗(为什么)?应如何避免? 答:经常会出现Ar ...
- 201521123026《JAVA程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- java System.currentTimeMillis()毫秒值和具体日期值互相转换
System.currentTimeMillis()与日期 间是可以相互转换的,通过 SimpleDateFormat dateformat = new SimpleDateFormat(" ...
- Eclipse rap 富客户端开发总结(8) : 发布到tomcat后解决rap编码和字符集的问题
1 .解决 rap 字符集乱码的问题 字符集问题,解决办法: 在plugin.xml - build.properties 中添加 javacDefaultEncoding.. = UTF-8 ...
- 使用 Python & Flask 实现 RESTful Web API
环境安装: sudo pip install flask Flask 是一个Python的微服务的框架,基于Werkzeug, 一个 WSGI 类库. Flask 优点: Written in Pyt ...
- mysql 1093错误
1093错误:修改一个表的时候子查询不能是同一个表 解决办法:把子查询再套一层,变成原来表的孙子查询就可以了 例如: INSERT INTO gg SET id3=(SELECT c.a+1 FROM ...
- 一款简单而不失强大的前端框架——【Vue.js的详细入门教程①】
↓— Vue.js框架魅力 —↓ 前言 Vue.js 是一个构建数据驱动的 web 界面的渐进式框架.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件.V ...
- openEntityForm时候如何给关于(regardingobjectid)类型查找字段赋值?
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复264或者20170924可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- 翻译 | 玩转 React 表单 —— 受控组件详解
原文地址:React.js Forms: Controlled Components 原文作者:Loren Stewart 译者:小 B0Y 校对者:珂珂君 本文涵盖以下受控组件: 文本输入框 数字输 ...