diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/LocationTrace.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/LocationTrace.java
index 8b7c82e1..51b46e91 100644
--- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/LocationTrace.java
+++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/LocationTrace.java
@@ -131,7 +131,6 @@ public class LocationTrace {
}
public final void addEntry(final long time, final double x, final double y, final double z) {
- // TODO: Consider setting the squared distance to last entry
double lastDistSq = 0.0;
if (size > 0) {
final TraceEntry latestEntry = entries[index];
@@ -144,13 +143,7 @@ public class LocationTrace {
// TODO: Think about minMergeSize (1 = never merge the first two, size = first fill the ring).
if (size > 1 && lastDistSq <= mergeDistSq) {
// TODO: Could use Manhattan, after all.
- /**
- * TODO:
- * The last entry has to be up to date, but it can lead to a "stray entry" far off the second one on time.
- * Introducing a mergeTime could also help against keeping too many outdated entries.
- * On merging conditions, checking dist/time vs. the second latest element could be feasible, supposedly with double distance.
- */
- // Only merge if last distance was not greater than mergeDist.
+ // Only merge if last distance was not greater than mergeDist, to prevent too-far-off entries.
if (latestEntry.lastDistSq <= mergeDistSq) {
// Update lastDistSq, due to shifting the elements position.
final TraceEntry secondLatest = index - 1 < 0 ? entries[index - 1 + entries.length] : entries[index - 1];
diff --git a/NCPCore/src/test/java/fr/neatmonster/nocheatplus/test/TestLocationTrace.java b/NCPCore/src/test/java/fr/neatmonster/nocheatplus/test/TestLocationTrace.java
index 89b241ec..1b6fd45f 100644
--- a/NCPCore/src/test/java/fr/neatmonster/nocheatplus/test/TestLocationTrace.java
+++ b/NCPCore/src/test/java/fr/neatmonster/nocheatplus/test/TestLocationTrace.java
@@ -3,6 +3,8 @@ package fr.neatmonster.nocheatplus.test;
import static org.junit.Assert.fail;
import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
import java.util.Random;
import org.junit.Test;
@@ -10,20 +12,42 @@ import org.junit.Test;
import fr.neatmonster.nocheatplus.checks.moving.LocationTrace;
import fr.neatmonster.nocheatplus.checks.moving.LocationTrace.TraceEntry;
import fr.neatmonster.nocheatplus.checks.moving.LocationTrace.TraceIterator;
+import fr.neatmonster.nocheatplus.utilities.StringUtil;
public class TestLocationTrace {
protected static final Random random = new Random(System.nanoTime() + 133345691);
+ /**
+ * +- radius around 0.0.
+ * @param radius
+ * @return
+ */
public static double rand(double radius) {
return rand(0.0, radius);
}
+ /**
+ * +- radius around center.
+ * @param center
+ * @param radius
+ * @return
+ */
public static double rand(double center, double radius) {
return center + 2.0 * radius * (random.nextDouble() - 0.5);
}
+ /**
+ * center +- step
+ * @param center
+ * @param step
+ * @return
+ */
+ public static double randStep(double center, double step) {
+ return center + (random.nextBoolean() ? step : -step);
+ }
+
@Test
public void testSize() {
int size = 80;
@@ -69,16 +93,17 @@ public class TestLocationTrace {
public void testMergeUpdateAlwaysDist() {
// Extreme merge dist.
int size = 80;
- double mergeDist = Math.sqrt(1000.0);
+ double mergeDist = 1000.0;
LocationTrace trace = new LocationTrace(size, mergeDist);
double x = 0;
double y = 0;
double z = 0;
trace.addEntry(0 , x, y, z);
+ // Note that entries might get split, if the distance to the second last gets too big, so the maximum number of steps must be limited.
for (int i = 0; i < 1000; i ++) {
- x = rand(x, 0.5);
- y = rand(y, 0.5);
- z = rand(z, 0.5);
+ x = randStep(x, 0.5);
+ y = randStep(y, 0.5);
+ z = randStep(z, 0.5);
trace.addEntry(i + 1, x, y, z);
if (trace.size() != 2) {
fail("Wrong size, expect 2, got instead: " + trace.size());