평면 위 두 직사각형이 서로 겹치는 직사각형의 좌표 구하는 놀라운 방법
두 직사각형의 왼쪽 하단 좌표, 오른쪽 상단 좌표 (x1,y1), (x2,y2), (x3,y3), (x4,y4)가 각각 주어질때,
이 두 직사각형이 서로 겹쳐서 생기는 영역의 좌표를 구해본다면?
E의 좌표가 (x5,y5), F의 좌표가 (x6,y6)라고 한다면... 놀랍게도 이를 구하는 공식이 있다
x5 = max(x1,x3)
y5 = max(y1,y3)
x6 = min(x2,x4)
y6 = min(y2,y4)
만약 x5 > x6이거나 y5 > y6이면 두 직사각형이 겹치지 않는다
근데 몇개 해보니까 진짜 맞는듯?
왼쪽 하단은 max, 오른쪽 상단은 min
조건 하나하나 생각해서 할려고 하면 거의 무조건 틀리더라
그냥 공식 써버리는게 제일 편함
#직사각형1 (x1,y1), (x2,y2)
#직사각형2 (x3,y3), (x4,y4)
#두 직사각형이 서로 겹치는 영역의 왼쪽 하단 (a,b), 오른쪽 상단(c,d)의 좌표 구하기
def intersect(x1,y1,x2,y2,x3,y3,x4,y4):
a = max(x1,x3)
b = max(y1,y3)
c = min(x2,x4)
d = min(y2,y4)
if a > c or b > d: #겹치는 영역이 존재하지 않는다
return -1,-1,-1,-1
else:
return a,b,c,d
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
21426. 흰 종이와 검은 종이
흰 종이를 먼저 올려놓고, 검은 종이 2장을 차례대로 올려놓을 때 위에서 바라볼때 보이는 흰색 면적이 존재하는가? 아닌가?
흰 종이, 검은종이 각각의 왼쪽 하단, 오른쪽 상단의 좌표가 주어지기 때문에 흰종이 검은종이끼리
서로 겹치는 영역의 좌표를 알아야함
흰 종이의 넓이 A
흰 종이와 검은 종이1의 서로 겹치는 영역 B
흰 종이와 검은 종이2의 서로 겹치는 영역 C
그리고 놓치기 쉬운 건 검은 종이 1, 검은 종이 2가 서로 겹치는 영역 D를 구해야하고,
A - (B+C - D)를 하면 남아있는 흰색 영역의 넓이이고, 이것이 0보다 크면 흰색 면적이 남아있는 것
핵심은 겹치는 영역의 좌표를 공식으로 접근하는거 아니면 이게 틀리기가 쉬움
조건문으로 어떻게 해봤는데 어디가 틀리는지 모르겠더라
def intersect(x1,y1,x2,y2,x3,y3,x4,y4):
a = max(x1,x3)
b = max(y1,y3)
c = min(x2,x4)
d = min(y2,y4)
if a > c or b > d:
return -1,-1,-1,-1
else:
return a,b,c,d
T = int(input())
for _ in range(T):
a,b,c,d = map(int,input().split())
white = (c-a)*(d-b)
x1,y1,x2,y2 = map(int,input().split())
x3,y3,x4,y4 = map(int,input().split())
p,q,r,s = intersect(a,b,c,d,x1,y1,x2,y2)
if p == -1 and q == -1 and r == -1 and s == -1:
black1 = 0
else:
black1 = (r-p)*(s-q)
p,q,r,s = intersect(a,b,c,d,x3,y3,x4,y4)
if p == -1 and q == -1 and r == -1 and s == -1:
black2 = 0
else:
black2 = (r-p)*(s-q)
p,q,r,s = intersect(x1,y1,x2,y2,x3,y3,x4,y4)
if p == -1 and q == -1 and r == -1 and s == -1:
black3 = 0
else:
pp,qq,rr,ss = intersect(a,b,c,d,p,q,r,s)
if pp == -1 and qq == -1 and rr == -1 and ss == -1:
black3 = 0
else:
black3 = (rr-pp)*(ss-qq)
x = white - (black1+black2-black3)
if x <= 0:
print('NO')
else:
print('YES')
Intersecting rectangle when bottom-left and top-right corners of two rectangles are given - GeeksforGeeks
A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.
www.geeksforgeeks.org
'기하학' 카테고리의 다른 글
벡터 (x,y)를 90도 회전하는 방법 (0) | 2024.11.16 |
---|---|
사각형과 원이 겹치는 영역의 좌표의 개수는 O(N)에 구할 수 있을까 (0) | 2024.08.01 |
원 안에 원을 가득 채우는 문제?(circle packing in a circle) (0) | 2024.07.27 |
꼭짓점이 둥근 볼록껍질(round convex hull)의 둘레의 길이를 구하는 법 (0) | 2023.09.27 |
CCW를 이용한 선분 교차 판정 알고리즘 배우기 (0) | 2023.09.12 |