2015-09-25 152 views
1

這是我的問題陳述:在特定點之間找到三維空間中最短(最快)的路徑

我有一個具有指定尺寸的立方體。隨着時間的推移,這個立方體會產生一些球。我模擬了座標(x,y,z位置),球的生成時間和大小。現在,我需要找到將立方體頂部連接到底部的重疊球的最短路徑,並找出此路徑完成的時間。

我想到現在是找到所有點之間的歐式距離和球半徑的總和。然後將距離與總和進行比較以找到重疊矩陣。然後找到頂部的z尺寸小於0且z +尺寸大於立方體深度的所有對象,然後找到路徑。 我很欣賞任何幫助和想法提前。

例如考慮以下數據和我已經開發到現在的代碼:

offspr_x = [1 3 5 1 2] 
offspr_y = [3 3 1 8 2] 
offspr_z = [1 4 5 3 2] 
size = [2 1 4 6 3] 
time = [2 5 6 3 8] 

Pos= [offspr_x' offspr_y' offspr_z'] 
dd=pdist(Pos,'euclidean') 
ddm = squareform(dd) 


% compute similar matrix based on sum of object sizes (assumes size is radius) 

drad = meshgrid(size)+ meshgrid(size)'; 
dadj = ddm.*(ddm <= drad); 

現在我需要的重疊矩陣轉換爲圖形對象,並設法找到那些之間的最短路徑指向該offspr_z尺寸< 0(在頂部的所有對象具有z尺寸小於0)和offspr_z +大小> 5(在底部對象具有Z +尺寸大於5):

starts = find(offspr_z-size < 0) 
ends = find(offspr_z+size > 5) 

UPDATE:作爲@beaker建議,我也試過弗洛伊德 - 華沙​​,這裏是代碼塔T I使用:

function D = FastFloyd(D) 

n = size(D, 1); 

for k=1:n 

    i2k = repmat(D(:,k), 1, n); 
    k2j = repmat(D(k,:), n, 1); 

    D = min(D, i2k+k2j); 

end 

end 

因此,對於:

dadj(dadj==0)=Inf 
D = FastFloyd(dadj) 

我得到了以下結果:

D = 

3.4641 4.1815 6.0000 5.3852 1.7321 
4.1815 4.8990 3.0000 5.4772 2.4495 
6.0000 3.0000 6.0000 8.3066 4.3589 
5.3852 5.4772 8.3066 10.7703 6.1644 
1.7321 2.4495 4.3589 6.1644 3.4641 

但我需要找到起點和終點之間的最短(最快)路徑矢量(這些點與立方體的上下表面重疊)。我說最快,因爲我不感興趣的最小距離,但在一代人的時間最少...

+1

歡迎堆棧溢出!開放式的「如何」問題很難回答,並傾向於產生後續討論。爲了提高獲得有用答案的機會,請編輯您的問題,以更好地關注您面臨的具體問題。 – IKavanagh

+0

@IKavanagh我試圖讓它更具體.. – Ninaa

+0

@Ninaa這是完全不同的。編輯應該只澄清並給出原始問題的更多細節,不要提出後續問題。請回滾編輯並將新信息置於新問題中。 – beaker

回答

0

,你已經開了個好頭:

offspr_x = [1 3 5 1 2] 
offspr_y = [3 3 1 8 2] 
offspr_z = [1 4 5 3 2] 
size = [2 1 4 6 3] 
time = [2 5 6 3 8] 

Pos= [offspr_x' offspr_y' offspr_z'] 
dd=pdist(Pos,'euclidean') 

pdist給你的距離向量。要想改變它弄成識別,使用squareform

ddm = squareform(dd) 

現在我們使用您的計算半徑矩陣,然後到鄰接矩陣:

% compute similar matrix based on sum of object sizes (assumes size is radius) 

drad = meshgrid(size)+ meshgrid(size)'; 
adj = ddm.*(ddm <= drad); 

這個發現在ddm值是少比它們各自的半徑距離大,並將其用作掩碼從ddm獲取值。

下面是輸出的測試案例:

adj = 

    0.00000 0.00000 6.00000 5.38516 1.73205 
    0.00000 0.00000 3.00000 5.47723 2.44949 
    6.00000 3.00000 0.00000 8.30662 4.35890 
    5.38516 5.47723 8.30662 0.00000 6.16441 
    1.73205 2.44949 4.35890 6.16441 0.00000 
+0

非常感謝你。所以現在,你知道我怎樣才能找到連接上表面和下表面的最短路徑?我認爲我應該將重疊矩陣轉換爲一個圖形對象,然後找到offspr_z-offspr_z <0和offspr_z + offspr_z> 4.4那些點,然後找到它們之間的路徑... – Ninaa

+0

您是否指'offspr_z-size'和' offspr_z + size'?如果是這樣,那麼我認爲這是一個很好的方法。儘管在實踐中可能更容易找到使用像Floyd-Warshall之類的全對最短路徑,並從連接上下表面的路徑中提取。 – beaker

+0

對不起,是的,我的意思是offspr_z-size和offspr_z + size。我不熟悉Floyd-Warshall,但我會檢查出來。謝謝 – Ninaa

相關問題