3

行列がありm = zeros(1000, 1000)ます。この行列内で、行列から2点を通る線の推定値を描きたいと思います。x = [122 455];と言いましょうy = [500 500];

Matlabでこれを行うにはどうすればよいですか?これを行うための事前定義された関数はありますか?Matlab2012bを使用しています。

4

3 に答える 3

6

2 つのエンドポイントをp1and とp2表記xyます。p1また、 andの最初の座標p2xで、2 番目の座標は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 に答える