[PS] boj_17387 : 선분 교차 2

2023. 5. 24. 16:02·Problem solving


문제
2차원 좌표 평면 위의 두 선분 L1, L2가 주어졌을 때, 두 선분이 교차하는지 아닌지 구해보자. 한 선분의 끝 점이 다른 선분이나 끝 점 위에 있는 것도 교차하는 것이다.

입력
첫째 줄에 L1의 양 끝 점 x1, y1, x2, y2가, 둘째 줄에 L2의 양 끝 점 x3, y3, x4, y4가 주어진다.

출력
L1과 L2가 교차하면 1, 아니면 0을 출력한다.





두 선분의 다양한 경우의 수를 ccw값의 부호(외적 결과의 부호)를 기준으로 정리해 보았다.


(AB X BC)*(AB X BD) 와 (CD X DA)*(CD x DB)의 부호로 보았을 때

+ + 이거나 0 + 이거나 - + 이면 무조건 안 만남
0 - 이거나 - - 이면 무조건 만남
0 0 이면은 외적 결과의 부호 만으로 알 수 없음!



따라서 0 0인 경우에만 벡터 내적의 부호를 기준으로 분류해 보았다.

(ac.ad)*(bc.bd)와 (ca.cb)*(da.db)를 기준으로 경우를 나누어 보면,
+ + 인 경우와 아닌 경우로 나눌 수 있는데,
+ + 인 경우에서 + + + +이면 만나지 않지만, + + - - 인 경우는 만나게 된다.
+ + 가 아닌 경우에는 만나게 된다.

# 선분 교차 2

def ccw(x1, y1, x2, y2, x3, y3):
    cross = (x1*y2+x2*y3+x3*y1)-(x2*y1+x3*y2+x1*y3)
    if cross == 0: return 0
    elif cross > 0: return 1
    else: return -1
import sys
result = -1
x1, y1, x2, y2 = map(int,sys.stdin.readline().split())
x3, y3, x4, y4 = map(int,sys.stdin.readline().split())
abc = ccw(x1,y1,x2,y2,x3,y3); abd = ccw(x1,y1,x2,y2,x4,y4)
cda = ccw(x3,y3,x4,y4,x1,y1); cdb = ccw(x3,y3,x4,y4,x2,y2)
if abc*abd+cda*cdb < 0: result = 1
elif abc*abd==0 and cda*cdb==0:
    ac = ((x3-x1),(y3-y1)); ad = ((x4-x1),(y4-y1))
    bc = ((x3-x2),(y3-y2)); bd = ((x4-x2),(y4-y2))
    acad = ac[0]*ad[0]+ac[1]*ad[1]; bcbd = bc[0]*bd[0]+bc[1]*bd[1]
    cacb = ac[0]*bc[0]+ac[1]*bc[1]; dadb = ad[0]*bd[0]+ad[1]*bd[1]
    if acad * bcbd > 0 and cacb * dadb > 0:
        result = 0 if bcbd * cacb > 0 else 1
    else: result = 1
else: result = 0
print(result)

 

'Problem solving' 카테고리의 다른 글
  • [PS] CCW (Counter Clock Wise) 알고리즘
  • [PS] boj_14003 : 가장 긴 증가하는 부분 수열 5
  • [PS] 최장 증가 부분 수열 (LIS)
  • [PS] boj_10942 : 팰린드롬?
vysryoo
vysryoo
  • vysryoo
    vysryoo
    vysryoo
  • 전체
    오늘
    어제
    • 분류 전체보기 (129)
      • Python (20)
      • Data structure (12)
      • Algorithm (14)
      • Operating system (18)
      • Programming language theory (12)
      • Computer architecture (6)
      • Softeware engineering (8)
      • Multicore (2)
      • Data Base (3)
      • Problem solving (24)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
vysryoo
[PS] boj_17387 : 선분 교차 2
상단으로

티스토리툴바