Loading Comparison/src/main/java/cz/fidentis/analyst/visitors/face/HausdorffDistancePrioritized.java +38 −9 Original line number Diff line number Diff line Loading @@ -16,6 +16,12 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; import javax.vecmath.Point3d; /** Loading Loading @@ -91,21 +97,35 @@ public class HausdorffDistancePrioritized extends HumanFaceVisitor { final FeaturePoint featurePoint = humanFace.getFeaturePoints().get(featurePointType.getType()); final Point3d featurePointPosition = featurePoint.getPosition(); final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); for (final MeshFacet comparedFacet: humanFace.getMeshModel().getFacets()) { comparedFacet.accept(distanceVisitor); final List<MeshPoint> vertices = comparedFacet.getVertices(); final List<Double> prioritiesList = new ArrayList<>(); for (int i = 0; i < vertices.size(); i++) { final double distance = featurePointPosition.distance(vertices.get(i).getPosition()); final double priority; if (distance > sphereRadius) { priority = 0; final List<Future<Double>> results = new ArrayList<>(vertices.size()); final List<Double> prioritiesList = new ArrayList<>(vertices.size()); for (int i = 0; i < vertices.size(); i++) { // Taking vertices in the same order as 'distanceVisitor' does final Point3d vertexPosition = vertices.get(i).getPosition(); if (inParallel() && isThreadSafe()) { results.add(executor.submit(() -> computePriority(featurePointPosition, vertexPosition))); } else { priority = 1 - distance / sphereRadius; prioritiesList.add(computePriority(featurePointPosition, vertexPosition)); } } prioritiesList.add(priority); if (inParallel() && isThreadSafe()) { executor.shutdown(); while (!executor.isTerminated()){} try { for (final Future<Double> priority: results) { prioritiesList.add(priority.get()); } } catch (final InterruptedException | ExecutionException ex) { Logger.getLogger(HausdorffDistancePrioritized.class.getName()).log(Level.SEVERE, null, ex); } } synchronized (this) { Loading @@ -113,4 +133,13 @@ public class HausdorffDistancePrioritized extends HumanFaceVisitor { } } } protected double computePriority(Point3d featurePointPosition, Point3d vertexPosition) { final double distance = featurePointPosition.distance(vertexPosition); if (distance > sphereRadius) { return 0; } return 1 - distance / sphereRadius; } } Loading
Comparison/src/main/java/cz/fidentis/analyst/visitors/face/HausdorffDistancePrioritized.java +38 −9 Original line number Diff line number Diff line Loading @@ -16,6 +16,12 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.logging.Level; import java.util.logging.Logger; import javax.vecmath.Point3d; /** Loading Loading @@ -91,21 +97,35 @@ public class HausdorffDistancePrioritized extends HumanFaceVisitor { final FeaturePoint featurePoint = humanFace.getFeaturePoints().get(featurePointType.getType()); final Point3d featurePointPosition = featurePoint.getPosition(); final ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); for (final MeshFacet comparedFacet: humanFace.getMeshModel().getFacets()) { comparedFacet.accept(distanceVisitor); final List<MeshPoint> vertices = comparedFacet.getVertices(); final List<Double> prioritiesList = new ArrayList<>(); for (int i = 0; i < vertices.size(); i++) { final double distance = featurePointPosition.distance(vertices.get(i).getPosition()); final double priority; if (distance > sphereRadius) { priority = 0; final List<Future<Double>> results = new ArrayList<>(vertices.size()); final List<Double> prioritiesList = new ArrayList<>(vertices.size()); for (int i = 0; i < vertices.size(); i++) { // Taking vertices in the same order as 'distanceVisitor' does final Point3d vertexPosition = vertices.get(i).getPosition(); if (inParallel() && isThreadSafe()) { results.add(executor.submit(() -> computePriority(featurePointPosition, vertexPosition))); } else { priority = 1 - distance / sphereRadius; prioritiesList.add(computePriority(featurePointPosition, vertexPosition)); } } prioritiesList.add(priority); if (inParallel() && isThreadSafe()) { executor.shutdown(); while (!executor.isTerminated()){} try { for (final Future<Double> priority: results) { prioritiesList.add(priority.get()); } } catch (final InterruptedException | ExecutionException ex) { Logger.getLogger(HausdorffDistancePrioritized.class.getName()).log(Level.SEVERE, null, ex); } } synchronized (this) { Loading @@ -113,4 +133,13 @@ public class HausdorffDistancePrioritized extends HumanFaceVisitor { } } } protected double computePriority(Point3d featurePointPosition, Point3d vertexPosition) { final double distance = featurePointPosition.distance(vertexPosition); if (distance > sphereRadius) { return 0; } return 1 - distance / sphereRadius; } }