From 5731edaddf4a8e3a88df6c4f31107c3e1266ef30 Mon Sep 17 00:00:00 2001 From: spinachpasta <49642352+spinachpasta@users.noreply.github.com> Date: Tue, 28 Dec 2021 19:50:03 +0900 Subject: [PATCH 1/7] measure time --- .../creation/SimpleEleConstraintEnforcer.java | 37 ++++++++++++------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java index a420eb712..9ed3fef10 100644 --- a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java +++ b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -29,12 +30,12 @@ public final class SimpleEleConstraintEnforcer implements EleConstraintEnforcer * associates each EleConnector with the {@link StiffConnectorSet} * it is part of (if any) */ - private Map stiffSetMap = - new HashMap(); + private Map stiffSetMap = new HashMap(); @Override public void addConnectors(Iterable newConnectors) { - + System.out.print("addConnectors"); + Date start = new Date(); for (EleConnector c : newConnectors) { connectors.add(c); } @@ -50,13 +51,14 @@ public void addConnectors(Iterable newConnectors) { } } - + Date end = new Date(); + System.out.print("addConnectors: %d ms".formatted(end.getTime() - start.getTime())); } @Override public void requireSameEle(EleConnector c1, EleConnector c2) { - //SUGGEST (performance): a special case implementation would be faster + // SUGGEST (performance): a special case implementation would be faster requireSameEle(asList(c1, c2)); @@ -84,7 +86,8 @@ public void requireSameEle(Iterable cs) { /* return if the connectors are already in a set together */ - if (existingStiffSets.size() == 1 && looseConnectors.isEmpty()) return; + if (existingStiffSets.size() == 1 && looseConnectors.isEmpty()) + return; /* merge existing sets (if any) into a single set */ @@ -154,7 +157,7 @@ public void requireSmoothness(EleConnector from, EleConnector via, EleConnector public void enforceConstraints() { /* assign elevation to stiff sets by averaging terrain elevation */ - //TODO what for stiff sets above the ground? + // TODO what for stiff sets above the ground? for (StiffConnectorSet stiffSet : stiffSetMap.values()) { @@ -172,19 +175,25 @@ public void enforceConstraints() { } - /* TODO implement intended algorithm: + /* + * TODO implement intended algorithm: * - first assign ground ele to ON - * - then assign ele for ABOVE and BELOW based on min vertical distance constraints, and clearing + * - then assign ele for ABOVE and BELOW based on min vertical distance + * constraints, and clearing */ for (EleConnector c : connectors) { - //TODO use clearing + // TODO use clearing switch (c.groundState) { - case ABOVE: c.setPosXYZ(c.getPosXYZ().addY(5)); break; - case BELOW: c.setPosXYZ(c.getPosXYZ().addY(-5)); break; - default: //stay at ground elevation + case ABOVE: + c.setPosXYZ(c.getPosXYZ().addY(5)); + break; + case BELOW: + c.setPosXYZ(c.getPosXYZ().addY(-5)); + break; + default: // stay at ground elevation } } @@ -197,7 +206,7 @@ public void enforceConstraints() { */ private static class StiffConnectorSet implements Iterable { - //TODO maybe look for a more efficient set implementation + // TODO maybe look for a more efficient set implementation private Set connectors = new HashSet(); /** From ecaa6ebe7ed564af0b7d739598976764b9ec0616 Mon Sep 17 00:00:00 2001 From: spinachpasta <49642352+spinachpasta@users.noreply.github.com> Date: Fri, 31 Dec 2021 21:11:17 +0900 Subject: [PATCH 2/7] benchmark --- .../creation/SimpleEleConstraintEnforcer.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java index 9ed3fef10..9dffb98de 100644 --- a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java +++ b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java @@ -13,6 +13,7 @@ import java.util.Set; import org.osm2world.core.map_elevation.data.EleConnector; +import org.apache.commons.math3.stat.descriptive.rank.Median; /** * enforcer implementation that ignores many of the constraints, @@ -34,13 +35,14 @@ public final class SimpleEleConstraintEnforcer implements EleConstraintEnforcer @Override public void addConnectors(Iterable newConnectors) { - System.out.print("addConnectors"); + System.out.println("addConnectors"); Date start = new Date(); for (EleConnector c : newConnectors) { connectors.add(c); } - /* connect connectors */ + EleConnector[] connectorArray = (EleConnector[]) connectors.toArray(); + Median median = new Median(); for (EleConnector c1 : newConnectors) { for (EleConnector c2 : connectors) { @@ -52,7 +54,7 @@ public void addConnectors(Iterable newConnectors) { } } Date end = new Date(); - System.out.print("addConnectors: %d ms".formatted(end.getTime() - start.getTime())); + System.out.println("addConnectors: %d ms".formatted(end.getTime() - start.getTime())); } @Override From 8fd0973f5394c38cbee837ca432669b65f36606a Mon Sep 17 00:00:00 2001 From: spinachpasta <49642352+spinachpasta@users.noreply.github.com> Date: Sat, 1 Jan 2022 04:28:22 +0900 Subject: [PATCH 3/7] implemtation with KdTree class. Contains Bugs --- .../creation/SimpleEleConstraintEnforcer.java | 38 ++++++++++++++++--- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java index 9dffb98de..717ae8e82 100644 --- a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java +++ b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java @@ -13,7 +13,12 @@ import java.util.Set; import org.osm2world.core.map_elevation.data.EleConnector; +import org.osm2world.core.math.VectorXZ; import org.apache.commons.math3.stat.descriptive.rank.Median; +import org.locationtech.jts.geom.Coordinate; +import org.locationtech.jts.geom.Envelope; +import org.locationtech.jts.index.kdtree.KdNode; +import org.locationtech.jts.index.kdtree.KdTree; /** * enforcer implementation that ignores many of the constraints, @@ -41,20 +46,43 @@ public void addConnectors(Iterable newConnectors) { connectors.add(c); } /* connect connectors */ - EleConnector[] connectorArray = (EleConnector[]) connectors.toArray(); - Median median = new Median(); + int count=0; + // build Kd-tree + + KdTree kdTree = new KdTree(); + for (EleConnector c : newConnectors) { + Coordinate co = new Coordinate(c.pos.x, c.pos.z); + kdTree.insert(co, c); + } for (EleConnector c1 : newConnectors) { - for (EleConnector c2 : connectors) { - + Coordinate co = new Coordinate(c1.pos.x, c1.pos.z); + Envelope env = new Envelope(co); + env.expandBy(10); + ArrayList nodes = (ArrayList) kdTree.query(env); + for (KdNode node : nodes) { + EleConnector c2 = (EleConnector) node.getData(); if (c1 != c2 && c1.connectsTo(c2)) { requireSameEle(c1, c2); + count++; } - } } + // for (EleConnector c1 : newConnectors) { + // for (EleConnector c2 : connectors) { + + // if (c1 != c2 && c1.connectsTo(c2)) { + // requireSameEle(c1, c2); + // count++; + // } + + // } + // } + //8310 + //21602 Date end = new Date(); System.out.println("addConnectors: %d ms".formatted(end.getTime() - start.getTime())); + System.out.println("count: %d".formatted(count)); } @Override From c29d7997834188dbca93994e3f386871dba45eeb Mon Sep 17 00:00:00 2001 From: spinachpasta <49642352+spinachpasta@users.noreply.github.com> Date: Sat, 1 Jan 2022 05:09:38 +0900 Subject: [PATCH 4/7] resolved overlapping points --- .../creation/SimpleEleConstraintEnforcer.java | 50 +++++++++++-------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java index 717ae8e82..0769e6eea 100644 --- a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java +++ b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java @@ -46,40 +46,48 @@ public void addConnectors(Iterable newConnectors) { connectors.add(c); } /* connect connectors */ - int count=0; + int count = 0; // build Kd-tree - + KdTree kdTree = new KdTree(); - for (EleConnector c : newConnectors) { + for (EleConnector c : connectors) { Coordinate co = new Coordinate(c.pos.x, c.pos.z); - kdTree.insert(co, c); + KdNode node = kdTree.query(co); + if (node == null) { + ArrayList cs = new ArrayList(); + cs.add(c); + kdTree.insert(co, cs); + } else { + ArrayList cs = (ArrayList) node.getData(); + cs.add(c); + System.out.println(cs.size()); + } } for (EleConnector c1 : newConnectors) { Coordinate co = new Coordinate(c1.pos.x, c1.pos.z); - Envelope env = new Envelope(co); - env.expandBy(10); - ArrayList nodes = (ArrayList) kdTree.query(env); - for (KdNode node : nodes) { - EleConnector c2 = (EleConnector) node.getData(); + KdNode node = kdTree.query(co); + ArrayList cs = (ArrayList) node.getData(); + for (EleConnector c2 : cs) { if (c1 != c2 && c1.connectsTo(c2)) { requireSameEle(c1, c2); count++; } } } - // for (EleConnector c1 : newConnectors) { - // for (EleConnector c2 : connectors) { - - // if (c1 != c2 && c1.connectsTo(c2)) { - // requireSameEle(c1, c2); - // count++; - // } - - // } - // } - //8310 - //21602 + /* + for (EleConnector c1 : newConnectors) { + for (EleConnector c2 : connectors) { + + if (c1 != c2 && c1.connectsTo(c2)) { + requireSameEle(c1, c2); + count++; + } + + } + }*/ + // 8310 + // 21602 Date end = new Date(); System.out.println("addConnectors: %d ms".formatted(end.getTime() - start.getTime())); System.out.println("count: %d".formatted(count)); From d73727d5a5b30cb2072f54c91323827c44e9fa47 Mon Sep 17 00:00:00 2001 From: spinachpasta <49642352+spinachpasta@users.noreply.github.com> Date: Sat, 1 Jan 2022 05:13:17 +0900 Subject: [PATCH 5/7] removed print and added comments --- .../creation/SimpleEleConstraintEnforcer.java | 26 +++---------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java index 0769e6eea..fc569bcf0 100644 --- a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java +++ b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java @@ -45,11 +45,8 @@ public void addConnectors(Iterable newConnectors) { for (EleConnector c : newConnectors) { connectors.add(c); } - /* connect connectors */ - int count = 0; - - // build Kd-tree - + /* build Kd-tree */ + /* ArrayList is stored in the KdNode */ KdTree kdTree = new KdTree(); for (EleConnector c : connectors) { Coordinate co = new Coordinate(c.pos.x, c.pos.z); @@ -61,9 +58,9 @@ public void addConnectors(Iterable newConnectors) { } else { ArrayList cs = (ArrayList) node.getData(); cs.add(c); - System.out.println(cs.size()); } } + /* connect connectors */ for (EleConnector c1 : newConnectors) { Coordinate co = new Coordinate(c1.pos.x, c1.pos.z); KdNode node = kdTree.query(co); @@ -71,26 +68,9 @@ public void addConnectors(Iterable newConnectors) { for (EleConnector c2 : cs) { if (c1 != c2 && c1.connectsTo(c2)) { requireSameEle(c1, c2); - count++; } } } - /* - for (EleConnector c1 : newConnectors) { - for (EleConnector c2 : connectors) { - - if (c1 != c2 && c1.connectsTo(c2)) { - requireSameEle(c1, c2); - count++; - } - - } - }*/ - // 8310 - // 21602 - Date end = new Date(); - System.out.println("addConnectors: %d ms".formatted(end.getTime() - start.getTime())); - System.out.println("count: %d".formatted(count)); } @Override From f2ddc01c27be3d2f08ee1eb119b09b2f8d4f18ac Mon Sep 17 00:00:00 2001 From: spinachpasta <49642352+spinachpasta@users.noreply.github.com> Date: Sat, 1 Jan 2022 05:14:46 +0900 Subject: [PATCH 6/7] removed print and unnecessary codes --- .../map_elevation/creation/SimpleEleConstraintEnforcer.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java index fc569bcf0..942368abd 100644 --- a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java +++ b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java @@ -40,8 +40,6 @@ public final class SimpleEleConstraintEnforcer implements EleConstraintEnforcer @Override public void addConnectors(Iterable newConnectors) { - System.out.println("addConnectors"); - Date start = new Date(); for (EleConnector c : newConnectors) { connectors.add(c); } From 0ab6c51c50607c809c6f50e196ad2fb0f3619fbf Mon Sep 17 00:00:00 2001 From: spinachpasta <49642352+spinachpasta@users.noreply.github.com> Date: Sat, 1 Jan 2022 14:05:59 +0900 Subject: [PATCH 7/7] removed unnecessary changes --- .../creation/SimpleEleConstraintEnforcer.java | 30 ++++++++----------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java index 942368abd..867d93e0f 100644 --- a/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java +++ b/src/main/java/org/osm2world/core/map_elevation/creation/SimpleEleConstraintEnforcer.java @@ -36,7 +36,8 @@ public final class SimpleEleConstraintEnforcer implements EleConstraintEnforcer * associates each EleConnector with the {@link StiffConnectorSet} * it is part of (if any) */ - private Map stiffSetMap = new HashMap(); + private Map stiffSetMap = + new HashMap(); @Override public void addConnectors(Iterable newConnectors) { @@ -74,7 +75,7 @@ public void addConnectors(Iterable newConnectors) { @Override public void requireSameEle(EleConnector c1, EleConnector c2) { - // SUGGEST (performance): a special case implementation would be faster + //SUGGEST (performance): a special case implementation would be faster requireSameEle(asList(c1, c2)); @@ -102,8 +103,7 @@ public void requireSameEle(Iterable cs) { /* return if the connectors are already in a set together */ - if (existingStiffSets.size() == 1 && looseConnectors.isEmpty()) - return; + if (existingStiffSets.size() == 1 && looseConnectors.isEmpty()) return; /* merge existing sets (if any) into a single set */ @@ -173,7 +173,7 @@ public void requireSmoothness(EleConnector from, EleConnector via, EleConnector public void enforceConstraints() { /* assign elevation to stiff sets by averaging terrain elevation */ - // TODO what for stiff sets above the ground? + //TODO what for stiff sets above the ground? for (StiffConnectorSet stiffSet : stiffSetMap.values()) { @@ -191,25 +191,19 @@ public void enforceConstraints() { } - /* - * TODO implement intended algorithm: + /* TODO implement intended algorithm: * - first assign ground ele to ON - * - then assign ele for ABOVE and BELOW based on min vertical distance - * constraints, and clearing + * - then assign ele for ABOVE and BELOW based on min vertical distance constraints, and clearing */ for (EleConnector c : connectors) { - // TODO use clearing + //TODO use clearing switch (c.groundState) { - case ABOVE: - c.setPosXYZ(c.getPosXYZ().addY(5)); - break; - case BELOW: - c.setPosXYZ(c.getPosXYZ().addY(-5)); - break; - default: // stay at ground elevation + case ABOVE: c.setPosXYZ(c.getPosXYZ().addY(5)); break; + case BELOW: c.setPosXYZ(c.getPosXYZ().addY(-5)); break; + default: //stay at ground elevation } } @@ -222,7 +216,7 @@ public void enforceConstraints() { */ private static class StiffConnectorSet implements Iterable { - // TODO maybe look for a more efficient set implementation + //TODO maybe look for a more efficient set implementation private Set connectors = new HashSet(); /**