3

我有一个矩阵m = zeros(1000, 1000)。在这个矩阵中,我想从我的矩阵中绘制穿过 2 个点的线的估计值。让我们说x = [122 455];y = [500 500];

我怎样才能在 Matlab 中做到这一点?是否有任何预定义的功能可以做到这一点?我正在使用 Matlab 2012b。

4

3 回答 3

6

我将这两个端点表示为p1andp2因为我打算使用xandy来做其他事情。我还假设p1and的第一个坐标p2x,第二个是y。所以这是一个相当简单的方法:

  1. 获得直线y = ax + b的方程。在 MATLAB 中,这可以通过以下方式完成:

    x = p1(1):p2(1)
    dx = p2(1) - p1(1);
    dy = p2(2) - p1(2);
    y = round((x - p1(1)) * dy / dx + p1(2));
    
  2. x将和的值转换为y矩阵中元素的索引,并将这些元素设置为 1。

    idx = sub2ind(size(m), y, x);
    m(idx) = 1;
    

例子

下面是一个小型 10×10 矩阵的示例:

%// This is our initial conditon
m = zeros(10);
p1 = [1, 4];
p2 = [5, 7];

%// Ensure the new x-dimension has the largest displacement
[max_delta, ix] = max(abs(p2 - p1));
iy = length(p1) - ix + 1;

%// Draw a line from p1 to p2 on matrix m
x = p1(ix):p2(ix);
y = round((x - p1(ix)) * (p2(iy) - p1(iy)) / (p2(ix) - p1(ix)) + p1(iy));
m(sub2ind(size(m), y, x)) = 1;
m = shiftdim(m, ix > iy); %// Transpose result if necessary

结果是:

m =
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     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     1     0     0     0     0     0     0     0     0
     0     0     1     1     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
     0     0     0     0     0     0     0     0     0     0
     0     0     0     0     0     0     0     0     0     0

更新:我已经修补了这个算法,使其在dy > dx时工作,方法是将具有最大位移的维度视为 x 维度,然后在必要时转置结果。

于 2013-01-29T15:36:53.097 回答
2

所提供的答案都不适用于y大于x( dy > dx) 的位移。正如所指出的,布雷森汉姆的线算法正是为此而生的。

此处提供的 matlab 文件与其他答案中提供的示例类似,但涵盖了所有用例。为了与之前提供的示例相关,可以像这样使用脚本:

% initial conditions
m = zeros(10);
p1 = [1, 4];
p2 = [5, 10];% note dy > dx
% use file provided on file exchange
[x y] = bresenham(p1(1),p1(2),p2(1),p2(2));
% replace entries in matrix m
m(sub2ind(size(m), y, x)) = 1;

结果如下所示:

m = 
    0     0     0     0     0     0     0     0     0     0
    0     0     0     0     0     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     1     0     0     0     0     0     0     0     0
    0     1     0     0     0     0     0     0     0     0
    0     0     1     0     0     0     0     0     0     0
    0     0     0     1     0     0     0     0     0     0
    0     0     0     1     0     0     0     0     0     0
    0     0     0     0     1     0     0     0     0     0
于 2016-10-06T09:16:32.010 回答
1

对我来说(matlab R2013b),以下行不起作用,当p1(1)>p2(2)(“:”不能倒数):

x = p1(1):p2(1);

E.G.:

1:10

1 2 3 4 5 6 7 8 9 10

10:1

Empty matrix: 1-by-0

但是当我改用 linspac 时它起作用了:

x = linspace(p1(1), p2(1), abs(p2(1)-p1(1))+1);
于 2014-01-08T10:58:28.370 回答