2012-04-14 7 views
2

インデックス1〜x * y * z(ここで、x、y、zは各方向のセル数)で3Dデータ構造を表す1Dベクトルを使用しています。インデックスするためには1Dベクトル - 3Dインデックス

特定のセル[XI] [YI] [ZI]、私が使用:

index = xi + x*yi + x*y*zi ; 

私の問題はある、私は他の道を行くためにどのようにうまくいかないことができます!

xi = index % x ; 

が、私は私の人生は、他人を得ることができないため..:私はXIを取得する方法を働いたと思う指数43

で表され、個々の座標を取得したいです。:/

EDIT:Hmmm。これは正しいですか?

xi = index % x; 
yi = ((index - xi)/x) % y; 
zi = ((index - xi - x*yi)/x)/y ; 
+0

あなたの編集は正解ですが、整数除算のために減算は不要です。 – SirGuy

答えて

4

これを試してください:1想像のとおり

xi = index % x; 
yi = (index/x) % y; 
zi = ((index/x)/y) % z; 

これは、簡単に一般化することができます。

+0

'%z'は不要ですが、これを一般化する方法をはっきりと示しています。天国は誰かが4,5または6次元の配列を必要とするのを禁じます! – SirGuy

+0

「彼らはチェスのプログラムで〜7次元の配列を使っていると聞いています;だれが分かっています;) '%z'は自動的な循環配列の索引付けが可能なので、悪くありません。 – Anthales

+0

サイクリック配列インデキシングを承認しているかどうかはわかりませんが、ほとんどの場合(少なくとも私にとっては)私のインデックスが私の配列よりも大きければエラーですが、サイクリングではそれを隠すことになります。他の状況では便利なのですが、それは便利ですし、私は承認します。 – SirGuy

1

一部のモジュラ演算ではこのトリックを行う必要があります。

YI、次いで
index % x = (xi + x*yi + x*y*zi) % x = xi % x, 
    but 0 <= xi < x therefore xi % x = xi. 

:そして

(index/x) % y = yi. 

最後:

index/(x * y) = zi. 

EDIT:コードで

(上記数学とは対照的に)それは次のようになります

xi = index % x; 
    yi = (index/x) % y; 
    zi = index/(x * y); 
+0

良い答え...これはコーディングサイトなので、少なくとも最後の方程式をコードに見えるように見えるかもしれませんか? (私は決してそのような代入演算子を見たことがありません) – Shep

+0

あなたは正しいです、私はちょっとしたことを忘れるほど数学的な質問を楽しむだけです。答えを編集しました – SirGuy