Index: src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java =================================================================== --- src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java (revision 1563) +++ src/uk/me/parabola/mkgmap/reader/osm/xml/Osm5XmlHandler.java (working copy) @@ -1309,29 +1309,12 @@ hNext = hFirst; Coord p; - if (hit.compareTo(hNext) < 0) { - log.info("joining: ", hit, hNext); - for (int i=hit.edge; i 0) { - log.info("joining: ", hit, hNext); - for (int i=hit.edge; i<4; i++) { - EdgeHit corner = new EdgeHit(i, 1.0); - p = corner.getPoint(seaBounds); - log.debug("way: ", corner, p); - w.addPointIfNotEqualToLastPoint(p); - } - for (int i=0; i - { - private final int edge; - private final double t; + private static class EdgeHit implements Comparable { + private final Edge edge; + private final double hitFraction; - EdgeHit(int edge, double t) { + EdgeHit(Edge edge, double hitFraction) { this.edge = edge; - this.t = t; + this.hitFraction = hitFraction; } public int compareTo(EdgeHit o) { - if (edge < o.edge) - return -1; - else if (edge > o.edge) + int edgeCmp = edge.compareTo(o.edge); + if (edgeCmp != 0) + return edgeCmp; + else if (hitFraction > o.hitFraction) return +1; - else if (t > o.t) - return +1; - else if (t < o.t) + else if (hitFraction < o.hitFraction) return -1; else return 0; @@ -1489,34 +1502,18 @@ public boolean equals(Object o) { if (o instanceof EdgeHit) { EdgeHit h = (EdgeHit) o; - return (h.edge == edge && Double.compare(h.t, t) == 0); - } - else + return (h.edge == edge && Double.compare(h.hitFraction, hitFraction) == 0); + } else return false; } Coord getPoint(Area a) { log.info("getPoint: ", this, a); - switch (edge) { - case 0: - return new Coord(a.getMinLat(), (int) (a.getMinLong() + t * (a.getMaxLong()-a.getMinLong()))); - - case 1: - return new Coord((int)(a.getMinLat() + t * (a.getMaxLat()-a.getMinLat())), a.getMaxLong()); - - case 2: - return new Coord(a.getMaxLat(), (int)(a.getMaxLong() - t * (a.getMaxLong()-a.getMinLong()))); - - case 3: - return new Coord((int)(a.getMaxLat() - t * (a.getMaxLat()-a.getMinLat())), a.getMinLong()); - - default: - throw new ExitException("illegal state"); - } + return edge.getPoint(a, hitFraction); } public String toString() { - return "EdgeHit " + edge + "@" + t; + return "EdgeHit " + edge + "@" + hitFraction; } } @@ -1535,19 +1532,15 @@ int maxLong = a.getMaxLong(); log.info(String.format("getEdgeHit: (%d %d) (%d %d %d %d)", lat, lon, minLat, minLong, maxLat, maxLong)); - if (lat <= minLat+tolerance) { - return new EdgeHit(0, ((double)(lon - minLong))/(maxLong-minLong)); - } - else if (lon >= maxLong-tolerance) { - return new EdgeHit(1, ((double)(lat - minLat))/(maxLat-minLat)); - } - else if (lat >= maxLat-tolerance) { - return new EdgeHit(2, ((double)(maxLong - lon))/(maxLong-minLong)); - } - else if (lon <= minLong+tolerance) { - return new EdgeHit(3, ((double)(maxLat - lat))/(maxLat-minLat)); - } - else + if (lat <= minLat + tolerance) { + return new EdgeHit(Edge.SOUTHERN, ((double) (lon - minLong)) / (maxLong - minLong)); + } else if (lon >= maxLong - tolerance) { + return new EdgeHit(Edge.EASTERN, ((double) (lat - minLat)) / (maxLat - minLat)); + } else if (lat >= maxLat - tolerance) { + return new EdgeHit(Edge.NORTHERN, ((double) (maxLong - lon)) / (maxLong - minLong)); + } else if (lon <= minLong + tolerance) { + return new EdgeHit(Edge.WESTERN, ((double) (maxLat - lat)) / (maxLat - minLat)); + } else return null; } @@ -1566,34 +1559,29 @@ log.info(String.format("getNextEdgeHit: (%d %d) (%d %d %d %d)", lat, lon, minLat, minLong, maxLat, maxLong)); // shortest distance to border (init with distance to southern border) int min = lat - minLat; - // number of edge as used in getEdgeHit. - // 0 = southern - // 1 = eastern - // 2 = northern - // 3 = western edge of Area a - int i = 0; + Edge edge = Edge.SOUTHERN; // normalized position at border (0..1) - double l = ((double)(lon - minLong))/(maxLong-minLong); + double l = ((double) (lon - minLong)) / (maxLong - minLong); // now compare distance to eastern border with already known distance if (maxLong - lon < min) { // update data if distance is shorter min = maxLong - lon; - i = 1; - l = ((double)(lat - minLat))/(maxLat-minLat); + edge = Edge.EASTERN; + l = ((double) (lat - minLat)) / (maxLat - minLat); } // same for northern border if (maxLat - lat < min) { min = maxLat - lat; - i = 2; - l = ((double)(maxLong - lon))/(maxLong-minLong); + edge = Edge.NORTHERN; + l = ((double) (maxLong - lon)) / (maxLong - minLong); } // same for western border if (lon - minLong < min) { - i = 3; - l = ((double)(maxLat - lat))/(maxLat-minLat); + edge = Edge.WESTERN; + l = ((double) (maxLat - lat)) / (maxLat - minLat); } // now created the EdgeHit for found values - return new EdgeHit(i, l); + return new EdgeHit(edge, l); } private void concatenateWays(List ways, Area bounds) {