0

所以我正在尝试解决图形问题。基本上有一个容器,比方说它的 600px 宽。如果该容器中只有一个矩形(没有重叠的矩形),它将占据它的宽度。但是,问题是当这些矩形重叠时,宽度必须相应缩小。我们得到了这个矩形的左上角和左下角的 y 坐标。(例如它开始向下 60px 并在大容器向下 120 px 结束)

所以我写了一个重叠算法来检查是否存在重叠并计算矩形重叠的矩形数量(包括它自己)。然后我将容器宽度除以重叠元素的最大数量,以获得较小矩形的宽度。

    for (i = 0; i < events.length; i++) {
        var event = events[i];
        var numCollisions = 0;  
        for (j = 0; j < events.length; j++) {
            var eventCmp = events[j];
            if (event.start <= eventCmp.start && event.end > eventCmp.start ||
                event.start < eventCmp.end && event.end >= eventCmp.end) {
            numCollisions++;   
        }
    }

但是,我注意到这有一个很大的问题。如果你看下面这张图片,最右边的矩形有两个重叠的矩形。通过我的算法,您会得到不正确的容器宽度/3(包括矩形本身)。实际答案是容器宽度/2。

在此处输入图像描述

所以问题是(在这个冗长的解释之后)我需要找出两个矩形是否水平对齐。几个小时以来,我一直在努力解决这个问题。关于我如何做到这一点的任何提示?

4

2 回答 2

0

好吧,最简单的答案是divide by 2 IF you have a collision(不关心你实际有多少碰撞)。如果你需要更复杂的东西,你能展示一个更复杂的案例吗?

于 2013-02-18T01:19:47.783 回答
0

一个不太理想但易于实施的算法是:

foreach y coord in the main container
    rects = find all rects which contain this y coord
    foreach rects as rect
       rect.maxHorizNeighbors = max(rects.length, rect.maxHorizNeighbors)

您还需要解决一些其他问题,但这应该可以帮助您开始家庭作业。特别是,在某些情况下,您可能最终会出现水平间隙。生病让你自己找到。

于 2013-02-18T01:34:18.117 回答