2015-05-11 30 views
3

我试图创建一个1和0的三维矩阵。我想通过在它们之间形成一行1来连接2个点(最短距离)。在多维矩阵中连接两个点

这将是这个样子,但在3D

path_pixels = [0,0,1,0,0,0,0,0,0,0,0,0,0,0,0; 

       0,0,0,1,0,0,0,0,0,0,0,0,0,0,0; 

       0,0,0,0,1,0,0,0,0,0,0,0,0,0,0]; 

我能够使用这个代码

clc; 
clear; 
%matrix size 

A = zeros(70); 
A(20,20) = 1; %arbitrary point 

B = zeros(70); 
B(40,40) = 1; %arbitrary point 

D1 = bwdist(A); 
D2 = bwdist(B); 

D_sum = D1 + D2 ; 

path_pixels = imregionalmin(D_sum); 

spy(path_pixels) 

如何展开这种方法到3d做到在2D?

+2

3D Bresenham? http://www.mathworks.com/matlabcentral/fileexchange/21057-3d-bresenham-s-line-generation – knedlsepp

+0

是的,看起来我的答案是Bresenham的实现。毫不奇怪,我记住了旧的辛克莱谱PLOT;)。 –

回答

1

这完全取决于“连接”的含义。但是,如果目标是开始点和结束点之间的一个单元格宽的区域,那么这看起来很像“一个像素宽”的线,可以将其定义如下。

% start and end point of line 
a = [1 10 2]; 
b = [4 1 9]; 

% get diffs 
ab = b - a; 

% find number of steps required to be "one pixel wide" in the shorter 
% two dimensions 
n = max(abs(ab)) + 1; 

% compute line 
s = repmat(linspace(0, 1, n)', 1, 3); 
for d = 1:3 
    s(:, d) = s(:, d) * ab(d) + a(d); 
end 

% round to nearest pixel 
s = round(s); 

% if desired, apply to a matrix 
N = 10; 
X = zeros(N, N, N); 
X(sub2ind(size(X), s(:, 1), s(:, 2), s(:, 3))) = 1; 

% or, plot 
clf 
plot3(s(:, 1), s(:, 2), s(:, 3), 'r.-') 
axis(N * [0 1 0 1 0 1]) 
grid on 

请原谅丑陋的代码,我做到了这一点急于;)。

+0

不,这是完美的!谢谢一堆 –