사용자 도구

사이트 도구


ps:problems:boj:20149

선분 교차 3

ps
링크acmicpc.net/…
출처BOJ
문제 번호20149
문제명선분 교차 3
레벨플래티넘 4
분류

기하

시간복잡도O(1)
사용한 언어Python 3.11
제출기록30616KB / 36ms
최고기록36ms
해결날짜2022/12/08

풀이

  • 두 선분의 교점을 구하는 문제.
  • 계산 자체는 공식대로 넣어주면 되지만, 다양한 코너케이스를 모두 처리하는것이 번거롭다.

코드

"""Solution code for "BOJ 20149. 선분 교차 3".

- Problem link: https://www.acmicpc.net/problem/20149
- Solution link: http://www.teferi.net/ps/problems/boj/20149

Tags: [Geometry]
"""

from teflib import geometry

DISJOINT = 0
OVERWRAPPING = 1


def intersect_point(x1, y1, x2, y2, x3, y3, x4, y4):
    if not geometry.is_intersecting(x1, y1, x2, y2, x3, y3, x4, y4):
        return DISJOINT

    denom = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4)
    if denom:
        t1, t2 = x1 * y2 - y1 * x2, x3 * y4 - y3 * x4
        x = ((x3 - x4) * t1 - (x1 - x2) * t2) / denom
        y = ((y3 - y4) * t1 - (y1 - y2) * t2) / denom
        return (x, y)
    else:
        p1, p2, p3, p4 = sorted([(x1, y1), (x2, y2), (x3, y3), (x4, y4)])
        return p2 if p2 == p3 else OVERWRAPPING


def main():
    x1, y1, x2, y2 = [int(x) for x in input().split()]
    x3, y3, x4, y4 = [int(x) for x in input().split()]
    point = intersect_point(x1, y1, x2, y2, x3, y3, x4, y4)
    if point == DISJOINT:
        print('0')
    else:
        print('1')
        if point != OVERWRAPPING:
            print(*point)


if __name__ == '__main__':
    main()

토론

댓글을 입력하세요:
J᠎ E H A T
 
ps/problems/boj/20149.txt · 마지막으로 수정됨: 2022/12/08 09:07 저자 teferi