File size: 1,865 Bytes
fadb92b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import matplotlib.pyplot as plt
import numpy as np


def compute_centroid(polygon):
    """Compute centroid of a polygon given as list of (x, y)."""
    polygon = np.array(polygon)
    x = np.mean(polygon[:, 0])
    y = np.mean(polygon[:, 1])
    return (x, y)


def get_top_left(polygon):
    return min(polygon, key=lambda p: (p[1], p[0]))  # y ascending, x ascending


def sort_polygons(polygons, tolerance=20, reverse=False):
    # Step 1: Get top-left corner and original index
    indexed = [(i, get_top_left(p), p) for i, p in enumerate(polygons)]

    # Step 2: Sort by Y (top to bottom)
    indexed.sort(key=lambda x: x[1][1])

    # Step 3: Group into rows
    rows = []
    for idx, corner, poly in indexed:
        y = corner[1]
        added = False
        for row in rows:
            if abs(row[0][1][1] - y) <= tolerance:
                row.append((idx, corner, poly))
                added = True
                break
        if not added:
            rows.append([(idx, corner, poly)])

    # Step 4: Sort each row left-to-right
    for row in rows:
        row.sort(key=lambda x: x[1][0])  # sort by x

    # Step 5: Flatten and return indices
    sorted_indices = [idx for row in rows for idx, _, _ in row]
    if reverse:
        sorted_indices = sorted_indices[::-1]
    sorted_polygons = [polygons[idx] for idx in sorted_indices]

    return sorted_polygons, sorted_indices


def plot_polygons(polygons, save_path):
    plt.figure(figsize=(6, 6))
    for i, poly in enumerate(polygons):
        poly = np.array(poly)
        plt.fill(poly[:, 0], poly[:, 1], alpha=0.5, label=f"Polygon {i + 1}")
        centroid = compute_centroid(poly)
        plt.text(centroid[0], centroid[1], f"C{i + 1}", fontsize=10, ha="center")
    # plt.title(title)
    # plt.legend()
    plt.gca().set_aspect("equal", adjustable="box")
    plt.savefig(save_path)