检查一个点阵列是否在矩形数组内?

时间:2012-08-05 14:29:56

标签: java arrays shape point

我有一个顶点列表和一个区域列表(方形/矩形)形状。顶点具有x和y坐标,并且区域具有(x,y,高度和宽度)。如何有效地检查哪个顶点位于每个顶点/区域的哪个区域?

编辑:

这是我写的代码。

                if (!g.getVertices().isEmpty()) {

                for (int i = 0; i < g.getVertices().size(); i++) {

                    Vertex v = g.getVertices().get(i);
                    Point vertexPoint = new Point(v.getX(), v.getY());

                    for (int j = 0; j < g.getNumberOfRegions(); j++) {

                        int x = g.getRegions().get(j).getX();
                        int y = g.getRegions().get(j).getY();
                        int height = g.getRegions().get(j).getHeight();
                        int width = g.getRegions().get(j).getWidth();

                        Grid regionGrid = new Grid(j+1, x, y, height, width);

                        Rectangle regionRectangle = new Rectangle(x, y, height, width);
                        if (regionRectangle.contains(vertexPoint)) {
                            System.out.println("Vertex " + v + " lies inside region " + regionGrid.getRegionID());
                        }
                    }

                }
            }

编辑2:我用它来生成区域,但是我需要一种方法来从网格中为每个区域分配一个从左到右的regionID。例如:

1 - 2 - 3
4 - 5 - 6 
7 - 8 - 9

表示3x3网格。目前它的形式如下:

1 - 1 - 1
2 - 2 - 2
3 - 3 - 3

                for (int i = 0; i < rowValue; i++) {

                for (int j = 0; j < columnValue; j++) {

                    Grid r = new Grid(0, 20 + i * size, 20 + j * size, size, size);
                    r.setRegionID(j + 1);
                    g.addRegion(r);
                }

            }

3 个答案:

答案 0 :(得分:2)

检查顶点是否在正方形或圆形内可以在O(1)中完成。你可以用库函数或基本数学来做。所以你可以创建的工作算法是O(#vertices * #regions)。您可以尝试通过X轴和Y轴对顶点和区域进行排序来优化,并尝试消除检查确定返回false。但似乎在悲观情景中你仍然会有O(#vertices * #regions)时间。

答案 1 :(得分:2)

您可以使用Core Java库本身:

    List<Rectangle2D.Double> rectangles = Arrays.asList(
                                                new Rectangle2D.Double(0d, 0d, 100d, 100d),
                                                new Rectangle2D.Double(100d, 0d, 100d, 100d),
                                                new Rectangle2D.Double(0d, 100d, 100d, 100d),
                                                new Rectangle2D.Double(100d, 100d, 100d, 100d));

    Point2D.Double aPoint = new Point2D.Double(30d, 40d);

    for (Rectangle2D.Double rectangle:rectangles){
        if (rectangle.contains(aPoint)){
            System.out.println(rectangle + " has the point " + aPoint);
        }
    }

答案 2 :(得分:1)

使用JTS时,使用平面几何体非常容易。您可以尝试将您正在使用的对象转换为特定于JTS的对象。