From 009fae151ea1acf1833920ae809bba7f5623dac9 Mon Sep 17 00:00:00 2001
From: Daniel Schramm <xschramm@fi.muni.cz>
Date: Wed, 15 Sep 2021 18:17:44 +0200
Subject: [PATCH] Overview of Hausdorff distance statistics implemented

---
 .../analyst/core/ControlPanelBuilder.java     | 35 +++++++++++++------
 .../analyst/distance/DistanceAction.java      | 17 +++++++--
 .../analyst/distance/DistancePanel.java       | 31 +++++++++++++++-
 3 files changed, 69 insertions(+), 14 deletions(-)

diff --git a/GUI/src/main/java/cz/fidentis/analyst/core/ControlPanelBuilder.java b/GUI/src/main/java/cz/fidentis/analyst/core/ControlPanelBuilder.java
index d5c3d08b..008cc0fb 100644
--- a/GUI/src/main/java/cz/fidentis/analyst/core/ControlPanelBuilder.java
+++ b/GUI/src/main/java/cz/fidentis/analyst/core/ControlPanelBuilder.java
@@ -129,18 +129,31 @@ public class ControlPanelBuilder {
     public JLabel addCaptionLine(String caption) {
         GridBagConstraints c = new GridBagConstraints();
         c.insets = CAPTION_PADDING; 
-        c.gridwidth = GridBagConstraints.REMAINDER;
-        c.gridx = col;
-        c.gridy = row;
-        c.anchor = GridBagConstraints.LINE_START;
-        c.fill = GridBagConstraints.NONE;
-        JLabel label = new JLabel(caption);
+        
+        JLabel label = addLabelLineCustom(caption, c);
         label.setFont(CAPTION_FONT);
-        controlPanel.add(label, c);
+        
         //addLine();
         return label;
     }
     
+    public JLabel addLabelLine(String caption) {
+        return addLabelLineCustom(caption, new GridBagConstraints());
+    }
+    
+    private JLabel addLabelLineCustom(String caption, GridBagConstraints constraints) {
+        constraints.gridwidth = GridBagConstraints.REMAINDER;
+        constraints.gridx = col;
+        constraints.gridy = row;
+        constraints.anchor = GridBagConstraints.LINE_START;
+        constraints.fill = GridBagConstraints.NONE;
+        
+        JLabel label = new JLabel(caption);
+        controlPanel.add(label, constraints);
+        
+        return label;
+    }
+    
     /**
      * Adds a line with slider option.
      * 
@@ -238,18 +251,18 @@ public class ControlPanelBuilder {
         
         List<JButton> retButtons = new ArrayList<>();
         for (int i = 0; i < buttons.size(); i++) {
-            JButton button = addButton(buttons.get(i), actions.get(i), c);
+            JButton button = addButtonCustom(buttons.get(i), actions.get(i), c);
             retButtons.add(button);
         }
 
         return retButtons;
     }
     
-    public JButton addButtonSimple(String caption, ActionListener action) {
-        return addButton(caption, action, new GridBagConstraints());
+    public JButton addButton(String caption, ActionListener action) {
+        return addButtonCustom(caption, action, new GridBagConstraints());
     }
 
-    private JButton addButton(String caption, ActionListener action, GridBagConstraints constraints) {
+    private JButton addButtonCustom(String caption, ActionListener action, GridBagConstraints constraints) {
         JButton button = new JButton();
         button.setText(caption);
         button.addActionListener(action);
diff --git a/GUI/src/main/java/cz/fidentis/analyst/distance/DistanceAction.java b/GUI/src/main/java/cz/fidentis/analyst/distance/DistanceAction.java
index 38e786bb..da156bba 100644
--- a/GUI/src/main/java/cz/fidentis/analyst/distance/DistanceAction.java
+++ b/GUI/src/main/java/cz/fidentis/analyst/distance/DistanceAction.java
@@ -10,6 +10,7 @@ import cz.fidentis.analyst.visitors.face.HausdorffDistancePrioritized;
 import cz.fidentis.analyst.visitors.mesh.HausdorffDistance.Strategy;
 import java.awt.Color;
 import java.awt.event.ActionEvent;
+import java.util.DoubleSummaryStatistics;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -114,9 +115,21 @@ public class DistanceAction extends ControlPanelAction {
             getSecondaryDrawableFace().getHumanFace().accept(visitor);
         }
         
-        getSecondaryDrawableFace().setHeatMap(calculateHausdorffDistance());
+        final Map<MeshFacet, List<Double>> hausdorffDistance = calculateHausdorffDistance();
+        getSecondaryDrawableFace().setHeatMap(hausdorffDistance);
+        
+        final DoubleSummaryStatistics distanceStats = hausdorffDistance.values()
+                .stream()
+                .flatMap(List::stream)
+                .mapToDouble(distance -> distance)
+                .summaryStatistics();
+        controlPanel.updateHausdorffDistanceStats(
+                distanceStats.getAverage(),
+                distanceStats.getMax(),
+                distanceStats.getMin()
+        );
     }
-
+    
     private Map<MeshFacet, List<Double>> calculateHausdorffDistance() {
         if (weightedDist) {
             // TODO Merge the map of distances with the map of priorities
diff --git a/GUI/src/main/java/cz/fidentis/analyst/distance/DistancePanel.java b/GUI/src/main/java/cz/fidentis/analyst/distance/DistancePanel.java
index 51a2c8d0..5f6f3dc9 100644
--- a/GUI/src/main/java/cz/fidentis/analyst/distance/DistancePanel.java
+++ b/GUI/src/main/java/cz/fidentis/analyst/distance/DistancePanel.java
@@ -12,6 +12,7 @@ import java.util.List;
 import javax.swing.ImageIcon;
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
+import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JTextField;
 
@@ -46,6 +47,8 @@ public class DistancePanel extends ControlPanel {
     public static final String STRATEGY_POINT_TO_POINT = "Point to point";
     public static final String STRATEGY_POINT_TO_TRIANGLE = "Point to triangle";
     
+    private final JLabel avgHD, maxHD, minHD;
+    
     /**
      * Constructor.
      * @param action Action listener
@@ -111,7 +114,7 @@ public class DistancePanel extends ControlPanel {
         builder.addScrollPane(featurePointsPanel);
         builder.addLine();
         
-        final JButton recomputeButton = builder.addButtonSimple(
+        final JButton recomputeButton = builder.addButton(
                 "Recompute",
                 createListener(action, ACTION_COMMAND_WEIGHTED_DIST_RECOMPUTE)
         );
@@ -151,6 +154,26 @@ public class DistancePanel extends ControlPanel {
                 createListener(action, ACTION_COMMAND_SHOW_HIDE_HEATMAP)
         ); 
         builder.addLine();
+        
+        builder.addCaptionLine("Hausdorff distance:");
+        builder.addLine();
+        
+        builder.addOptionText("Average");
+        builder.addGap();
+        avgHD = builder.addLabelLine("");
+        builder.addGap();
+        builder.addLine();
+        builder.addOptionText("Maximum");
+        builder.addGap();
+        maxHD = builder.addLabelLine("");
+        builder.addGap();
+        builder.addLine();
+        builder.addOptionText("Minimum");
+        builder.addGap();
+        minHD = builder.addLabelLine("");
+        builder.addGap();
+        builder.addLine();
+        
         builder.addVerticalStrut();
     }
     
@@ -168,4 +191,10 @@ public class DistancePanel extends ControlPanel {
         return new ImageIcon(SymmetryPanel.class.getClassLoader().getResource("/" + ICON));
     }
     
+    public void updateHausdorffDistanceStats(double averageDist, double maxDist, double minDist) {
+        avgHD.setText(Double.toString(averageDist));
+        maxHD.setText(Double.toString(maxDist));
+        minHD.setText(Double.toString(minDist));
+    }
+    
 }
-- 
GitLab