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()
- Dependency: teflib.geometry.is_intersecting
ps/problems/boj/20149.txt · 마지막으로 수정됨: 2022/12/08 09:07 저자 teferi
토론