我正在做一個應用程序,如MS Outlook日曆,用戶可以把事件等 我有事件對象佈局根據大小等問題,因爲用戶可以拖動和重新大小事件對象在MS Outlook日曆和事件對象的大小自動設置。製作日曆如MS Outlook所需的幫助?
我需要這樣做的算法,我寫我自己的,但有幾個問題需要幫助。
此屏幕快照將顯示動態的事件對象排列。
我正在做一個應用程序,如MS Outlook日曆,用戶可以把事件等 我有事件對象佈局根據大小等問題,因爲用戶可以拖動和重新大小事件對象在MS Outlook日曆和事件對象的大小自動設置。製作日曆如MS Outlook所需的幫助?
我需要這樣做的算法,我寫我自己的,但有幾個問題需要幫助。
此屏幕快照將顯示動態的事件對象排列。
由於您使用的是Flex,所以這不是對您的問題的直接回答,但它有望讓您走上正確的道路。
試試看看FullCalendar的周視圖和日視圖是如何實現這一點的。 FullCalendar是一個jQuery插件,用於呈現完全符合您需求的日曆。
您必須從FullCalendar中提取渲染邏輯並將其轉換爲Flex中的項目。我知道JavaScript和ActionScript是非常相似的,但我從來沒有使用Flex —對不起,我不能在這方面更多的幫助。
FullCalendar的回購是here。具體來說,它看起來像AgendaView.js是你最關注的文件。
它沒有爲我工作................ – Badr 2010-12-01 07:26:13
我想你是問一個普通的對象佈局算法,對不對?
我敢肯定,這是一個NP完全問題:排列一組,如果間隔,各由一個開始和年底少列儘可能定義。
是NP完全的手段,你最好的拍攝可能正試圖尋找一切可能的安排:
我已經這樣做過,但在重新調整大小後,它無法根據需要佈置所有事件框 – Badr 2010-12-01 07:27:32
這是我如何做的:
本質上講,它是一種蠻力,而是相當快的工作,因爲有需要進一步擴大,超出的步驟不是很多事件3
var physics = [];
var step = 0.01;
var PackEvents = function(columns){
var n = columns.length;
for (var i = 0; i < n; i++) {
var col = columns[ i ];
for (var j = 0; j < col.length; j++)
{
var bubble = col[j];
bubble.w = 1/n;
bubble.x = i*bubble.w;
}
}
};
var collidesWith = function(a,b){
return b.y < a.y+a.h && b.y+b.h > a.y;
};
var intersects = function(a,b){
return b.x < a.x+a.w && b.x+b.w > a.x &&
b.y < a.y+a.h && b.y+b.h > a.y;
};
var getIntersections = function(box){
var i = [];
Ext.each(physics,function(b){
if(intersects(box,b) && b.x > box.x)
i.push(b);
});
return i;
};
var expand = function(box,off,exp){
var newBox = {
x:box.x,
y:box.y,
w:box.w,
h:box.h,
collision:box.collision,
rec:box.rec
};
newBox.x += off;
newBox.w += exp;
var i = getIntersections(newBox);
var collision = newBox.x + newBox.w > 1;
Ext.each(i,function(n){
collision = collision || expand(n,off+step,step) || n.collision;
});
if(!collision){
box.x = newBox.x;
box.w = newBox.w;
box.rec.x = box.x;
box.rec.w = box.w;
}else{
box.collision = true;
}
return collision;
};
Ext.each(columns,function(column){
var lastEventEnding = null;
var columns = [];
physics = [];
Ext.each(column,function(a){
if (lastEventEnding !== null && a.y >= lastEventEnding) {
PackEvents(columns);
columns = [];
lastEventEnding = null;
}
var placed = false;
for (var i = 0; i < columns.length; i++) {
var col = columns[ i ];
if (!collidesWith(col[col.length-1], a)) {
col.push(a);
placed = true;
break;
}
}
if (!placed) {
columns.push([a]);
}
if (lastEventEnding === null || a.y+a.h > lastEventEnding) {
lastEventEnding = a.y+a.h;
}
});
if (columns.length > 0) {
PackEvents(columns);
}
Ext.each(column,function(a){
a.box = {
x:a.x,
y:a.y,
w:a.w,
h:a.h,
collision:false,
rec:a
};
physics.push(a.box);
});
while(true){
var box = null;
for(i = 0; i < physics.length; i++){
if(!physics[i].collision){
box = physics[i];
break;
}
}
if(box === null)
break;
expand(box,0,step);
}
});
你在使用到建立你的日曆應用? (HTML + JS,WPF等) – josh3736 2010-11-22 13:40:02
我正在使用flex動作腳本 – Badr 2010-11-24 05:38:46
可以任何一步一步描述算法。 – Badr 2010-12-01 12:32:32