【问题标题】:Rectangle intersection shared edge矩形相交共享边
【发布时间】:2014-01-13 20:36:17
【问题描述】:

我正在尝试确定两个矩形是否彼此相邻。如果它们共享一条边或边的一部分,那么我想包括它们,如果它们只共享一个顶点,那么我不包括。

我尝试过使用android android.graphics.Rect,我希望intersect 方法会返回true,给我一个矩形,宽度为0,但相交边缘的点。我正在使用 andEngine 并且还尝试了 org.andengine.entity.primitive.Rectangle 的 collideswith 方法,但是即使矩形只共享一个角顶点,它也会返回 true。

有什么好的方法吗?我能想到的唯一另一种方法是尝试创建所有边缘的集合,然后查看它们是否相等或以某种方式部分相等。

这是一张展示我想要的图片。如果我点击 rect 1,那么我想返回 rects 2,3 和 4,而不是 5。

“地图”:

【问题讨论】:

  • 把它们当作一个图并持有一个邻接表怎么样?而不是你所说的边缘列表......
  • 矩形移动还是旋转?试试 x 和 y 轴的点积。
  • 不,矩形不会移动或旋转。我不熟悉点积或邻接列表,但我会去查找它们。

标签: java android andengine intersection rectangles


【解决方案1】:

听起来你需要一个新的类来做到这一点。我会取矩形每个角的坐标。然后,当您选择一个矩形时,您可以通过一次找到一侧来获得与它相邻的那些。以顶部为例,您检查哪些其他矩形具有相同高度的角。从该列表中,您可以检查两个顶角之间的至少一个点上存在哪些。因此,如果左上角是 0,3,右上角是 4,3,那么您将在 y=3 处查找角点列表。从该列表中,您可以找到 0

【讨论】:

    【解决方案2】:

    编写一个函数来查找哪些矩形与所有考虑的矩形内的矩形共享边。

    然后,将这些共享边的矩形映射到彼此。邻接表只是在代码中表示图形的一种方式。

    有时代码更容易理解,所以这里是代码。我没有对此进行测试,但它应该能让你最顺利。

    另外,我不确定你的最终目标是什么,但 here's a question 我回答说是处理矩形压缩。

    List<Rectangle> allRectangles;
    
    public boolean shareAnEdge(Rectangle r1, Rectangle r2){
        int y1 = r1.y + r1.height;
        int y2 = r2.y+r2.height;
        int x1 = r1.x+r1.width;
        int x2 = r2.x+r2.width;
        boolean topShared = (y1 == r2.y && r2.x == r1.x);
        boolean bottomShared = (y2 == r2.y && r2.x==r1.x);
        boolean rightShared = (x1 == r2.x && r2.y==r1.y);
        boolean leftShared = (x2 == r1.x && r2.y==r1.y);
        if (topShared || bottomShared || rightShared || leftShared) {
            return true;
        }
        return false;
    }
    
    public List<Rectangle> findSharedEdgesFor(Rectangle input){
        List<Rectangle> output = new List<Rectangle>();
        for(Rectangle r : allRectangles){
            if(r!=input && shareAnEdge(r, input)){
                output.add(r);
            }
        }
    }
    
    public AdjacencyList createGraph(List<Rectangle> rectangles){
        AdjacencyList graph = new AdjacencyList();
        for(Rectangle r : rectangles){
            List<Rectangle> sharedEdges = findSharedEdgesFor(r);
            for(Rectangle shared : sharedEdges){
                graph.createEdgeBetween(r, shared);
            }
        }   
    }
    

    【讨论】:

    • 感谢您的代码,我应该能够修改它以应对它们仅共享部分边缘的情况 - 例如,如果矩形 4 进一步延伸到 X 轴,那么我仍然想包括它。我的最终目标是拥有一张形状地图并知道任何相邻的形状。上面的整个地图可以被另一个矩形包围,在这种情况下,它将与所有矩形相接。
    • 明白了,但这样做的最终目的是什么?您正在构建导航网格吗?您是否使用它来剔除视觉元素?减少碰撞体积?
    • 不,这是一款益智游戏,您必须使用最少的颜色为地图着色。没有两个边界区域可以共享相同的颜色。
    • 啊,这是另一个著名的问题,图形着色。听起来是个有趣的项目!
    猜你喜欢
    • 2011-10-31
    • 2015-05-07
    • 2012-11-20
    • 1970-01-01
    • 2014-08-08
    • 2017-01-24
    • 2013-10-05
    • 2013-03-31
    • 2023-03-12
    相关资源
    最近更新 更多