亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

組段不重疊并保持良好順序

組段不重疊并保持良好順序

暮色呼如 2022-09-02 17:01:24
我試圖解決一個有趣的問題(我將用JavaScript編寫代碼,但并不重要):假設有多個視頻在不同的 y 圖層上以幾秒鐘的片段形式出現。如果視頻在時間上重疊,那么在同時播放所有視頻時,頂層的視頻將可見。現在,我有很多這樣的圖層(這就是問題所在),我想在可能的情況下合并一些圖層,所以最后我將以相同的方式直觀地顯示相同數量的視頻,但圖層更少。我將向您展示一個圖像,該圖像將提供更好的理解在這張照片中,我以11個視頻為例,在11個初始層上。例如,我們可以看到2和1可以放在同一層上,因為它們不重疊,并且在視覺上視頻將顯示相同,但是例如1和9不能放在第9層和第1層,因為7過度,并且會丟失顯示順序(z-index)如果我想在代碼中表示這一點:const orderedSegments = [  [15, 18],     // 1  [0.3, 9],     // 2  [4, 13],      // 3  [8, 14],      // 4  [1, 3],       // 5  [16, 19.5],   // 6  [4.1, 17.5],  // 7  [0, 2.9],     // 8  [2.9, 11],    // 9  [12.5, 19.4], // 10  [11.3, 12]    // 11]以下是如何看起來只有5層但具有相同顯示的可能結果之一: const expectedLayers = [      [[0.3, 9], [15, 18]],                  // 2, 1      [[1, 3], [4, 13]],                     // 5, 3      [[8, 14], [16, 19.5]],                 // 4, 6      [[0, 2.9], [4.1, 17.5]],               // 8, 7      [[2.9, 11], [11.3, 12], [12.5, 19.4]]  // 9, 11, 10 ]我想過按開始持續時間對段進行排序,然后創建1層并嘗試盡可能多地插入其中,當不可能時再創建新層...但我不知道如何正確保存順序。這就是為什么我要求看看是否有一些已知的算法可以做這樣的事情,比如在保持順序的同時合并段。感謝您的想法。
查看完整描述

2 回答

?
海綿寶寶撒

TA貢獻1809條經驗 獲得超8個贊

我注意到你打電話給你的區段,而實際上,它們不是。因此,為了消除任何混淆,我決定將它們重命名為,然后創建一個單獨的數組,該數組具有一些關于哪些段應該首先出現的邏輯。orderedSegmentsunOrderedSegmentsorderedSegments


然后,我編寫了一個小的輔助函數,該函數查看兩個段并決定它們是否相交/重疊。isOverlapping(a, b)


然后,我創建了一個數組,它將每個層作為單獨的元素(段數組)保存。layers


邏輯很簡單,如偽代碼中所述:


loop through each `segment` in `orderedSegments`:

    loop through each `layer` in `layers`:

        check if the `segment` is overlaping any of the segments in the current `layer'

        if not then insert the `segment` to the current `layer`

        if yes, then check with the other layers

        if we reach the end of layers but could not insert it in any,

           then add the segment to its own new layer

const unOrderedSegments = [

  [15, 18], // 1

  [0.3, 9], // 2

  [4, 13], // 3

  [8, 14], // 4

  [1, 3], // 5

  [16, 19.5], // 6

  [4.1, 17.5], // 7

  [0, 2.9], // 8

  [2.9, 11], // 9

  [12.5, 19.4], // 10

  [11.3, 12], // 11

];


const orderedSegments = unOrderedSegments.sort((a, b) => a[0] - b[0]);


const isOverlapping = (a, b) => {

  const check1 = a[0] > b[0] && a[0] < b[1];

  const check2 = b[0] > a[0] && b[0] < a[1];


  return check1 || check2;

};


const layers = [];


for (let i = 0; i < orderedSegments.length; i++) {

  const currentSegment = orderedSegments[i];


  let inserted = false;


  for (let j = 0; j < layers.length; j++) {

    const currentLayer = layers[j];

    let canBeInserted = true;

    for (let k = 0; k < currentLayer.length; k++) {

      const segment = currentLayer[k];


      if (isOverlapping(segment, currentSegment)) {

        canBeInserted = false;

        break;

      }

    }

    if (canBeInserted) {

      currentLayer.push(currentSegment);

      inserted = true;

      break;

    }

  }

  if (!inserted) {

    layers.push([currentSegment]);

  }

}


// print each layer on a spearate line 

// ( convert array to string )

layers.forEach((layer) => {

  let layerString = "";

  layer.forEach((segment) => {

    layerString += `[${segment[0]}-${segment[1]}]`;

  });

  console.log(layerString);

});


查看完整回答
反對 回復 2022-09-02
?
幕布斯6054654

TA貢獻1876條經驗 獲得超7個贊

const orderedSegments = [

  [15, 18],     // 1

  [0.3, 9],     // 2

  [4, 13],      // 3

  [8, 14],      // 4

  [1, 3],       // 5

  [16, 19.5],   // 6

  [4.1, 17.5],  // 7

  [0, 2.9],     // 8

  [2.9, 11],    // 9

  [12.5, 19.4], // 10

  [11.3, 12]    // 11

]


// sort array by starting time (orderedSegments[i][0])

orderedSegments.sort((a, b) => {

  if(a[0] < b[0]) return -1;

  if(a[0] > b[0]) return 1;

  return 0;

});


const newSegments = [];

while(orderedSegments.length > 0) {

  // get first element of array

  let element = orderedSegments[0];

  // all "used" items will be removed. used items are marked with -1

  if(element[0] == -1) {

    orderedSegments.shift();

    break;

  }

  // newElementGroup represents a new layer

  let newElementGroup = [];

  newElementGroup.push(element);

  for(let i = 0; i < orderedSegments.length; i++) {

    if(orderedSegments[i][0] > element[1]) {

      element = orderedSegments[i].slice();

      newElementGroup.push(element);

      // mark element as "used"

      orderedSegments[i][0] = -1;

    }

  }

  newSegments.push(newElementGroup);

  // remove first element after creating a new layer until orderedSegments is empty

  orderedSegments.shift();

}


newSegments.forEach(element => console.info(element))

我想這應該可以解決問題


查看完整回答
反對 回復 2022-09-02
  • 2 回答
  • 0 關注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號