diff --git a/Comparison/src/main/java/cz/fidentis/analyst/icp/IcpVisitor.java b/Comparison/src/main/java/cz/fidentis/analyst/icp/IcpVisitor.java index ad34644bdacba468e57eca70b1c4faddaff2cb9a..617af6773eeca93016133d2f9297467f6609ceb6 100644 --- a/Comparison/src/main/java/cz/fidentis/analyst/icp/IcpVisitor.java +++ b/Comparison/src/main/java/cz/fidentis/analyst/icp/IcpVisitor.java @@ -244,7 +244,7 @@ public class IcpVisitor extends MeshVisitor { ); MeshFacet reducedFacet = new ReducedMeshFacet(transformedFacet, reductionStrategy); - + int currentIteration = 0; IcpTransformation transformation = null; diff --git a/Comparison/src/main/java/cz/fidentis/analyst/icp/NoReductionStrategy.java b/Comparison/src/main/java/cz/fidentis/analyst/icp/NoReductionStrategy.java index 9f40e79be7766196679677889f4f2e5de32e2277..eaa87eeeb0de264c6341222576f5c71d36e9eace 100644 --- a/Comparison/src/main/java/cz/fidentis/analyst/icp/NoReductionStrategy.java +++ b/Comparison/src/main/java/cz/fidentis/analyst/icp/NoReductionStrategy.java @@ -1,7 +1,6 @@ package cz.fidentis.analyst.icp; import cz.fidentis.analyst.mesh.core.MeshPoint; -import java.util.Collection; import java.util.List; /** diff --git a/Comparison/src/main/java/cz/fidentis/analyst/icp/RandomReductionStrategy.java b/Comparison/src/main/java/cz/fidentis/analyst/icp/RandomReductionStrategy.java index 7e747d9b129ed214f47ebb7219016ea0ff8b7396..8faed2b750c90c5b0c231bcf9cf72471df96ade0 100644 --- a/Comparison/src/main/java/cz/fidentis/analyst/icp/RandomReductionStrategy.java +++ b/Comparison/src/main/java/cz/fidentis/analyst/icp/RandomReductionStrategy.java @@ -2,11 +2,11 @@ package cz.fidentis.analyst.icp; import cz.fidentis.analyst.mesh.core.MeshPoint; import java.util.ArrayList; -import java.util.Collection; +import java.util.Arrays; +import java.util.Collections; import java.util.List; -import java.util.Random; -import java.util.SortedMap; -import java.util.TreeMap; +import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * Random reduction strategy when the mesh vertices are selected randomly. @@ -47,14 +47,27 @@ public class RandomReductionStrategy extends ReductionStrategy { return meshPoints; } - SortedMap<Integer, MeshPoint> map = new TreeMap<>(); - for (int i = 0; i < meshPoints.size(); i++) { - map.put(i, meshPoints.get(i)); - } - Random rand = new Random(); - while (map.size() > maxVertices) { - map.remove(rand.nextInt(map.size())); + + // generate randomly ordered indexes: + List<Integer> range = IntStream.range(0, meshPoints.size()).boxed().collect(Collectors.toCollection(ArrayList::new)); + Collections.shuffle(range); + + if (maxVertices < meshPoints.size()/2) { // copy indices + MeshPoint[] array = new MeshPoint[meshPoints.size()]; + range.stream().limit(maxVertices).forEach( + i -> array[i] = meshPoints.get(i) + ); + return Arrays.stream(array).filter( + p -> p != null + ).collect(Collectors.<MeshPoint>toList()); + } else { // remove indices + List<MeshPoint> copy = new ArrayList<>(meshPoints); + range.stream().limit(meshPoints.size()-maxVertices).forEach( + i -> copy.set(i, null) + ); + return copy.parallelStream().filter( + p -> p != null + ).collect(Collectors.<MeshPoint>toList()); } - return new ArrayList<>(map.values()); } } diff --git a/Comparison/src/main/java/cz/fidentis/analyst/icp/ReductionStrategy.java b/Comparison/src/main/java/cz/fidentis/analyst/icp/ReductionStrategy.java index f5fcf9b0357da82407ebe3c56b8c1c2b685f8cd1..78ce7e6a15bddcc1e2f11dd420b689e710a3ad2f 100644 --- a/Comparison/src/main/java/cz/fidentis/analyst/icp/ReductionStrategy.java +++ b/Comparison/src/main/java/cz/fidentis/analyst/icp/ReductionStrategy.java @@ -1,7 +1,6 @@ package cz.fidentis.analyst.icp; import cz.fidentis.analyst.mesh.core.MeshPoint; -import java.util.Collection; import java.util.List; /** diff --git a/GUI/src/main/java/cz/fidentis/analyst/gui/RegistrationGLEventListener.java b/GUI/src/main/java/cz/fidentis/analyst/gui/RegistrationGLEventListener.java index 7a1d03e250d5812f190af1e2033c6c86efcf2e1d..3f85e98a00a5c02eee02ed6095fb262fb765dde9 100644 --- a/GUI/src/main/java/cz/fidentis/analyst/gui/RegistrationGLEventListener.java +++ b/GUI/src/main/java/cz/fidentis/analyst/gui/RegistrationGLEventListener.java @@ -14,9 +14,7 @@ import static com.jogamp.opengl.GL2GL3.GL_LINE; import com.jogamp.opengl.GLAutoDrawable; import static com.jogamp.opengl.fixedfunc.GLMatrixFunc.GL_MODELVIEW_MATRIX; import static com.jogamp.opengl.fixedfunc.GLMatrixFunc.GL_PROJECTION_MATRIX; -import cz.fidentis.analyst.icp.Icp; import cz.fidentis.analyst.icp.IcpVisitor; -import cz.fidentis.analyst.icp.NoReductionStrategy; import cz.fidentis.analyst.icp.RandomReductionStrategy; //import cz.fidentis.analyst.face.HumanFace; import cz.fidentis.analyst.mesh.core.MeshFacet; @@ -88,7 +86,7 @@ public class RegistrationGLEventListener extends GeneralGLEventListener{ primaryModel = model; } else { - IcpVisitor icpVisitor = new IcpVisitor(primaryModel, 10, true, 0.05, new RandomReductionStrategy(0.5)); + IcpVisitor icpVisitor = new IcpVisitor(primaryModel, 10, true, 0.05, new RandomReductionStrategy(0.25)); for (MeshFacet f: model.getFacets()) { icpVisitor.visitMeshFacet(f); }