Кладка с фиксированной шириной и высотой?

я хочу что-то вроде этого

введите здесь описание изображения

контейнерная коробка имеет фиксированную ширину и высоту

размеры коробки разные, типа 1*1 или 2*1 или 3*3 и... но не больше 4 по ширине и 3 по высоте

цифры на ящиках - это индекс ящиков при загрузке

Я попытался написать алгоритм ширины этих условий

first - поставить item1 на первую позицию (0,0)

второе - первое поле создает 2 позиции: (0,1) и (1,0)

третий - item2 должен выбирать между двумя новыми позициями и помещаться в лучшую позицию для меньшего разрыва

и каждый элемент при размещении создает 2 новые позиции в левом верхнем углу и правом нижнем углу.

также я должен проверить оставшуюся площадь контейнера и области ящиков, чтобы проверить, заполнен ли контейнер или нет

и если контейнер заполнен, создайте новый контейнер и поместите туда остальные элементы

Я нашел несколько примеров того, что мой алгоритм не сработал, но я должен найти решение

возможно, сортировка этих ящиков по площади и пространству - самое простое решение

но мне это не нравится, потому что это из-за дизайна, я имею в виду большие ящики вверху и меньшие ящики внизу :( это нехорошо, плюс я хочу загрузить эти ящики на бесконечную прокрутку, тогда я не знаю, какой у меня следующий размер коробки, поэтому я не могу разместить их в зависимости от области

после того, как я сдался, я проверил все плагины о таком дизайне

как изотоп и каменная кладка, и ванильная кладка, и гридстер, и ...

Я пытался настроить изотоп

ссылка JSfiddle показывает мою попытку ссылка

<a href="#" id="good">Shuffle</a> |
<a href="#" id="bad">Original order (broken)</a>
<div id="container">
   <div class="item w1 h1">1</div>    
   <div class="item w2 h1">2</div>
   <div class="item w1 h2">3</div>
   <div class="item w1 h1">4</div>
   <div class="item w2 h2">5</div>
   <div class="item w2 h1">6</div>
   <div class="item w1 h1">7</div>
   <div class="item w1 h1">8</div>
   <div class="item w1 h2">9</div>
   <div class="item w2 h2">10</div>
   <div class="item w2 h1">11</div>
 </div>​

 #container {
   margin: 0 auto;
   border: 2px solid black;
   height: 430px;
   margin: 20px 0 0 0;}

 .item {
  float: right;
  background: #CCC;
  width: 100px;
  height: 100px;
  margin: 10px;}

 .item.w1 {
   width: 100px;}

 .item.w2 {
   width: 200px;}

 .item.h1 {
   height: 100px;}

 .item.h2 {
   height: 200px}

 .isotope,
   .isotope .isotope-item {
   -webkit-transition-duration: 0.8s;
    -moz-transition-duration: 0.8s;
      transition-duration: 0.8s;}

  .isotope {
    -webkit-transition-property: height, width;
     -moz-transition-property: height, width;
      transition-property: height, width;}


  .isotope .isotope-item {
    -webkit-transition-property: -webkit-transform, opacity;
    -moz-transition-property:    -moz-transform, opacity;
      transition-property:         transform, opacity;}​


$(function(){

$("#good").click(function() {
    $("#container").isotope('shuffle');
    return false;
});

$("#bad").click(function() {
    $("#container").isotope({'sortBy':'original-order'});
    return false;
});

$("#container").isotope({
  layoutMode: 'masonryHorizontal',
  masonryHorizontal: {
    rowHeight: 60
  }
});  });​

но кажется, что нельзя иметь фиксированную ширину и высоту одновременно

это важно для меня, потому что я хочу сохранить этот равный запас между коробками и не изменить

Я также хочу определить высоту браузера и изменить высоту только с этими тремя состояниями, а не с переменной высотой

5 рядов, 4 ряда и 3 ряда

мои вопросы:

во-первых, я буду очень рад написать этот алгоритм самостоятельно, поэтому, пожалуйста, помогите мне найти лучшее решение для этого алгоритма в деталях ??

Я пробовал много способов за последние 2 дня

во-вторых, можем ли мы настроить один из этих плагинов так, как я ожидал, и как??


person iKamy    schedule 31.12.2012    source источник


Ответы (2)


Наиболее просто использовать kd-дерево для разделения дерева на вертикальное и горизонтальное евклидово двумерное пространство. Затем вы можете упаковать прямоугольник в одно из созданных пространств и рекурсивно разделить дерево. В Интернете доступен пример плагина древовидной карты Jquery. Masonry плагина jquery может сделать то же самое, но это больше похоже на решатель 1d bin-packing. 2d-бин-упаковка намного сложнее и может также означать поворот прямоугольника. Вот пример упаковки карт освещения: http://www.blackpawn.com/texts/lightmaps/default.html. Чтобы добиться лучшей упаковки, вы можете отсортировать размеры в некотором порядке, по убыванию, возрастанию, случайному и т. д. Это также создает другую древовидную карту.

person Gigamegs    schedule 31.12.2012
comment
спасибо дорогая, не могли бы вы объяснить больше об алгоритме или дать мне несколько ссылок - person iKamy; 31.12.2012
comment
Нет. Есть ссылка, что еще нужно? - person Gigamegs; 31.12.2012
comment
Хороший. Спасибо за голосование. Я обновил свой ответ, чтобы создать разные карты освещения. - person Gigamegs; 01.01.2013

У меня была аналогичная проблема, и я написал плагин jQuery именно для этого. Могут быть сделаны некоторые уточнения, но это укажет вам правильное направление -

плагин — https://github.com/DrewDahlman/Mason

Сообщение в блоге о теории — http://www.drewdahlman.com/meusLabs/?p= 218

person Drew Dahlman    schedule 03.01.2013