POJ 1410--Intersection(判断线段和矩形相交)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 16322 | Accepted: 4213 |
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
Source
- 题目的判断是否一条线段和矩形相交,可以想到直接判断给定线段是否和矩形的四条边相交即可,但是有一个问题,题目定义的矩形"The rectangle consists of four straight lines and the area in between",包括了其中的面积,就因为这个wa了几发Orz,我的等级还是不够啊。
- 最后只要判断给定线段是否和矩形的四条边相交,以及线段是否在矩形内,线段是否在矩形内部可以用线段的端点是否在矩形内部来判断。
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int n;
double xs, ys, xe, ye, xl, yl, xr, yr;
const double eps = 1.0e8;
typedef struct point {
double x;
double y;
point(double a, double b) {
x = a;
y = b;
}
point() { }
}point;
typedef struct edge {
point start;
point end;
edge(point a, point b) {
start = a;
end = b;
}
edge() { }
edge(edge &t) {
start = t.start;
end = t.end;
}
}edge;
point t[];
edge line;
edge rec[]; inline double dabs(double a) { return a < ? -a : a; }
inline double max(double a, double b) { return a > b ? a : b; }
inline double min(double a, double b) { return a < b ? a : b; }
double multi(point p1, point p2, point p0) {
return (p2.y - p0.y)*(p1.x - p0.x) - (p2.x - p0.x)*(p1.y - p0.y);
}
bool Across(edge v1, edge v2) {
if (max(v1.start.x, v1.end.x) >= min(v2.start.x, v2.end.x) &&
max(v1.start.y, v1.end.y) >= min(v2.start.y, v2.end.y) &&
max(v2.start.x, v2.end.x) >= min(v1.start.x, v1.end.x) &&
max(v2.start.y, v2.end.y) >= min(v1.start.y, v1.end.y) &&
multi(v2.start, v1.end, v1.start)*multi(v1.end, v2.end, v2.start) >= &&
multi(v1.start, v2.end, v2.start)*multi(v2.end, v1.end, v1.start) >=
)
return true;
return false;
}
int main(void) {
while (cin >> n) {
while (n-- > ) {
int flag = ;
cin >> xs >> ys >> xe >> ye >> xl >> yl >> xr >> yr;
line = edge(point(xs, ys), point(xe, ye));
t[] = point(xl, yl), t[] = point(xr, yl);
t[] = point(xr, yr), t[] = point(xl, yr);
for (int i = ; i < ; i++) {
rec[i] = edge(t[i], t[(i + )%]);
}
for (int i = ; i < ; i++) {
if (Across(line, rec[i]))
{
flag = ;
break;
}
}
if(line.start.x>=min(xl,xr)&&line.start.x<=max(xr,xl)&&line.start.y>=min(yl,yr)&&line.start.y<=max(yl,yr) ||
line.end.x >= min(xl, xr) && line.end.x <= max(xr, xl) && line.end.y >= min(yl, yr) && line.end.y <= max(yl, yr))
flag = ;//判断是否点在矩形内部
if (flag == )
cout << "T" << endl;
else
cout << "F" << endl;
}
}
return ;
}
POJ 1410--Intersection(判断线段和矩形相交)的更多相关文章
- poj 1410 Intersection (判断线段与矩形相交 判线段相交)
题目链接 Intersection Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12040 Accepted: 312 ...
- POJ 1410 Intersection (线段和矩形相交)
题目: Description You are to write a program that has to decide whether a given line segment intersect ...
- [POJ 1410] Intersection(线段与矩形交)
题目链接:http://poj.org/problem?id=1410 Intersection Time Limit: 1000MS Memory Limit: 10000K Total Sub ...
- POJ 1410 Intersection(线段相交&&推断点在矩形内&&坑爹)
Intersection 大意:给你一条线段,给你一个矩形,问是否相交. 相交:线段全然在矩形内部算相交:线段与矩形随意一条边不规范相交算相交. 思路:知道详细的相交规则之后题事实上是不难的,可是还有 ...
- 线段和矩形相交 POJ 1410
// 线段和矩形相交 POJ 1410 // #include <bits/stdc++.h> #include <iostream> #include <cstdio& ...
- poj 1410 Intersection 线段相交
题目链接 题意 判断线段和矩形是否有交点(矩形的范围是四条边及内部). 思路 判断线段和矩形的四条边有无交点 && 线段是否在矩形内. 注意第二个条件. Code #include & ...
- 判断线段和直线相交 POJ 3304
// 判断线段和直线相交 POJ 3304 // 思路: // 如果存在一条直线和所有线段相交,那么平移该直线一定可以经过线段上任意两个点,并且和所有线段相交. #include <cstdio ...
- poj1410(判断线段和矩形是否相交)
题目链接:https://vjudge.net/problem/POJ-1410 题意:判断线段和矩形是否相交. 思路:注意这里的相交包括线段在矩形内,因此先判断线段与矩形的边是否相交,再判断线段的两 ...
- Intersection--poj1410(判断线段与矩形的关系)
http://poj.org/problem?id=1410 题目大意:给你一个线段和矩形的对角两点 如果相交就输出'T' 不想交就是'F' 注意: 1,给的矩形有可能不是左上 右下 所以要先判 ...
随机推荐
- springboot从入门到精通(二)
这一节我们一起用springboot开发一个应用程序,应用程序里的核心概念是玩家获取英雄列表上的英雄信息. 1.定义实体模型: 代码如下: package com.dota.herolist.enti ...
- csharp: DataTable结构相同的比较
) ) * pageSize; ; i++) { DataRow newdr = newdt.NewRow(); DataRow dr = dt.Rows[i]; foreach (Dat ...
- sql: 生日赠品中的相关算法
---2013年10月9日生日,就以2012年9月1日至2013年8月31日計算 (因為係生日月份前兩個月之最後一天為結算日) DECLARE @birthday datetime,@now date ...
- mysql二:库操作
一.系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等 performance_schema: My ...
- css 平行四边
在视觉设计中,平行四边形往往给人一种动感. 要生成一个平行四边形,只要通过css变形,就可做到: -webkit-transform: skewX(-45deg); 那么生成一个平行四边形的按钮呢?列 ...
- B树索引学习
https://blog.csdn.net/wl044090432/article/details/53423333
- Spring Freamwork 开发初体验
工具 eclipse 版本:Neon.3 Release (4.6.3) Spring Freamwork 版本:4.0.4.RELEASE 下载地址:http://repo.springsource ...
- ASP.NET中引用dll“找不到指定模块"的完美解决办法 z
DllImport是System.Runtime.InteropServices命名空间下的一个属性类,其功能是提供从非托管DLL导出的函数的必要调用信息.DllImport属性应用于方法,要求最少要 ...
- vue-cli run dev 和 run build 出现的问题(运行项目、打包项目)
前些天做项目,过程中遇到了一个比较奇怪的问题:npm run dev 和 npm run build 的时候,出现了错误,导致项目无法启动.打包无法成功.报了一堆错误: 错误展示: 找了一下解决方案, ...
- day1 python 介绍、基本语法、流程控制
请查看我的云笔记链接: http://note.youdao.com/noteshare?id=0ea7425d3e3669800cb0d73f7ec8865d&sub=D87B4BF820C ...