我有一个矩阵m = zeros(1000, 1000)
。在这个矩阵中,我想绘制一条从我的矩阵中经过2个点的线的估计。我们说x = [122 455];
和y = [500 500];
。
我怎样才能在Matlab中做到这一点?是否有任何预定义的功能来执行此操作?我正在使用Matlab 2012b。
答案 0 :(得分:6)
我会将两个端点表示为p1
和p2
,因为我打算将x
和y
用于其他内容。我还假设p1
和p2
的第一个坐标是 x ,第二个坐标是 y 。所以这是一个相当简单的方法:
获取行 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));
将x
和y
的值转换为矩阵中元素的索引,并将这些元素设置为1.
idx = sub2ind(size(m), y, x);
m(idx) = 1;
以下是10 x 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维度,然后在必要时转置结果。
答案 1 :(得分:2)
所提供的答案都不适用于y
中的位移大于x
(dy > dx
)中的位移。
正如所指出的那样,Bresenham的线算法正是出于此目的。
提供的matlab文件here的工作方式与其他答案中提供的示例类似,但涵盖了所有用例。 为了与之前提供的示例相关,可以像这样使用脚本:
% 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
答案 2 :(得分: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);