2014-04-23 32 views
0

我用isosurface()渲染體積數據,但現在我想將它們渲染爲點來加速速度。從Matlab中的體積數據生成scatter3()的參數

我擁有的數據是一個3D數組,代表一個3D對象。如果一個體素屬於這個對象,那麼它的值是1,否則它是零。

爲了使用scatter3(),我需要生成那些具有價值1體素座標我目前使用下面的代碼來完成這項工作:

function [ x, y, z ] = scatter3_assist(volume) 
[R, C, D] = size(volume); 
x = zeros(size(volume(:))); 
y = x; 
z = x; 
idx = 1; 
for d=1:D 
    for r=1:R 
    for c=1:C 
     if volume(r, c, d) == 0 
     x(idx) = 0; y(idx) = 0; z(idx) = 0; 
     else 
     x(idx) = C - c + 1; y(idx) = R - r + 1; z(idx) = d; 
     end 
     idx = idx + 1; 
    end 
    end 
end 
x(x==0) = []; 
y(y==0) = []; 
z(z==0) = []; 
x = x - 1; 
y = y - 1; 
z = z - 1; 
end 

返回值X,Y, z是屬於我的對象的體素的座標,然後我調用scatter3(x, y, z, '*');來渲染它。

是否有任何更有效的方法來爲scatter3()使用的特定體素生成座標?

回答

1

我會建議使用find找到你的數組中的非零項的線性指標,然後使用ind2sub轉換爲指數和執行你需要得到xy,並且z任何改造。喜歡的東西:

I = find(volume ~= 0); 
[y, x, z] = ind2sub(size(volume),I); %// note that x and y are switched as in your code above 
x = size(volume,2)-x; 
y = size(volume,1)-y; 

你需要仔細檢查xy這些操作,以確保他們等同於你的代碼做什麼。

+0

謝謝! Matlab總是提供更簡單的方法來做事情。 – shapeare