Changeset 3145 in josm for trunk


Ignore:
Timestamp:
2010-03-19T21:59:29+01:00 (10 years ago)
Author:
jttt
Message:

Do not keep width at QBLevel, simplify QuadTilling.index

Location:
trunk/src/org/openstreetmap/josm/data
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/coor/QuadTiling.java

    r3083 r3145  
    77    public static double WORLD_PARTS = (1 << NR_LEVELS);
    88
    9     public static int MAX_OBJECTS_PER_LEVEL = 16;
    10     // has to be a power of 2
    11     public static int TILES_PER_LEVEL_SHIFT = 2;
     9    public static int TILES_PER_LEVEL_SHIFT = 2; // Has to be 2. Other parts of QuadBuckets code rely on it
    1210    public static int TILES_PER_LEVEL = 1<<TILES_PER_LEVEL_SHIFT;
    1311    static public int X_PARTS = 360;
     
    9795        return (int)(mask & (quad >> total_shift));
    9896    }
    99     static public int index(LatLon coor, int level)
    100     {
     97    static public int index(LatLon coor, int level) {
    10198        // The nodes that don't return coordinates will all get
    10299        // stuck in a single tile.  Hopefully there are not too
     
    104101        if (coor == null)
    105102            return 0;
    106         long quad = coorToTile(coor);
    107         return index(level, quad);
     103
     104        long x = lon2x(coor.lon());
     105        long y = lat2y(coor.lat());
     106        int shift = NR_LEVELS-level-1;
     107        return (int)((x >> shift & 1) * 2 + (y >> shift & 1));
    108108    }
    109109}
  • trunk/src/org/openstreetmap/josm/data/osm/QuadBuckets.java

    r3083 r3145  
    6060    class QBLevel
    6161    {
    62         int level;
    63         long quad;
    64         QBLevel parent;
     62        final int level;
     63        private final BBox bbox;
     64        final long quad;
     65        final QBLevel parent;
    6566
    6667        public List<T> content;
     
    7172            return super.toString()+ "["+level+"]: " + bbox();
    7273        }
    73         public QBLevel(QBLevel parent)
    74         {
    75             init(parent);
    76         }
     74        /**
     75         * Constructor for root node
     76         */
     77        public QBLevel() {
     78            level = 0;
     79            quad = 0;
     80            parent = null;
     81            bbox = new BBox(-180, 90, 180, -90);
     82        }
     83
     84        public QBLevel(QBLevel parent, int parent_index) {
     85            this.parent = parent;
     86            this.level = parent.level + 1;
     87            int shift = (QuadBuckets.NR_LEVELS - level) * 2;
     88            long mult = 1;
     89            // Java blows the big one.  It seems to wrap when
     90            // you shift by > 31
     91            if (shift >= 30) {
     92                shift -= 30;
     93                mult = 1<<30;
     94            }
     95            long this_quadpart = mult * (parent_index << shift);
     96            this.quad = parent.quad | this_quadpart;
     97            this.bbox = calculateBBox(); // calculateBBox reference quad
     98            if (debug) {
     99                out("new level["+this.level+"] bbox["+parent_index+"]: " + this.bbox()
     100                        + " coor: " + this.coor()
     101                        + " quadpart: " + Long.toHexString(this_quadpart)
     102                        + " quad: " + Long.toHexString(this.quad));
     103            }
     104        }
     105
     106        private BBox calculateBBox() {
     107            LatLon bottom_left = this.coor();
     108            double lat = bottom_left.lat() + parent.height() / 2;
     109            double lon = bottom_left.lon() + parent.width() / 2;
     110            LatLon top_right = new LatLon(lat, lon);
     111            return new BBox(bottom_left, top_right);
     112        }
     113
    77114        boolean remove_content(T o)
    78115        {
     
    535572            return Long.toHexString(quad);
    536573        }
    537         public void init(QBLevel parent)
    538         {
    539             this.parent = parent;
    540             if (parent == null) {
    541                 this.level = 0;
    542             } else {
    543                 this.level = parent.level + 1;
    544             }
    545             this.quad = 0;
    546         }
    547574        int index_of(QBLevel find_this)
    548575        {
     
    556583            return -1;
    557584        }
    558         public QBLevel(QBLevel parent, int parent_index)
    559         {
    560             this.init(parent);
    561             int shift = (QuadBuckets.NR_LEVELS - level) * 2;
    562             long mult = 1;
    563             // Java blows the big one.  It seems to wrap when
    564             // you shift by > 31
    565             if (shift >= 30) {
    566                 shift -= 30;
    567                 mult = 1<<30;
    568             }
    569             long this_quadpart = mult * (parent_index << shift);
    570             this.quad = parent.quad | this_quadpart;
    571             if (debug) {
    572                 out("new level["+this.level+"] bbox["+parent_index+"]: " + this.bbox()
    573                         + " coor: " + this.coor()
    574                         + " quadpart: " + Long.toHexString(this_quadpart)
    575                         + " quad: " + Long.toHexString(this.quad));
    576             }
    577         }
    578         /*
    579          * Surely we can calculate these efficiently instead of storing
    580          */
    581         double width = Double.NEGATIVE_INFINITY;
    582         double width()
    583         {
    584             if (width != Double.NEGATIVE_INFINITY)
    585                 return this.width;
    586             if (level == 0) {
    587                 width = this.bbox().width();
    588             } else {
    589                 width = parent.width()/2;
    590             }
    591             return width;
    592         }
    593         double height()
    594         {
    595             return width()/2;
    596         }
    597         private BBox bbox = null;
    598         public BBox bbox()
    599         {
    600             if (bbox != null)
    601                 return bbox;
    602             if (level == 0) {
    603                 bbox = new BBox(-180, 90, 180, -90);
    604             } else {
    605                 LatLon bottom_left = this.coor();
    606                 double lat = bottom_left.lat() + this.height();
    607                 double lon = bottom_left.lon() + this.width();
    608                 LatLon top_right = new LatLon(lat, lon);
    609                 bbox = new BBox(bottom_left, top_right);
    610             }
     585        double width() {
     586            return bbox.width();
     587        }
     588
     589        double height() {
     590            return bbox.height();
     591        }
     592
     593        public BBox bbox() {
    611594            return bbox;
    612595        }
     
    675658    public void clear()
    676659    {
    677         root = new QBLevel(null);
     660        root = new QBLevel();
    678661        search_cache = null;
    679662        if (debug) {
     
    717700    public void reindex()
    718701    {
    719         QBLevel newroot = new QBLevel(null);
     702        QBLevel newroot = new QBLevel();
    720703        Iterator<T> i = this.iterator();
    721704        while (i.hasNext()) {
Note: See TracChangeset for help on using the changeset viewer.