Логический расчёт в JavaScript...

Discussion in 'PHP' started by Mixon, 9 Jan 2011.

  1. Mixon

    Mixon Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Есть такие данные
    Code:
    var _window_height=1000; //Высота экрана
    var _this_block_height=50; //Высота данного блока
    var _tmps=[
      [950,50],
      [850,100],
      [600,50]
    ]; //Массив из позициями блоков и высотами уже существующих блоков
    Мне нужно расчитать,куда лучше всего вставить Новый блок,между уже существующими,чтобы он не заехал на них,и был в притык к ним

    Пример: Сообщения в ICQ - когда вылазят с права окошки,когда уже есть в той или иной позиции окно - то оно идёт выше,если еще есть - еще выше,чтобы не залезть друг на друга

    но в ICQ всё совсем просто...там одинаковая высота окон,т.е. разделить размер экрана на высоту окошка и проверять не занята ли позиция...
    но моя задача гараздо сложнее,у меня могут быть окна разной высоты и стоять в разных позициях (одно может пропасть а 2е,то что выше - остаться)

    Как расчитать свободные оптимальные промежутки между окнами чтобы его туда впихнуть (приоритет отдавать нижним позициям,т.е. расчёт с низу экрана)?

    Вот пример картинкий,для более лёгкого восприятия вопроса

    [​IMG]

    Нужно получить координаты по X и высоту Пустых блоков,с сортированием,чтобы было 1е значение массива - самый оптимальный вариант...
     
  2. Mixon

    Mixon Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    И никто не знает...((((
     
  3. SHiNiGaMi

    SHiNiGaMi Banned

    Joined:
    3 Jan 2010
    Messages:
    382
    Likes Received:
    55
    Reputations:
    15
    может запоминать в двумерный массив координаты левого нижнего и правого верхнего углов:
    Code:
    arrayWindows[0] => [0] = 100 //x1
                                      [1] = 0     //y1
                                      [2] = 0     //x2
                                      [3] = 100 //y2
    arrayWindows[1] => ... //и т.д. короче(начало системы координат в правом нижнем углу экрана)
    
    потом искать между двумя соседними окнами разницу:
    Code:
    arrayWindows[1][0] - arrayWindows[0][2];//x1 второго окна - x2 первого окна
    
    и если эта разница больше ширины окна то впихнуть окно туда. чтобы вставлять окна снизу, перебор массива нужно начать с 0. ну и при исчезновении окна удалять данные из массива.

    Геморно с реализацией, но больше пока идей нет.
     
    #3 SHiNiGaMi, 9 Jan 2011
    Last edited: 9 Jan 2011
  4. Mixon

    Mixon Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    394
    Likes Received:
    119
    Reputations:
    12
    Code:
      var _tmps=[];
      $('.mxn_modal').each(function(){
        _tmps.push([$(this).data('top'),$(this).data('height')]);
      });
    
      _tmps.sort(function(i, ii) {
        if (i[0] < ii[0])
            return 1;
        else if (i[0] > ii[0])
            return -1;
        else
            return 0;
      });
    
      var _tmp_h=_tmp.height();
    
      var _posts=[];
      
      for(var i in _tmps){
        if(i==0){
          _posts.push([$(window).height()-($(window).height()-(_tmps[i][0]+_tmps[i][1])),$(window).height()-(_tmps[i][0]+_tmps[i][1])]);
        }else if((_tmps[i-1][0]-(_tmps[i][0]+_tmps[i][1])+3)>=_tmp_h){
          _posts.push([_tmps[i][0]+_tmps[i][1],_tmps[i-1][0]-(_tmps[i][0]+_tmps[i][1])]);
          break;
        }
      }
    
      if(_tmps.length>0)_posts.push([0,_tmps[_tmps.length-1][0]]);
      
      var _position=$(window).height()-_tmp_h-3;
    
    
      for(var i in _posts){
        if(_posts[i][1]>=_tmp_h+3){
          _position=_posts[i][0]+_posts[i][1]-_tmp_h-3;
          break;
        } 
      }
    Спустя 6 часов - получилась вот такая кака...но работает=)