Skip to content
Snippets Groups Projects
Commit fe0fb334 authored by Daniel Schramm's avatar Daniel Schramm
Browse files

Display statistics of ordinary and weighted Hausdorff distance side by side

parent af7464a1
No related branches found
No related tags found
No related merge requests found
......@@ -11,7 +11,6 @@ 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;
......@@ -39,7 +38,7 @@ public class DistanceAction extends ControlPanelAction {
private boolean relativeDist = false;
private boolean weightedDist = false;
private Map<MeshFacet, List<Double>> hausdorffDistance = null;
private Map<MeshFacet, List<Double>> weightedHausdorffDistance = null;
private final DistancePanel controlPanel;
......@@ -88,7 +87,6 @@ public class DistanceAction extends ControlPanelAction {
break;
case DistancePanel.ACTION_COMMAND_WEIGHTED_DISTANCE:
this.weightedDist = ((JToggleButton) ae.getSource()).isSelected();
this.hausdorffDistance = null; // recompute only priorities
calculateHausdorffDistance();
break;
case DistancePanel.ACTION_COMMAND_DISTANCE_RECOMPUTE:
......@@ -126,33 +124,27 @@ public class DistanceAction extends ControlPanelAction {
true);
getSecondaryDrawableFace().getHumanFace().accept(visitor);
weightedHausdorffDistance = getWeightedDistance();
// Update GUI elements that display the calculated Hausdorff distance metrics
setFeaturePointWeigths();
hausdorffDistance = null;
}
// Update GUI elements that display the calculated Hausdorff distance
if (hausdorffDistance == null) {
hausdorffDistance = getWeightedDistance();
setHausdorffDistanceStatistics();
}
getSecondaryDrawableFace().setHeatMap(hausdorffDistance);
getSecondaryDrawableFace().setHeatMap(weightedDist ? weightedHausdorffDistance : visitor.getDistances());
}
/**
* Calculates weighted (or regular) Hausdorff distance of the face.
* Calculates weighted Hausdorff distance of the face.
*
* @return weighted Hausdorff distance
*/
private Map<MeshFacet, List<Double>> getWeightedDistance() {
if (!weightedDist) {
return visitor.getDistances();
}
// Merge the map of distances with the map of priorities
final Map<MeshFacet, List<Double>> weightedDistances = new HashMap<>(visitor.getDistances());
final Map<MeshFacet, List<Double>> mergedPriorities = visitor.getMergedPriorities()
.get(getSecondaryDrawableFace().getHumanFace());
// Merge the map of distances with the map of priorities
for (final Map.Entry<MeshFacet, List<Double>> facetPriorities: mergedPriorities.entrySet()) {
weightedDistances.merge(
facetPriorities.getKey(),
......@@ -166,24 +158,6 @@ public class DistanceAction extends ControlPanelAction {
return weightedDistances;
}
/**
* Updates the GUI elements of {@link DistancePanel} elements that display
* statistical data about the calculated Hausdorff distance.
*/
private void setHausdorffDistanceStatistics() {
final DoubleSummaryStatistics distanceStats = hausdorffDistance.values()
.stream()
.flatMap(List::stream)
.mapToDouble(distance -> distance)
.summaryStatistics();
controlPanel.updateHausdorffDistanceStats(
distanceStats.getAverage(),
distanceStats.getMax(),
distanceStats.getMin()
);
}
/**
* Updates the GUI elements of {@link DistancePanel} that display
......@@ -205,6 +179,27 @@ public class DistanceAction extends ControlPanelAction {
.average()
.orElse(Double.NaN))));
}
/**
* Updates the GUI elements of {@link DistancePanel} elements that display
* statistical data about the calculated Hausdorff distance.
*/
private void setHausdorffDistanceStatistics() {
controlPanel.updateHausdorffDistanceStats(
visitor.getDistances()
.values()
.stream()
.flatMap(List::stream)
.mapToDouble(distance -> distance)
.summaryStatistics(),
weightedHausdorffDistance
.values()
.stream()
.flatMap(List::stream)
.mapToDouble(distance -> distance)
.summaryStatistics()
);
}
/**
* Changes the colour of the secondary face's feature point at the given index.
......
......@@ -8,6 +8,7 @@ import cz.fidentis.analyst.scene.DrawableFeaturePoints;
import cz.fidentis.analyst.symmetry.SymmetryPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.DoubleSummaryStatistics;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -51,7 +52,7 @@ public class DistancePanel extends ControlPanel {
public static final String STRATEGY_POINT_TO_TRIANGLE = "Point to triangle";
private final Map<FeaturePointType, JLabel> featurePointStats;
private final JLabel avgHD, maxHD, minHD;
private final JLabel avgHD, avgHDWeight, maxHD, maxHDWeight, minHD, minHDWeight;
/**
* Constructor.
......@@ -81,14 +82,6 @@ public class DistancePanel extends ControlPanel {
builder.addGap();
builder.addLine();
builder.addCheckBoxOptionLine(
null,
"Weighted Hausdorff distance",
false,
createListener(action, ACTION_COMMAND_WEIGHTED_DISTANCE)
);
builder.addLine();
final JPanel featurePointsPanel = new JPanel();
final ControlPanelBuilder fpBuilder = new ControlPanelBuilder(featurePointsPanel);
featurePointStats = new HashMap<>(featurePoints.size());
......@@ -138,23 +131,39 @@ public class DistancePanel extends ControlPanel {
);
builder.addLine();
builder.addCheckBoxOptionLine(
null,
"Weighted Hausdorff distance",
false,
createListener(action, ACTION_COMMAND_WEIGHTED_DISTANCE)
);
builder.addLine();
builder.addCaptionLine("Hausdorff distance:");
builder.addLine();
builder.addOptionText("");
builder.addOptionText("Hausdorff distance");
builder.addOptionText("Weighted Hasudorff distance");
builder.addLine();
builder.addOptionText("Average");
builder.addGap();
avgHD = builder.addLabelLine("");
builder.addGap();
builder.addGap();
avgHDWeight = builder.addLabelLine("");
builder.addLine();
builder.addOptionText("Maximum");
builder.addGap();
maxHD = builder.addLabelLine("");
builder.addGap();
builder.addGap();
maxHDWeight = builder.addLabelLine("");
builder.addLine();
builder.addOptionText("Minimum");
builder.addGap();
minHD = builder.addLabelLine("");
builder.addGap();
builder.addGap();
minHDWeight = builder.addLabelLine("");
builder.addLine();
builder.addVerticalStrut();
......@@ -177,14 +186,19 @@ public class DistancePanel extends ControlPanel {
/**
* Updates GUI elements that display statistical data about the calculated Hausdorff distance.
*
* @param averageDist Average distance
* @param maxDist Maximum distance
* @param minDist Minimum distance
* @param hausdorffDistance Statistical data of the ordinary Hausdorff distance
* @param weightedHausdorffDistance Statistical data of the weighted Hausdorff distance
*/
public void updateHausdorffDistanceStats(double averageDist, double maxDist, double minDist) {
avgHD.setText(Double.toString(averageDist));
maxHD.setText(Double.toString(maxDist));
minHD.setText(Double.toString(minDist));
public void updateHausdorffDistanceStats(DoubleSummaryStatistics hausdorffDistance,
DoubleSummaryStatistics weightedHausdorffDistance) {
avgHD.setText(Double.toString(hausdorffDistance.getAverage()));
avgHDWeight.setText(Double.toString(weightedHausdorffDistance.getAverage()));
maxHD.setText(Double.toString(hausdorffDistance.getMax()));
maxHDWeight.setText(Double.toString(weightedHausdorffDistance.getMax()));
minHD.setText(Double.toString(hausdorffDistance.getMin()));
minHDWeight.setText(Double.toString(weightedHausdorffDistance.getMin()));
}
/**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment