题目

Intersection

给出二维平面中一条线段和一个矩形,问线段和矩形是否有交点,矩形包括边和内部。

解题思路

先判断线段和四条边是否相交,如果没交点,再继续判断线段是否在矩形内。

判断线段相交需要使用快速排斥实验跨立实验

直接使用跨立实验会有问题,比如其中一条线段退化成一个点的情况,可以通过跨立实验,但是不能通过快速排斥实验:

代码

#include <iostream>
using namespace std;const int N = 1e5 + 5;typedef struct Point
{int x, y;Point operator-(const Point temp){Point T;T.x = x - temp.x;T.y = y - temp.y;return T;}bool operator==(const Point temp){if (x == temp.x && y == temp.y)return 1;return 0;}
} Vector;double cross(Vector A, Vector B)
{return A.x * B.y - B.x * A.y;
}const double eps = 0;int sign(double x)
{if (x < eps)return -1;else if (x > eps)return 1;return 0;
}
bool f(Point a1, Point a2, Point b1, Point b2)
{if (max(a1.x, a2.x) < min(b1.x, b2.x) ||max(a1.y, a2.y) < min(b1.y, b2.y) ||max(b1.x, b2.x) < min(a1.x, a2.x) ||max(b1.y, b2.y) < min(a1.y, a2.y))return 0; //先通过快速排斥实验double c1 = cross(a2 - a1, b1 - a1), c2 = cross(a2 - a1, b2 - a1);double c3 = cross(b2 - b1, a2 - b1), c4 = cross(b2 - b1, a1 - b1);return sign(c1) * sign(c2) <= 0 && sign(c3) * sign(c4) <= 0;
}
bool f2(Point X, Point A, Point B, Point C, Point D)
{if (cross(A - X, B - X) * cross(C - X, D - X) < eps)return 1;return 0;
}void solve()
{Point A, B, C, D, E, F;cin >> E.x >> E.y >> F.x >> F.y;cin >> A.x >> A.y >> D.x >> D.y;B.x = A.x, B.y = D.y;C.x = D.x, C.y = A.y;if (f(A, B, E, F) || f(B, D, E, F) || f(C, D, E, F) || f(A, C, E, F) ||(f2(E, A, B, C, D) && f2(E, A, C, B, D)) ||(f2(F, A, B, C, D) && f2(F, A, C, B, D)))printf("T\n");elseprintf("F\n");
}int main()
{int t;cin >> t;while (t--)solve();return 0;
}
/**/

参考资料

  1. 【计算几何】快速排斥实验和跨立实验

POJ1410线段相交、快速排斥实验、跨立实验相关推荐

  1. 判断两线段是否相交——快速排斥与跨立实验

    如何判断两条线段是否相交呢?如果是我们去解决这个问题,用眼睛很容易就看出来了,但是如果用计算机来解决这个问题,该怎么办呢?下面介绍两个方法,这两个方法结合起来就能完美解决这个问题了. 一.快速排斥 对 ...

  2. 计算几何 快速排斥和跨立实验 判断两线段相交

    线段P1P2, Q1Q2,判断其是否相交,通过快速排斥和跨立实验则说明相交 首先要知道:向量a×向量b(×为向量叉乘),若结果小于0,表示向量b在向量a的逆时针方向:若结果大于0,表示向量b在向量a的 ...

  3. 快速排斥、跨立实验判断线段是否相交

    写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...

  4. 计算几何_线段交点的快速排斥_跨立实验

    附上题的地址 https://vjudge.net/problem/HDU-1086# // 点是否在矩形 // 矩形点是 st 和 ed bool IsPointInRectangle(Point ...

  5. 【代码超详解】ZOJ 2551 / POJ 2653 Pick-up Sticks(快速排斥实验 + 跨立实验判断线段是否相交 · 模板)

    一.传送门 http://poj.org/problem?id=2653 https://zoj.pintia.cn/problem-sets/91827364500/problems/9182736 ...

  6. 判断两个线段相交问题(快速排斥实验跨立实验)

    代码实现: import numpy as np import cv2class Check_line():def __init__(self):passdef step_one(self, p1, ...

  7. 线段交叉判断(快速排斥实验 + 跨立实验)

    第1 步:快速排斥试验,如果分别以P1P2 ,P3P4 为对角线做矩形,而这两个矩形不相交,则这两条线段肯定不相交,如下左图:即使两个矩形相交,这两条线段也不一定相交,如下右图,这时再用第2 步判断: ...

  8. 线段相交(快速排斥和跨立)

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1264 本来想用斜率来算,后来觉得要分太多情况,上网发现用快速排斥+ ...

  9. 51nod 1264 线段相交(跨立实验)

    51nod1264:线段相交 判断线段相交: 关于快速排斥和跨立实验的博客:https://blog.csdn.net/li1615882553/article/details/80372202 在快 ...

最新文章

  1. 深入理解Java:注解(Annotation)自定义注解入门
  2. #135. 二维树状数组 3:区间修改,区间查询
  3. codelite13 wxWidgets3 macos开发环境配置
  4. 高并发分布式系统中生成全局唯一(订单号)Id
  5. MathType可以编辑省略号吗
  6. DESIGN_OUTLINE' and 'CUTOUT' are the preferred subclasWARNING
  7. 深搜DFS\广搜BFS 图初步入门
  8. 文件md5码怎么生成_Linux 系统文件校验方法--MD5,SHA1,PGP,SHA256,SHA512
  9. echarts柱状图x轴文字纵向显示
  10. 分区魔术师于分区助手怎么选择
  11. Tomcat9一介绍与部署
  12. 《气候宣言》宣布100多家签约组织,承诺至2040年或更早实现净零碳排放
  13. MCE公司:表观遗传研究指导肿瘤个性化治疗
  14. Android心电数据分析,Android 根据心电图(ECG)数据分析绘制心电图
  15. 利用python进行保险数据分析及可视化
  16. 湖北省荆门市谷歌高清卫星地图下载
  17. openEuler kubesphere kubekey 安装 ceph csi 及使用实例
  18. 好消息 | 个体工商户终于盼到了,帮扶措施和上海解封一起来了
  19. 几种音视频信号转换的比较,VGA转HDMI,HDMI/VGA转AV/S-Video,AV转...
  20. 面向服务的体系架构(SOA)—入门篇

热门文章

  1. win32 API函数( InvalidateRect)
  2. 计算机中单位ms什么意思,电荷的灵敏度单位(pc/ms^2)是什么意思啊?
  3. 关于newspaper的使用
  4. 学了4年C++后,我转向了Python
  5. 英伟达、Google与Adobe陆续推出AI模型,未来还会有多少职业会被取代?
  6. 「项目管理」项目失败的原因有哪些?
  7. mysql timestamp比较大小_MySQL中的datetime与timestamp比较
  8. 欧巴带我去冒险android平台,欧巴带我去冒险手游
  9. 关于进一步加强“三线一单”方案与国土空间规划有效衔接以确保生态保护红线制度实施成效的建议
  10. 一个项目玩转 Android 自定义 Drawable。