평면 위 두 직사각형이 서로 겹치는 직사각형의 좌표 구하는 놀라운 방법

두 직사각형의 왼쪽 하단 좌표, 오른쪽 상단 좌표 (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 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')

 

 

 

https://www.geeksforgeeks.org/intersecting-rectangle-when-bottom-left-and-top-right-corners-of-two-rectangles-are-given/

 

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

 

 

TAGS.

Comments