51nod1264:线段相交
判断线段相交:
- 关于快速排斥和跨立实验的博客:https://blog.csdn.net/li1615882553/article/details/80372202
- 在快速排斥中,如果两个矩形不相交,那么线段一定不相交。如果两个矩形相交,那么线段不一定相交,所以
判断线段相交一般先进行一次快速排斥再进行一次跨立实验。
- 这道判线段相交题中说明
有一个公共点或有部分重合认为相交
,所以仅对其进行垮立实验就可以了。 - 另外,注意浮点数比大小问题,与题中的1e-8相比较。
import java.util.Scanner;
public class Main {
static class Dian {// 点类
Double x, y = 0.0;
}
static class Line {// 线类
Dian a = new Dian();
Dian b = new Dian();
}
static Double chaji(Dian p0, Dian p1, Dian p2) {// 点p1叉点p2
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
static Line[] l = new Line[2];// 线数组
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T = in.nextInt();
for(int i=0;i<2;i++)
l[i]= new Line();
for (int i = 0; i < T; i++) {
l[0].a.x = in.nextDouble();
l[0].a.y = in.nextDouble();
l[0].b.x = in.nextDouble();
l[0].b.y = in.nextDouble();
l[1].a.x = in.nextDouble();
l[1].a.y = in.nextDouble();
l[1].b.x = in.nextDouble();
l[1].b.y = in.nextDouble();
if (chaji(l[1].a, l[0].a, l[0].b)
* chaji(l[1].b, l[0].a, l[0].b) <1e-8
&& chaji(l[0].a, l[1].a, l[1].b)
* chaji(l[0].b, l[1].a, l[1].b) <1e-8)
System.out.println("Yes");
else
System.out.println("No");
}
}
}