假設我在類似於Outlook的24小時日曆上繪製(StartTime,EndTime)
事件。我的目標是檢測重疊(衝突)並將其拆分,使每列佔用窗口寬度的N%,其中N =該時間幀中的衝突總數。檢測計劃程序時間軸上的衝突(算法)
我的問題是,我的算法
1) first, sort all events by StartTime
2) LOOP: looks at neighbors: CurrentEvent and NextEvent (n+1):
if NextEvent exists {
if (CurrentEvent EndTime > NextEvent StartTime) { // CONFLICT!
overlappingMode = true;
overlappingEvents.add(currentEvent); // Add to array
}
else { // NO CONFLICT
if (overlappingMode is TRUE) {
// Resolve Now
redrawOverlappingEvents(overlappingEvents);
// Reset
overlappingMode = false;
EMPTY overlappingEvents;
}
}
}
3) After the loop, also for the last element,
if (Overlap Mode is still TRUE) {
overlappingEvents.add(currentEvent); // Add to array also
// Now Resolve
redrawOverlappingEvents(overlappingStartTimes);
// Reset
overlappingMode = false;
EMPTY overlappingEvents;
}
這工作的大部分時間,但引入了某種與EndTimes的問題。例如,考慮下面的圖片:
的最後一個事件應該是4(不是3)裂集團的一部分。它並未包含在衝突分割中,因爲前一個事件的EndTime
與其StartTime
不衝突。
在StartTimes的Sorted數組中,倒數第二個事件的EndTime (4:30)
與上一個事件的StartTime (4:45)
不衝突。所以最終的事件4:45 - 6:00
沒有包含在整個Split羣組中。我應該得到跨越02:30 - 06:00
的時間區域的4列分割佈局。
我正在做這個算法,還是有更好的方法?
是啊這個工作。非常感謝!我仍然不得不考慮Max如何更新以證明這個算法是正確的 - 我會考慮正式的證明。 –
@geneb。如果你有正式的證明,請發佈!如果您需要幫助,請告訴我,我會看看我能做些什麼。 – Patrick87
嗨帕特里克,我有關於這個算法的後續問題,發佈在這裏:https://stackoverflow.com/questions/47039201/detecting-conflicts-on-a-timeline-part-2-isolate-true-overlaps Any想法?謝謝 –