2015-05-25 93 views
0

我在X-Y網格上有一個曲面Z,爲此我想用一條線找到交點。我至今使用該代碼尋找交集:找到一條線與非單調任意曲面的交點?

x_ray = x_source + t * x_dir 
y_ray = y_source + t * y_dir 
z_ray = z_source + t * z_dir 
height_above_plane = @(t) z_source + t * z_dir - interp2(X, Y, Z, ... 
    x_source + t*x_dir, y_source + t*y_dir) 
t_intercept = fzero(height_above_plane, 0); 

我的問題是,當我的面是「波浪」,該函數有幾個零交叉點,我想找到的最小了出來。 我該怎麼做? 謝謝

+0

你稱之爲不光滑的表面是什麼?如果它是「不平滑的」,你打算如何插入它? (難道你不會混淆非光滑和非單調嗎?) –

+0

我使用interp2插值它。它不平滑的意思是,該線與表面幾次相交,因爲表面是「起伏的」 – Nan

+0

我不會稱之爲不平滑的。 –

回答

0

一種可能的方法是將射線投影到XY域並繪製相應的Bresenham線。沿着這條線,每個網格單元的網格單元格,您將計算沿着射線的Z高度,並檢查它們的範圍是否與曲面高度範圍(即該單元格中的最小值和最大值)重疊。

如果是的話,你必須找到光線和插值曲面之間的三維交點,一個雙曲拋物面。如果交點落在所考慮的網格單元內,則完成。否則,沿光線繼續前進。

+0

謝謝,它是一個可能的解決方案,但是如果我想爲數百萬光線做它,它將花費太多時間 – Nan

+0

如果您不知道表面的特定屬性,則無法避免這種探索。這是一個歐米茄(N)問題,當N是一邊網格單元的數量。 –

0

將表面轉換爲matlab網格,然後使用this code