2015-05-11 3 views
3

Я пытаюсь создать 3d-матрицу из 1 и 0. Я хочу соединить 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]; 

Я могу сделать это в 2D, используя этот код

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?

+2

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

+0

Да, похоже, что мой ответ - это реализация линии Брешенема. Неудивительно, что у меня в голове был старый СПЕКТУЛЬНЫЙ СПЕКТ. –

ответ

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

нет это совершенно! Огромное спасибо –

Смежные вопросы