54 lines
1.9 KiB
Python
54 lines
1.9 KiB
Python
import math
|
|
|
|
import pygame
|
|
|
|
|
|
class BoundingBox:
|
|
def __init__(self, x, y, width, height):
|
|
self.x = x
|
|
self.y = y
|
|
self.width = width
|
|
self.height = height
|
|
|
|
self.center_x = x + width / 2
|
|
self.center_y = y + height / 2
|
|
|
|
def get_dimensions(self):
|
|
return self.width, self.height
|
|
|
|
def get_position(self):
|
|
return self.x, self.y
|
|
|
|
def contains_point(self, position: tuple[float, float]):
|
|
return self.x <= position[0] <= self.x + self.width and self.y <= position[1] <= self.y + self.height
|
|
|
|
def __str__(self):
|
|
return f"({self.x}, {self.y}, {self.width}, {self.height})"
|
|
|
|
def distance(self, bounding_box: 'BoundingBox') -> float:
|
|
"""
|
|
Classmates the minimum distance between two bounding boxes by checking in what direction the bounding boxes are
|
|
in relation to each other.
|
|
:param bounding_box: The bounding box to compare to.
|
|
:return: The minimum distance between the two bounding boxes.
|
|
"""
|
|
if self.overlaps(bounding_box):
|
|
return 0
|
|
|
|
distance_x = max(0, abs(self.center_x - bounding_box.center_x) - (self.width + bounding_box.width) / 2)
|
|
distance_y = max(0, abs(self.center_y - bounding_box.center_y) - (self.height + bounding_box.height) / 2)
|
|
|
|
return math.sqrt(distance_x ** 2 + distance_y ** 2)
|
|
|
|
def overlaps(self, bounding_box: 'BoundingBox') -> bool:
|
|
"""
|
|
Checks if the bounding boxes overlap.
|
|
:param bounding_box: The bounding box to check.
|
|
:return: True if the bounding boxes overlap, False otherwise.
|
|
"""
|
|
return self.x < bounding_box.x + bounding_box.width and self.x + self.width > bounding_box.x and \
|
|
self.y < bounding_box.y + bounding_box.height and self.y + self.height > bounding_box.y
|
|
|
|
def get_rect(self) -> pygame.Rect:
|
|
return pygame.Rect(self.x, self.y, self.width, self.height)
|