Loading GUI/src/main/java/cz/fidentis/analyst/distance/DistanceAction.java +30 −35 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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: Loading Loading @@ -126,33 +124,27 @@ public class DistanceAction extends ControlPanelAction { true); getSecondaryDrawableFace().getHumanFace().accept(visitor); setFeaturePointWeigths(); hausdorffDistance = null; } weightedHausdorffDistance = getWeightedDistance(); // Update GUI elements that display the calculated Hausdorff distance if (hausdorffDistance == null) { hausdorffDistance = getWeightedDistance(); // Update GUI elements that display the calculated Hausdorff distance metrics setFeaturePointWeigths(); 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(), Loading @@ -167,24 +159,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 * the weights of feature points used to calculate the weighted Hausdorff distance. Loading @@ -206,6 +180,27 @@ public class DistanceAction extends ControlPanelAction { .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. * The index is received as the data payload of {@code actionEvent}. Loading GUI/src/main/java/cz/fidentis/analyst/distance/DistancePanel.java +33 −19 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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()); Loading Loading @@ -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(); Loading @@ -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())); } /** Loading Loading
GUI/src/main/java/cz/fidentis/analyst/distance/DistanceAction.java +30 −35 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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: Loading Loading @@ -126,33 +124,27 @@ public class DistanceAction extends ControlPanelAction { true); getSecondaryDrawableFace().getHumanFace().accept(visitor); setFeaturePointWeigths(); hausdorffDistance = null; } weightedHausdorffDistance = getWeightedDistance(); // Update GUI elements that display the calculated Hausdorff distance if (hausdorffDistance == null) { hausdorffDistance = getWeightedDistance(); // Update GUI elements that display the calculated Hausdorff distance metrics setFeaturePointWeigths(); 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(), Loading @@ -167,24 +159,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 * the weights of feature points used to calculate the weighted Hausdorff distance. Loading @@ -206,6 +180,27 @@ public class DistanceAction extends ControlPanelAction { .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. * The index is received as the data payload of {@code actionEvent}. Loading
GUI/src/main/java/cz/fidentis/analyst/distance/DistancePanel.java +33 −19 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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. Loading Loading @@ -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()); Loading Loading @@ -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(); Loading @@ -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())); } /** Loading