From 9531e93efe86d2027f4bbec3aa9ea9bdfa693b2c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20Proch=C3=A1zka?= <david@prochazka.dev>
Date: Sun, 28 Feb 2021 18:36:59 +0100
Subject: [PATCH] FIX: node-node distance type now owns the distance
 computation

---
 src/mhtree/NodeToNodeDistance.java | 26 ++++++++++++++++++++++++--
 1 file changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/mhtree/NodeToNodeDistance.java b/src/mhtree/NodeToNodeDistance.java
index 391d9a1..762f1c5 100644
--- a/src/mhtree/NodeToNodeDistance.java
+++ b/src/mhtree/NodeToNodeDistance.java
@@ -1,6 +1,28 @@
 package mhtree;
 
+import messif.objects.LocalAbstractObject;
+
+import java.util.function.BiFunction;
+
 public enum NodeToNodeDistance {
-    NEAREST_HULL_OBJECTS,
-    FURTHEST_HULL_OBJECTS,
+    NEAREST_HULL_OBJECTS(Math::min, Float.MAX_VALUE),
+    FURTHEST_HULL_OBJECTS(Math::max, Float.MIN_VALUE);
+
+    private final BiFunction<Float, Float, Float> compareFunction;
+    private final float defaultValue;
+
+    NodeToNodeDistance(final BiFunction<Float, Float, Float> compareFunction, final float defaultValue) {
+        this.compareFunction = compareFunction;
+        this.defaultValue = defaultValue;
+    }
+
+    public float getDistance(Node node1, Node node2, BiFunction<LocalAbstractObject, LocalAbstractObject, Float> getDistance) {
+        float distance = defaultValue;
+
+        for (LocalAbstractObject firstHullObject : node1.getHullObjects())
+            for (LocalAbstractObject secondHullObject : node2.getHullObjects())
+                distance = compareFunction.apply(distance, getDistance.apply(firstHullObject, secondHullObject));
+
+        return distance;
+    }
 }
-- 
GitLab