Ticket #9024: quads.diff

File quads.diff, 11.3 KB (added by shinigami, 11 years ago)
  • src/org/openstreetmap/josm/data/Bounds.java

     
    364364        if (b.maxLat < minLat || b.minLat > maxLat)
    365365            return false;
    366366
    367         if (crosses180thMeridian() && !b.crosses180thMeridian()) {
    368             return intersectsLonCrossing(this, b);
    369         } else if (!crosses180thMeridian() && b.crosses180thMeridian()) {
    370             return intersectsLonCrossing(b, this);
    371         } else if (crosses180thMeridian() && b.crosses180thMeridian()) {
    372             return true;
    373         } else {
    374             return b.maxLon >= minLon && b.minLon <= maxLon;
     367        boolean bcross = b.crosses180thMeridian();
     368        if (crosses180thMeridian()){
     369            if (bcross){
     370                return true;
     371            }
     372            else {
     373                return intersectsLonCrossing(this, b);
     374            }
    375375        }
     376        else {
     377            if (bcross){
     378                return intersectsLonCrossing(b, this);
     379            }
     380            else {
     381                return b.maxLon >= minLon && b.minLon <= maxLon;
     382            }           
     383        }
    376384    }
    377385
    378386    /**
     
    389397     * @return the bounding box to Rectangle2D.Double
    390398     */
    391399    public Rectangle2D.Double asRect() {
    392         double w = maxLon-minLon + (crosses180thMeridian() ? 360.0 : 0.0);
     400        double w = maxLon - minLon + (crosses180thMeridian() ? 360.0 : 0.0);
    393401        return new Rectangle2D.Double(minLon, minLat, w, maxLat-minLat);
    394402    }
    395403
  • src/org/openstreetmap/josm/data/osm/BBox.java

     
    5050        this.ymax = copy.ymax;
    5151    }
    5252
    53     public BBox(double a_x, double a_y, double b_x, double b_y)  {
    54        
     53    public BBox(double a_x, double a_y, double b_x, double b_y) {
     54
    5555        if (a_x > b_x) {
    5656            xmax = a_x;
    5757            xmin = b_x;
     
    5959            xmax = b_x;
    6060            xmin = a_x;
    6161        }
    62        
     62
    6363        if (a_y > b_y) {
    6464            ymax = a_y;
    6565            ymin = b_y;
     
    6767            ymax = b_y;
    6868            ymin = a_y;
    6969        }
    70        
     70
    7171        sanity();
    7272    }
    7373
     
    7777            if (coor == null) {
    7878                continue;
    7979            }
    80             add(coor);
     80            addNoSanity(coor.lon(), coor.lat());
    8181        }
     82        sanity();
    8283    }
    8384
    8485    public BBox(Node n) {
     
    8889        } else {
    8990            xmin = xmax = coor.lon();
    9091            ymin = ymax = coor.lat();
     92            sanity();
    9193        }
    9294    }
    9395
    94     private void sanity()  {
     96    private void sanity() {
    9597        if (xmin < -180.0) {
    9698            xmin = -180.0;
    9799        }
    98         if (xmax >  180.0) {
    99             xmax =  180.0;
     100        if (xmax > 180.0) {
     101            xmax = 180.0;
    100102        }
    101         if (ymin <  -90.0) {
    102             ymin =  -90.0;
     103        if (ymin < -90.0) {
     104            ymin = -90.0;
    103105        }
    104         if (ymax >   90.0) {
    105             ymax =   90.0;
     106        if (ymax > 90.0) {
     107            ymax = 90.0;
    106108        }
    107109    }
    108110
     
    111113    }
    112114
    113115    /**
    114      * Extends this bbox to include the point (x, y)
     116     * Extends this bbox to include the point (x, y).
    115117     */
    116118    public void add(double x, double y) {
     119        addNoSanity(x, y);
     120        sanity();
     121    }
     122
     123    private void addNoSanity(double x, double y) {
    117124        xmin = Math.min(xmin, x);
    118125        xmax = Math.max(xmax, x);
    119126        ymin = Math.min(ymin, y);
    120127        ymax = Math.max(ymax, y);
    121         sanity();
    122128    }
    123129
    124130    public void add(BBox box) {
     
    131137
    132138    public void addPrimitive(OsmPrimitive primitive, double extraSpace) {
    133139        BBox primBbox = primitive.getBBox();
    134         add(primBbox.xmin - extraSpace, primBbox.ymin - extraSpace);
    135         add(primBbox.xmax + extraSpace, primBbox.ymax + extraSpace);
     140        addNoSanity(primBbox.xmin - extraSpace, primBbox.ymin - extraSpace);
     141        addNoSanity(primBbox.xmax + extraSpace, primBbox.ymax + extraSpace);
     142        sanity();
    136143    }
    137144
    138145    public double height() {
    139         return ymax-ymin;
     146        return ymax - ymin;
    140147    }
    141148
    142149    public double width() {
    143         return xmax-xmin;
     150        return xmax - xmin;
    144151    }
    145152
    146153    /**
     
    148155     * this bbox.
    149156     */
    150157    public boolean bounds(BBox b) {
    151         if (!(xmin <= b.xmin) ||
    152                 !(xmax >= b.xmax) ||
    153                 !(ymin <= b.ymin) ||
    154                 !(ymax >= b.ymax))
     158        if (!(xmin <= b.xmin) || !(xmax >= b.xmax) || !(ymin <= b.ymin) || !(ymax >= b.ymax))
    155159            return false;
    156160        return true;
    157161    }
     
    160164     * Tests, weather the Point c lies within the bbox.
    161165     */
    162166    public boolean bounds(LatLon c) {
    163         if ((xmin <= c.lon()) &&
    164                 (xmax >= c.lon()) &&
    165                 (ymin <= c.lat()) &&
    166                 (ymax >= c.lat()))
     167        if ((xmin <= c.lon()) && (xmax >= c.lon()) && (ymin <= c.lat()) && (ymax >= c.lat()))
    167168            return true;
    168169        return false;
    169170    }
     
    237238    }
    238239
    239240    public LatLon getCenter() {
    240         return new LatLon(ymin + (ymax-ymin)/2.0, xmin + (xmax-xmin)/2.0);
     241        return new LatLon((ymin + ymax) / 2, (xmin + xmax) / 2);
    241242    }
    242243
    243244    int getIndex(final int level) {
     
    259260        return idx1;
    260261    }
    261262
     263    /**
     264     * 
     265     *
     266     * @param index
     267     * @return
     268     */
     269    public BBox quadrant(int index) {
     270
     271        final double cx = (xmin + xmax) / 2;
     272        final double cy = (ymin + ymax) / 2;
     273
     274        switch (index) {
     275        case QuadBuckets.SE_INDEX:
     276            return new BBox(cx, ymin, xmax, cy);
     277        case QuadBuckets.SW_INDEX:
     278            return new BBox(xmin, ymin, cx, cy);
     279        case QuadBuckets.NE_INDEX:
     280            return new BBox(cx, cy, xmax, ymax);
     281        case QuadBuckets.NW_INDEX:
     282            return new BBox(xmin, cy, cx, ymax);
     283        }
     284
     285        return null;
     286    }
     287
    262288    @Override
    263289    public int hashCode() {
    264         return (int)(ymin * xmin);
     290        return (int) (ymin * xmin);
    265291    }
    266292
    267293    @Override
    268294    public boolean equals(Object o) {
    269295        if (o instanceof BBox) {
    270             BBox b = (BBox)o;
     296            BBox b = (BBox) o;
    271297            return b.xmax == xmax && b.ymax == ymax && b.xmin == xmin && b.ymin == ymin;
    272298        } else
    273299            return false;
     
    275301
    276302    @Override
    277303    public String toString() {
    278         return "[ x: " + xmin + " -> " + xmax +
    279         ", y: " + ymin + " -> " + ymax + " ]";
     304        return "[ x: " + xmin + " -> " + xmax + ", y: " + ymin + " -> " + ymax + " ]";
    280305    }
    281306
    282307    public String toStringCSV(String separator) {
    283         return Utils.join(separator, Arrays.asList(
    284                 LatLon.cDdFormatter.format(xmin),
    285                 LatLon.cDdFormatter.format(ymin),
    286                 LatLon.cDdFormatter.format(xmax),
    287                 LatLon.cDdFormatter.format(ymax)));
     308        return Utils.join(
     309                separator,
     310                Arrays.asList(LatLon.cDdFormatter.format(xmin), LatLon.cDdFormatter.format(ymin),
     311                        LatLon.cDdFormatter.format(xmax), LatLon.cDdFormatter.format(ymax)));
    288312    }
    289313}
  • src/org/openstreetmap/josm/data/osm/QuadBuckets.java

     
    2020 */
    2121public class QuadBuckets<T extends OsmPrimitive> implements Collection<T> {
    2222    private static final boolean consistency_testing = false;
    23     private static final int NW_INDEX = 1;
    24     private static final int NE_INDEX = 3;
    25     private static final int SE_INDEX = 2;
    26     private static final int SW_INDEX = 0;
     23   
     24    static final int NW_INDEX = 1;
     25    static final int NE_INDEX = 3;
     26    static final int SE_INDEX = 2;
     27    static final int SW_INDEX = 0;
    2728
    2829    static void abort(String s) {
    2930        throw new AssertionError(s);
     
    3536        private final int level;
    3637        private final int index;
    3738        private final BBox bbox;
    38         private final long quad;
    3939        private final QBLevel<T> parent;
    4040        private boolean isLeaf = true;
    4141
     
    8888        public QBLevel(final QuadBuckets<T> buckets) {
    8989            level = 0;
    9090            index = 0;
    91             quad = 0;
    9291            parent = null;
    9392            bbox = new BBox(-180, 90, 180, -90);
    9493            this.buckets = buckets;
     
    9998            this.level = parent.level + 1;
    10099            this.index = parent_index;
    101100            this.buckets = buckets;
    102 
    103             int shift = (QuadTiling.NR_LEVELS - level) * 2;
    104             long mult = 1;
    105             // Java blows the big one. It seems to wrap when you shift by > 31
    106             if (shift >= 30) {
    107                 shift -= 30;
    108                 mult = 1 << 30;
    109             }
    110             long this_quadpart = mult * (parent_index << shift);
    111             this.quad = parent.quad | this_quadpart;
    112             this.bbox = calculateBBox(); // calculateBBox reference quad
     101           
     102            this.bbox = parent.bbox.quadrant(parent_index);
     103           
     104            //System.out.println(parent_index + "\t" + parent.bbox + " -> " + bbox);
    113105        }
    114106
    115         private BBox calculateBBox() {
    116             LatLon bottom_left = this.coor();
    117             double lat = bottom_left.lat() + parent.height() / 2;
    118             double lon = bottom_left.lon() + parent.width() / 2;
    119             return new BBox(bottom_left.lon(), bottom_left.lat(), lon, lat);
    120         }
    121 
    122107        QBLevel<T> findBucket(BBox bbox) {
    123108            if (!hasChildren())
    124109                return this;
     
    267252        }
    268253
    269254        QBLevel<T> nextNode() {
    270             if (!this.hasChildren())
    271                 return this.nextSibling();
    272             return this.firstChild();
     255            final QBLevel<T> firstChild = this.firstChild();
     256           
     257            return firstChild != null ? firstChild : nextSibling();
    273258        }
    274259
    275260        QBLevel<T> nextContentNode() {
     
    301286        }
    302287
    303288        private void search(BBox search_bbox, List<T> result) {
    304             if (!this.bbox().intersects(search_bbox))
     289            if (!bbox.intersects(search_bbox))
    305290                return;
    306             else if (bbox().bounds(search_bbox)) {
     291            else if (bbox.bounds(search_bbox)) {
    307292                buckets.search_cache = this;
    308293            }
    309294
     
    327312            }
    328313        }
    329314
    330         public String quads() {
    331             return Long.toHexString(quad);
    332         }
    333 
    334315        int index_of(QBLevel<T> find_this) {
    335316            QBLevel<T>[] children = getChildren();
    336317            for (int i = 0; i < QuadTiling.TILES_PER_LEVEL; i++) {
     
    352333            return bbox;
    353334        }
    354335
    355         /*
    356          * This gives the coordinate of the bottom-left
    357          * corner of the box
    358          */
    359         LatLon coor() {
    360             return QuadTiling.tile2LatLon(this.quad);
    361         }
    362 
    363336        void remove_from_parent() {
    364337            if (parent == null)
    365338                return;