Refactoring

This commit is contained in:
Matthias Bisping 2023-01-10 11:30:36 +01:00
parent 3d83489819
commit 16cc0007ed

View File

@ -2,6 +2,8 @@ from functools import reduce
from itertools import combinations
from typing import List, Tuple, Set
from funcy import all
from cv_analysis.utils import until, make_merger_sentinel
from cv_analysis.utils.rectangle import Rectangle
from cv_analysis.utils.spacial import related
@ -18,35 +20,29 @@ def merge_related_rectangles(rectangles: List[Rectangle]) -> List[Rectangle]:
def merge_rectangles_once(rectangles: List[Rectangle]) -> List[Rectangle]:
"""Merges rectangles that are related to each other, but does not iterate on the results."""
def merge_if_related(
acc: Tuple[Set[Rectangle], Set[Rectangle]],
pair: Tuple[Rectangle, Rectangle],
) -> Tuple[Set[Rectangle], Set[Rectangle]]:
"""Merges two rectangles if they are related, otherwise returns the accumulator unchanged."""
alpha, beta = pair
merged, used = acc
def unused(*args) -> bool:
return not used & {*args}
if unused(alpha) and unused(beta) and related(alpha, beta):
return merged | {bounding_rect(alpha, beta)}, used | {alpha, beta}
else:
return merged, used
rectangles = set(rectangles)
merged, used = reduce(merge_if_related, combinations(rectangles, 2), (set(), set()))
return list(merged | rectangles - used)
# for alpha, beta in combinations(rectangles, 2):
# if related(alpha, beta):
# rectangles.remove(alpha)
# rectangles.remove(beta)
# rectangles.append(bounding_rect(alpha, beta))
# return rectangles
# return rectangles
T = Tuple[Set[Rectangle], Set[Rectangle]]
V = Tuple[Rectangle, Rectangle]
def merge_if_related(acc: T, pair: V) -> T:
"""Merges two rectangles if they are related, otherwise returns the accumulator unchanged."""
alpha, beta = pair
merged, used = acc
def unused(*args) -> bool:
return not used & {*args}
if all(unused, (alpha, beta)) and related(alpha, beta):
return merged | {bounding_rect(alpha, beta)}, used | {alpha, beta}
else:
return merged, used
def bounding_rect(alpha: Rectangle, beta: Rectangle) -> Rectangle: