Я пытаюсь макет кучи перекрывающихся прямоугольников, которые начинаются вот так:выложив перекрывающиеся прямоугольники
alt text http://img690.imageshack.us/img690/209/picture1bp.png
2-проход алгоритма я придумал также грубо:
// Pass 1 - Move all rectangles to the right until they do not overlap any other rectangles
rects = getRectsSortedOnTopLeft(); // topmost first, all rects same size
foreach(rect in rects)
{
while(rect.collidingRects().size() != 0)
{
rect.x += RECT_SIZE;
}
}
Это (вероятно) заканчивается прямоугольниками, выложенными как: alt text http://img685.imageshack.us/img685/9963/picture2bc.png
Это не эстетично, поэтому Я подумал о втором проходе которые движутся бы их все еще раз налево, начиная с самого верхнего:
// Pass 2
foreach(rect in rects)
{
while(rect.x >= LEFT_MARGIN)
{
assert(rect.collidingRects().size() == 0);
rect.x -= RECT_WIDTH;
if(rect.collidingRects().size() != 0)
{
rect.x += RECT_WIDTH;
break;
}
}
}
Я думаю, что это должно в конечном итоге выглядит, как показано ниже (выглядит точно правильно на практике):
alt text http://img511.imageshack.us/img511/7059/picture3za.png
Тем не менее, я с осторожностью отношусь к этому алгоритму, потому что не уверен, правильно ли он будет правильно отображаться во всех случаях, и он может быть очень медленным. Как вы думаете, этот алгоритм может работать? Можете ли вы сделать несколько предложений по лучшему алгоритму?
ваш псевдокод нуждается в небольшой работе ... «rect.size - = RECT_SIZE;» должен быть «rect.x - = RECT_SIZE;», и вам нужно переместить его сразу после последнего левого перемещения, если это вызывает столкновение. – Sparr
Да, вы правы. Я заметил, что после реализации псевдокода. Я исправлю это в вопросе. После реализации он ведет себя очень плохо в целом: -/ – cheez
Хм, я соврал, он действительно работает очень хорошо (некоторые незначительные проблемы с прямоугольным прямоугольником).Тем не менее, порядок х не сохраняется, и мне нужно, чтобы х-порядок сохранялся как можно «максимально». – cheez