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");
		}
	}
}