2016-05-16 7 views
3

1次元配列にデータを格納し、() operatorをオーバーロードすることによって3Dブール配列を模倣するクラスを作成しました。C++で3d-indexed 1d配列をループする

bool operator()(unsigned x, unsigned y, unsigned z) const { return _data[_zSize*_ySize*x + y*_ySize + z]; } 

は(私は(x、y、z)は承知しています私は必要なすべての要素にアクセスすることができます:私はすでに私が見つけると考えるとしばらくは、例えば、コードのこの作品ができたすべてのアプローチを試してみました実際には(z、y、x)ですが、それは私にはありません)、配列を繰り返し処理しようとすると問題が発生します。 深度:3、高さ:4、幅5の3D配列を考え、すべての要素をfalseに初期化します。

11110 
01110 
01110 
01111 
:私は次のような結果を得る

for (unsigned i = 0; i < x.sx(); ++i) 
     for (unsigned j = 0; j < x.sy(); ++j) 
      for (unsigned k = 0; k < x.sz(); ++k) 
       x(i, j, k) = !x(i, j, k); 

(残りの2つの面が同じように見える)私は( - - heightsz()widthsx()戻りdepthsy())は、アレイ内のすべての値を反転しようとすると、

明らかに、いくつかの要素がアクセスされ、2回反転されます。配列を索引付けするさまざまな方法を試してみると、パターンが変わります。何が問題ですか?

+2

'y * _ySize'はおそらく' y * _zSize'です。 – Jarod42

答えて

4

正しいオペレータは

bool operator()(unsigned x, unsigned y, unsigned z) const { 
    return _data[_zSize*_ySize*x + y*_zSize + z]; 
} 
1

は私がステップサイズで一般化アプローチを与えてみましょうです。あなたは、3Dアレイを有し、アクセスは(Z、Y、X)がインデキシングにより

、iは が平面のZ数が存在し、各プレーンはサイズyであるように、マトリックスの大きさを想定し、Xで行われると仮定 、y幅、yは高さです。

まず、3D構造を視覚化して、どのように要素にアクセスする必要があるのですか。

おそらく我々は、Yは、x = 1、= 4、私たちに必要なプレーンは4面である我々は、Z = 3ここで、ゼロベースのインデックス

を使用して(3,4,1)

にアクセスするワン必須行は4番目であり、必須要素は1番目です。したがって、必要な平面に行く

:必要な行に移動するためのz *(平面の大きさ)= Z×(幅*高さ)

、行= Y×(高さ)のy *のsizeo//またはy * row_bytes

必須ポイントに移動するには、ポイントあたり3つまたは4つの値がある場合など、x * sizeof(1つのポイント)//マルチチャネルデータを追加します。

、最終的な式はサイズUCHARの点当たり3つのチャンネルデータ、すなわち3つの値、

値= Z×(幅*高さ)+ Y×(高さ)+ X *(3考慮

あろう* sizeof(uchar))

このように、値を取得すると、各ピクセル値を1つずつ抽出する必要はありません。

PS:3 * sizeof(uchar)は、3チャンネルucharデータにアクセスするためにOpenCVで一般的に使用されるVec3bのバージョンに置き換えられます。

関連する問題