BechusRantus's picture
Upload folder using huggingface_hub
7134ce7 verified
# Utils for detection functions
# Written by Junjie Ye
from shapely.geometry import Polygon, LineString
import numpy as np
def polygons_overlap(poly1, poly2):
"""
Determine if two polygons overlap.
poly1 and poly2 are lists of (x, y) tuples representing the vertices of each polygon.
"""
polygon1 = Polygon(poly1)
polygon2 = Polygon(poly2)
# Check if the current polygons intersect each other
if polygon1.intersects(polygon2):
# Check for proper intersection (excluding boundary touching)
if polygon1.touches(polygon2):
# Polygons touch but do not overlap
return False
else:
# Polygons overlap
return True
else:
# Polygons do not intersect and hence do not overlap
return False
def point_to_segment_dist(point, segment_start, segment_end):
"""Calculate the distance from a point to a line segment."""
p1 = np.array(point)
p2 = np.array(segment_start)
p3 = np.array(segment_end)
if np.all(p2 == p3):
return np.linalg.norm(p1 - p2)
else:
# Calculate the projection of point p1 onto the line defined by p2 and p3
t = np.dot(p1 - p2, p3 - p2) / np.dot(p3 - p2, p3 - p2)
t = max(0, min(1, t))
# This is the projection point on the line segment
projection = p2 + t * (p3 - p2)
return np.linalg.norm(p1 - projection)
def polygon_distance(poly1, poly2):
"""Calculate the minimum distance between two polygons."""
min_dist = float('inf')
# Check distances from vertices of poly1 to edges of poly2 and vice versa
for poly in [poly1, poly2]:
for i in range(len(poly)):
p1 = poly[i]
for j in range(len(poly2)):
p2_start = poly2[j]
p2_end = poly2[(j + 1) % len(poly2)]
dist = point_to_segment_dist(p1, p2_start, p2_end)
min_dist = min(min_dist, dist)
# Swap polygons for the next iteration
poly1, poly2 = poly2, poly1
return min_dist
if __name__ == "__main__":
# Example usage:
polygon1 = [(0, 0), (5, 0), (5, 5), (0, 5)] # Square
polygon2 = [(6, 6), (8, 6), (8, 8), (6, 8)] # Another square
polygon3 = [(4, 4), (6, 4), (6, 6), (4, 6)] # Overlapping square
print(polygons_overlap(polygon1, polygon2)) # Should return False
print(polygons_overlap(polygon1, polygon3)) # Should return True
# Example usage:
polygon1 = [(0, 0), (5, 0), (5, 5), (0, 5)] # Square
polygon2 = [(6, 6), (8, 6), (8, 8), (6, 8)] # Another square
distance = polygon_distance(polygon1, polygon2)
print(f"The minimum distance between the polygons is: {distance}")