Skip to content

Commit c7fbbd7

Browse files
committed
Add hybrid method and speed up union method
1 parent 1b2c4c7 commit c7fbbd7

File tree

1 file changed

+18
-4
lines changed

1 file changed

+18
-4
lines changed

src/py_eddy_tracker/poly.py

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -431,7 +431,7 @@ def merge(x, y):
431431
return concatenate(x), concatenate(y)
432432

433433

434-
def vertice_overlap(x0, y0, x1, y1, minimal_area=False, p1_area=False):
434+
def vertice_overlap(x0, y0, x1, y1, minimal_area=False, p1_area=False, hybrid_area=False, min_overlap=0):
435435
r"""
436436
Return percent of overlap for each item.
437437
@@ -441,6 +441,9 @@ def vertice_overlap(x0, y0, x1, y1, minimal_area=False, p1_area=False):
441441
:param array y1: y for polygon list 1
442442
:param bool minimal_area: If True, function will compute intersection/little polygon, else intersection/union
443443
:param bool p1_area: If True, function will compute intersection/p1 polygon, else intersection/union
444+
:param bool hybrid_area: If True, function will compute like union,
445+
but if cost is under min_overlap, obs is kept in case of fully included
446+
:param float min_overlap: under this value cost is set to zero
444447
:return: Result of cost function
445448
:rtype: array
446449
@@ -466,14 +469,25 @@ def vertice_overlap(x0, y0, x1, y1, minimal_area=False, p1_area=False):
466469
# Area of intersection
467470
intersection = (p0 & p1).area()
468471
# we divide intersection with the little one result from 0 to 1
472+
if intersection == 0:
473+
cost[i] = 0
474+
continue
475+
p0_area_, p1_area_ = p0.area(), p1.area()
469476
if minimal_area:
470-
cost[i] = intersection / min(p0.area(), p1.area())
477+
cost_ = intersection / min(p0_area_, p1_area_)
471478
# we divide intersection with p1
472479
elif p1_area:
473-
cost[i] = intersection / p1.area()
480+
cost_ = intersection / p1_area_
474481
# we divide intersection with polygon merging result from 0 to 1
475482
else:
476-
cost[i] = intersection / (p0 + p1).area()
483+
cost_ = intersection / (p0_area_ + p1_area_ - intersection)
484+
if cost_ >= min_overlap:
485+
cost[i] = cost_
486+
else:
487+
if hybrid_area and cost_ != 0 and (intersection / min(p0_area_, p1_area_)) > .99:
488+
cost[i] = cost_
489+
else:
490+
cost[i] = 0
477491
return cost
478492

479493

0 commit comments

Comments
 (0)