[백준 17386] 선분 교차 1
https://www.acmicpc.net/problem/17386
17386번: 선분 교차 1
첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다. 세 점이 일직선 위에 있는 경우는 없다.
www.acmicpc.net
작년 알설 수업 때 배웠던 거다...
근데 문제 풀때 하나도 기억 안났음
당연히 그 때 관련 문제를 안풀었고 공식만 외웠으니까!!!!!!!
그래서 다시 구글링을 해서 공부를 해봤다.
CCW(CounterClockWise)
세 점에 대한 방향을 나타냄.
점 A, B, C가 있을 때, 세 가지 경우가 존재한다
1)
A->B 방향이 B->C 방향에 대해 반시계 방향인 경우
2)
A->B 방향이 B->C 방향에 대해 시계 방향인 경우
3)
세 점이 평행한 경우
위 선분들의 방향을 계산하는 CCW 값은 다음과 같다. (이 식은 외적에 의하여 계산됨.)
(Bx - Ax)(Cy - Ay) - (By - Ay)(Cx - Ax)
1)의 반시계 경우에는 0보다 큰 값이,
2)의 시계 경우에는 0보다 작은 값이,
3) 평행한 경우에는 0의 값으로 계산해 낼 수 있다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
class Main {
public static void main(String args[]) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
double segment1[] = new double[4];
double segment2[] = new double[4];
String line = br.readLine();
segment1 = Arrays.stream(line.split(" ")).mapToDouble(Double::parseDouble).toArray();
line = br.readLine();
segment2 = Arrays.stream(line.split(" ")).mapToDouble(Double::parseDouble).toArray();
if(isCross(segment1,segment2) && isCross(segment2,segment1))
System.out.println(1);
else
System.out.println(0);
}
private static boolean isCross(double arr1[], double arr2[]) {
boolean flag1=(arr1[0]*arr1[3]+arr1[2]*arr2[1]+arr2[0]*arr1[1]
-arr1[2]*arr1[1]-arr2[0]*arr1[3]-arr1[0]*arr2[1])>0;
boolean flag2=(arr1[0]*arr1[3]+arr1[2]*arr2[3]+arr2[2]*arr1[1]
-arr1[2]*arr1[1]-arr2[2]*arr1[3]-arr1[0]*arr2[3])>0;
return flag1 ^ flag2;
}
}
https://jason9319.tistory.com/358
CCW와 CCW를 이용한 선분 교차 판별
PS에서 종종 이용되는 선분 교차 여부 판별을 CCW를 이용하여 비교적 간단(?)하게 할 수 있는 방법을 소개하려고 합니다. 그 전에 우선 CCW에 대하여 이야기 해보겠습니다. CCW는 Counterclockwise의 약자
jason9319.tistory.com
CCW에 대한 정의
https://degurii.tistory.com/47
[알고리즘] CCW로 세 점의 방향성 판별하기
0. 들어가기 전에 첫 알고리즘 포스트입니다. 이번에 쓸 내용은 CCW입니다. 원래는 기하 알고리즘들을 전반적으로 다루려고 했는데 생각보다 글이 길어져서 CCW만 쓰게 되었습니다. 본 글의 내용
degurii.tistory.com