Storing objects for locating by x,y coordinates

后端 未结 6 1550
失恋的感觉
失恋的感觉 2020-12-01 09:30

I\'m trying to determine a fast way of storing a set of objects, each of which have an x and y coordinate value, such that I can quickly retrieve all objects within a certai

相关标签:
6条回答
  • 2020-12-01 10:07

    Have a look at Kd-Trees.

    0 讨论(0)
  • 2020-12-01 10:15

    Quadtrees seem to solve the specific problem I asked. Kd-Trees are a more general form, for any number of dimensions, rather than just two.

    R-Trees may also be useful if the objects being stored have a bounding rectangle, rather than being just a simple point.

    The general term for these type of structures is Spatial Index.

    There is a Java implementation of Quadtree and R-Tree.

    0 讨论(0)
  • 2020-12-01 10:17

    Simple QuadTree implementation in C# (easy to translate into java) http://www.codeproject.com/KB/recipes/QuadTree.aspx

    0 讨论(0)
  • 2020-12-01 10:27

    The general term is a Spatial Index. I guess you should choose according to the existing implementations.

    0 讨论(0)
  • 2020-12-01 10:28

    A quadtree is the structure which is usually used for that.

    0 讨论(0)
  • 2020-12-01 10:31

    You could put all the x cords in a map, and the y cords in another map, and have the map values point to the object.

            TreeMap<Integer, TreeMap<Integer, Point>> xMap = new TreeMap<Integer, TreeMap<Integer, Point>>();
            for (int x = 1; x < 100; x += 2)
                for (int y = 0; y < 100; y += 2)
                    {
                        Point p = new Point(x, y);
                        TreeMap<Integer, Point> tempx = xMap.get(x);
                        if (tempx == null)
                            {
                                tempx = new TreeMap<Integer, Point>();
                                xMap.put(x, tempx);
                            }
                        tempx.put(y, p);
                    }
            SortedMap<Integer, TreeMap<Integer, Point>> tempq = xMap.subMap(5, 8);
            Collection<Point> result = new HashSet<Point>();
            for (TreeMap<Integer, Point> smaller : tempq.values())
                {
                    SortedMap<Integer, Point> smallerYet = smaller.subMap(6, 12);
                    result.addAll(smallerYet.values());
                }
            for (Point q : result)
                {
                    System.out.println(q);
                }
        }
    
    0 讨论(0)
提交回复
热议问题