给定两个点:

typedef  struct {

double  x, y;

} Point;

Point A1,A2,B1,B2;

首先引入两个实验:

a.快速排斥实验

设以线段A1A2和线段B1B2为对角线的矩形为M,N;

若M,N 不相交,则两个线段显然不相交;

所以:满足第一个条件时:两个线段可能相交。

b.跨立实验

如果两线段相交,则两线段必然相互跨立对方.若A1A2跨立B1B2,则矢量( A1 - B1 ) 和(A2-B1)位于矢量(B2-B1)的两侧,

即(A1-B1) × (B2-B1) * (A2-B1) × (B2-B1)<0。

上式可改写成(A1-B1) × (B2-B1) * (B2-B1) × (A2-A1)>0。

应该判断两次,即两条线段都要为直线,判断另一直线的两端点是否在它两边,若是则两线段相交。

若积极满跨立实验是不行的,如下面的情况:

即两条线段在同一条直线上。所以我们要同时满足两次跨立和快速排斥实验。

总体分析:

当(A1-B1) × (B2-B1)=0时,说明(A1-B1)和(B2-B1)共线,但是因为已经通过快速排斥试验,所以 A1一定在线段 B1B2上;同理,(B2-B1)×(A2-B1)=0 说明A2一定在线段B1B2上。所以判断A1A2跨立B1B2的依据是:(A1-B1) × (B2-B1) * (B2-B1) × (A2-B1) >= 0。

同理判断B1B2跨立A1A2的依据是:(B1-A1) × (A2-A1) * (A2-A1) × (B2-A1) >= 0。

如图:

应用:

1.       判断两个线段相交

2.       判断线段与直线相交

3.       判断点在矩形内

模板题

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 struct line{
 5     double x1,y1,x2,y2;
 6 }p,q;
 7 double cross1(line &a,line &b){
 8     return (a.x1-b.x1)*(b.y2-b.y1)-(a.y1-b.y1)*(b.x2-b.x1);
 9 }
10 double cross2(line &a,line &b){
11     return (a.x2-b.x1)*(b.y2-b.y1)-(a.y2-b.y1)*(b.x2-b.x1);
12 }
13 bool judge(line &a,line &b){
14     if(max(a.x1,a.x2)>=min(b.x1,b.x2)&&
15         max(a.y1,a.y2)>=min(a.y1,a.y2)&&
16         max(b.x1,b.x2)>=min(a.x1,a.x2)&&
17         max(b.y1,b.y2)>=min(a.y1,a.y2)&&
18         cross1(a,b)*cross2(a,b)<=0&&
19         cross1(b,a)*cross2(b,a)<=0)
20     return true;
21     return false;
22 }
23 int main(){
24     int t;
25     cin>>t;
26     while(t--){
27         cin>>p.x1>>p.y1>>p.x2>>p.y2>>q.x1>>q.y1>>q.x2>>q.y2;
28         if(judge(p,q)) cout<<"Yes\n";
29         else cout<<"No\n";
30     }
31 }

转载于:https://www.cnblogs.com/elpsycongroo/p/6914812.html

[51nod1264]线段相交相关推荐

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

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

  2. poj3304(线段相交问题)

    题意:是否存在这样一条直线,使这条直线和所有的线段相交. #include<iostream> #include<algorithm> #include<cstring& ...

  3. poj1410(线段相交问题判断)

    题意:给一个线段的两个端点坐标(确定线段),再给一个矩形的左上角的坐标和右下角的坐标(确定矩形),问判断该线段是否和矩形相交,在矩形内也算和矩形相交.直接用线段和矩形的四条边判断是否相交即可. #in ...

  4. 简单几何(线段相交+最短路) POJ 1556 The Doors

    题目传送门 题意:从(0, 5)走到(10, 5),中间有一些门,走的路是直线,问最短的距离 分析:关键是建图,可以保存所有的点,两点连通的条件是线段和中间的线段都不相交,建立有向图,然后用Dijks ...

  5. 叉乘(三)——线段与线段相交吗?

    用途3: 我们现在的任务就是判断线段P1P2和线段Q1Q2是否相交. 我们分两步确定两条线段是否相交: (1)快速排斥试验 设以线段 P1P2 为对角线的矩形为R, 设以线段 Q1Q2 为对角线的矩形 ...

  6. hdu 1558(线段相交+并查集)

    题意:给你一些操作,P后边输入四个值,分别代表一条线段的起点.终点坐标,当输入Q时,后边输入一个整形值K,输出第k条线段所在的集合中包含的线段的个数. 解题思路:线段相交+并查集,sum[i]表示i所 ...

  7. POJ 2653 Pick-up sticks (线段相交)

    题意:给你n条线段依次放到二维平面上,问最后有哪些没与前面的线段相交,即它是顶上的线段 题解:数据弱,正向纯模拟可过 但是有一个陷阱:如果我们从后面向前枚举,找与前面哪些相交,再删除前面那些相交的线段 ...

  8. 判断线段相交(hdu1558 Segment set 线段相交+并查集)

    先说一下题目大意:给定一些线段,这些线段顺序编号,这时候如果两条线段相交,则把他们加入到一个集合中,问给定一个线段序号,求在此集合中有多少条线段. 这个题的难度在于怎么判断线段相交,判断玩相交之后就是 ...

  9. 几何基础之判断线段相交问题

    1.判断两线段相交 只要判断q1,q2在线段s1s2的两侧和s1,s2在线段q1q2的两侧. q1s1q2s1>0就是在两侧. 2.矩形里有n条直线,一条直线的终点是另一条直线的起点.问矩形被分 ...

最新文章

  1. C陷阱与缺陷的学习笔记
  2. FPGA之道(52)状态机的概念
  3. mitmdump 脚本使用python第三方包方法(报错:in script xxx.py: No module named ‘xxx‘)
  4. 图文具体解释 IntelliJ IDEA 15 创建 Maven 构建的 Java Web 项目(使用 Jetty 容器)
  5. NSArray文件读写
  6. 传输层的TCP和UDP
  7. C#环境下的钩子详解
  8. 如何进行正确的SQL性能优化
  9. 分享自己写的一个贪吃蛇的游戏(Linux)
  10. 不如跳舞!伯克利的舞蹈动作迁移效果逆天
  11. Power Designer的4种模型文件
  12. SQL文件的BOM问题导致的invalid character错误及解决
  13. 五笔字根表识别码图_怎么学五笔 五笔字根表键盘图 【详细介绍】
  14. python怎么装到其他盘_python下载安装到哪个磁盘?
  15. HDU 4826 双向DP
  16. 计算机专业笔记本显卡,笔记本显卡排名图及显卡等级分类【图文】
  17. 每日一练-游戏通关时间最短
  18. 微信小程序实战(仿小米商城)
  19. NTFS 之 LCN,VCN
  20. As Databinding “Missing import expression although it is registered”

热门文章

  1. ECharts-图表回执组件
  2. 我常用的shell命令
  3. JS一维数组转化为三维数组有这个方法就够了
  4. http --- 用于HTTP调试的最小型Perl Web 服务器
  5. vue --- 从模块从父元素获取数据
  6. ES5 数组扩展方法 forEach/filter/map的使用与重写
  7. 使用uni-app报错this.setData is not a function
  8. thrift服务windows环境编译失败
  9. Excel使用控件创建动态地图图表
  10. ssh服务端口转发详解