所以我正在尝试解决图形问题。基本上有一个容器,比如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。
所以问题是(在这个冗长的解释之后)我需要找到两个矩形是否水平对齐。几个小时以来,我一直在沉溺于此。有关如何做到这一点的任何提示?
答案 0 :(得分:0)
嗯,最简单的答案是divide by 2 IF you have a collision
(并不关心你实际拥有多少次碰撞)。如果你需要更复杂的东西,你能展示一个更复杂的案例吗?
答案 1 :(得分: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)
还有一些其他问题需要解决,但这应该让你开始做作业。特别是,你可能会遇到水平间隙。生病让你自己找到。