线段相交吗

import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		ArrayList<Integer> x = new ArrayList<Integer>();
		ArrayList<Integer> y = new ArrayList<Integer>();
		int count = input(list, x, y);// 返回线段条数
		if (count == 0) {
			System.out.print("false");
			System.exit(0);
		}
		int horizontal = 0;// 水平线段条数
		int vertical = 0;// 垂直线段条数
		if (count % 2 == 0) {
			horizontal = count / 2;
			vertical = count / 2;
		} else {
			horizontal = count / 2;
			vertical = count / 2 + 1;
		}
		int lengthLast = list.get(count - 1);// 最后一条线段的长度
		boolean b = false;
		int x1 = x.get(count - 1);// 最后一条线段的起点坐标
		int y1 = y.get(count - 1);
		if (count % 4 == 1) {// 最后一条向上走
			// 找到上面最近一条可以接触的水平线段,判断是否可以接触,下面的情况类似。
			for (int i = 0; i < horizontal - 1; i++) {// 遍历所有水平线
				int a1 = x.get(2 * i + 1);
				int b1 = y.get(2 * i + 1);
				int a2 = x.get(2 * i + 2);
				int b2 = y.get(2 * i + 2);
				if ((a1 >= x1 && x1 >= a2) || (a2 >= x1 && x1 >= a1)) {
					if (b1 > y1) {// 上面的线段
						if (lengthLast >= b1 - y1) {
							b = true;
							break;
						}
					}
				}
			}
		} else if (count % 4 == 2) {// 左
			for (int i = 0; i < vertical - 1; i++) {// 遍历所有垂直线段
				int a1 = x.get(2 * i);
				int b1 = y.get(2 * i);
				int a2 = x.get(2 * i + 1);
				int b2 = y.get(2 * i + 1);
				if ((b1 >= y1 && y1 >= b2) || (b2 >= y1 && y1 >= b1)) {
					if (a1 < x1) {// 左边的线段
						if (lengthLast >= Math.abs(a1 - x1)) {
							b = true;
							break;
						}
					}
				}
			}
		} else if (count % 4 == 3) {// 下
			for (int i = 0; i < horizontal - 1; i++) {// 遍历所有水平线
				int a1 = x.get(2 * i + 1);
				int b1 = y.get(2 * i + 1);
				int a2 = x.get(2 * i + 2);
				int b2 = y.get(2 * i + 2);
				if ((a1 >= x1 && x1 >= a2) || (a2 >= x1 && x1 >= a1)) {
					if (b1 < y1) {// 上面的线段
						if (lengthLast >= Math.abs(b1 - y1)) {
							b = true;
							break;
						}
					}
				}
			}
		} else if (count % 4 == 0) {// 右
			for (int i = 0; i < vertical - 1; i++) {// 遍历所有垂直线段
				int a1 = x.get(2 * i);
				int b1 = y.get(2 * i);
				int a2 = x.get(2 * i + 1);
				int b2 = y.get(2 * i + 1);
				if ((b1 >= y1 && y1 >= b2) || (b2 >= y1 && y1 >= b1)) {
					if (a1 > x1) {// 左边的线段
						if (lengthLast >= Math.abs(a1 - x1)) {
							b = true;
							break;
						}
					}
				}
			}
		}
		System.out.print(b);
	}

	public static int input(ArrayList<Integer> list, ArrayList<Integer> x, ArrayList<Integer> y) {
		Scanner scanner = new Scanner(System.in);
		x.add(0);// 记录原点
		y.add(0);
		int i = 0;
		String s = scanner.nextLine();
		if (!s.equals("")) {
			String[] temp = s.split(" ");
			for (int k = 0; k < temp.length; k++) {
				i++;
				int n = Integer.parseInt(temp[k]);// 线段长度
				list.add(n);
				int preX = x.get(i - 1);// 上一个点的坐标
				int preY = y.get(i - 1);
				if (i % 4 == 1) {// 上
					x.add(preX);
					y.add(preY + n);
				} else if (i % 4 == 2) {// 左
					x.add(preX - n);
					y.add(preY);
				} else if (i % 4 == 3) {// 下
					x.add(preX);
					y.add(preY - n);
				} else if (i % 4 == 0) {// 下
					x.add(preX + n);
					y.add(preY);
				}
			}
			return temp.length;
		} else {
			return 0;
		}
	}

}

  

原文地址:https://www.cnblogs.com/xiaoxueyong/p/6026663.html