poj1410
2011-08-12 19:56
120 查看
计算几何
题意:问线段与矩形(边与坐标轴平行)是否相交
分析:分别判断4条边与线段是否相交,在判断线段两端点是否在矩形内。
View Code
题意:问线段与矩形(边与坐标轴平行)是否相交
分析:分别判断4条边与线段是否相交,在判断线段两端点是否在矩形内。
View Code
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; #define eps 1E-10 struct Point { int x, y; } point[5], s, e; bool in(Point &a) { if (a.x <= point[2].x && a.x >= point[0].x && a.y <= point[2].y && a.y >= point[0].y) return true; return false; } bool inter(Point &a, Point &b, Point &c, Point &d) { if (min(a.x, b.x) > max(c.x, d.x) || min(a.y, b.y) > max(c.y, d.y) || min( c.x, d.x) > max(a.x, b.x) || min(c.y, d.y) > max(a.y, b.y)) return 0; double h, i, j, k; h = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x); i = (b.x - a.x) * (d.y - a.y) - (b.y - a.y) * (d.x - a.x); j = (d.x - c.x) * (a.y - c.y) - (d.y - c.y) * (a.x - c.x); k = (d.x - c.x) * (b.y - c.y) - (d.y - c.y) * (b.x - c.x); return h * i <= eps && j * k <= eps; } int main() { //freopen("t.txt", "r", stdin); int t; scanf("%d", &t); while (t--) { scanf("%d%d%d%d%d%d%d%d", &s.x, &s.y, &e.x, &e.y, &point[0].x, &point[0].y, &point[2].x, &point[2].y); if (point[0].x > point[2].x) swap(point[0].x, point[2].x); if (point[0].y > point[2].y) swap(point[0].y, point[2].y); point[1].x = point[0].x; point[1].y = point[2].y; point[3].x = point[2].x; point[3].y = point[0].y; point[4] = point[0]; bool ok = false; for (int i = 0; i < 4; i++) if (inter(point[i], point[i + 1], s, e)) { ok = true; break; } if (in(s) || in(e)) ok = true; if (ok) printf("T\n"); else printf("F\n"); } return 0; }
相关文章推荐
- hdu 2067 小兔的棋盘
- Mandriva基础知识之三:SSH的配置
- QQ靓号申请器v1.2.0.0【源码】
- C#调用笔记本摄像头当镜子用
- Linux系统调用
- Android之SharedPreferences对参数数据的存取
- Linux系统上的SSH密钥认证、ssh-agent认证
- Xshell通过SSH密钥、SSH代理连接Linux服务器详解
- rhel6SSH安全加固
- 对面向对象的一些思考
- C++ 虚函数表解析
- Java实训笔记(四)
- 嵌入式Linux之我行——RamDisk块设备驱动实例开发讲解
- 生存之根本
- Spring系列(3/1)---交互的一种尝试
- NGCC系统割接轨迹
- usaco humble Numbers
- 多线程基本概念解析
- Linux内核升级步骤及问题解决方法
- 3560 Graph’s Cycle Component