ページ 11

for文の順番を変えたい

Posted: 2015年6月30日(火) 14:33
by 小森
Win、Visual Studio
私は今3次元画像を2次平面にみて様々な処理を行っているのですが、
あまりにもプログラムが長いので上手く省略できないかと考えています。

現在は下記のように
変更したいのはfor文の順番のみなのにほとんど同じ処理を3回書いてしまっています。
これを上手くまとめることは可能なのでしょうか?
アドバイスよろしくお願いいたします。

for (int z = 0; z < 101; ++z){
     for (int y = 0; y < 101; ++y){
          for (int x = 0; x < 101; ++x){
          //XY平面として参照した様々な画像処理
          }
     }
}
//ZX平面で処理
for (int y = 0; y < 101; ++y){
for (int x = 0; x < 101; ++x){
for (int z = 0; z < 101; ++z){
//ZX平面として参照した様々な画像処理
}
}
}
//YZ平面で処理
for (int x = 0; x < 101; ++x){
     for (int z = 0; z < 101; ++z){
          for (int y = 0; y < 101; ++y){
          //YZ平面として参照した様々な画像処理
          }
     }
}





↓理想……? パターン0、1、2でfor文の回す順番を変えてくれるようにしたい……
//全ての平面
for (int pattern = 0; pattern < 3; ++pattern){
if (pattern == 0)for (int z = 0; z < 101; ++z)
if (pattern == 1)for (int y = 0; y < 101; ++y)
if (pattern == 2)for (int x = 0; x < 101; ++x)
{
if (pattern == 0)for (int y = 0; y < 101; ++y)
if (pattern == 1)for (int x = 0; x < 101; ++x)
if (pattern == 2)for (int z = 0; z < 101; ++z)
{
if (pattern == 0)for (int x = 0; z < 101; ++x)
if (pattern == 1)for (int z = 0; z < 101; ++z)
if (pattern == 2)for (int y = 0; y < 101; ++y)
{
//平面画像に対する画像処理
}



Re: for文の順番を変えたい

Posted: 2015年6月30日(火) 16:58
by みけCAT
こんな感じでしょうか? ※テストしていません

コード:

const int permutation[][3] = {
  {2, 1, 0},
  {1, 0, 2},
  {0, 2, 1}
};

for (int pattern = 0; pattern < 3; pattern++) {
  int c[3];
  for (c[0] = 0; c[0] < 101; c[0]++) {
    for (c[1] = 0; c[1] < 101; c[1]++) {
      for (c[2] = 0; c[2] < 101; c[2]++) {
        int x = c[permutation[pattern][0]];
        int y = c[permutation[pattern][1]];
        int z = c[permutation[pattern][2]];
        // 処理
      }
    }
  }
}

Re: for文の順番を変えたい

Posted: 2015年6月30日(火) 18:33
by usao
オフトピック
forをなんやかんやしてx,y,zのループの順序を変えたとしても,

>//XY平面として参照した様々な画像処理
>//ZX平面として参照した様々な画像処理
>//YZ平面として参照した様々な画像処理

の3つを,

>//平面画像に対する画像処理

という単一のコードで書かないとならないわけですよね?
(最も内側のループの中で「今がパターン1だから…」とかならないように)

コード:

int main( void )
{
	int x=-100,y=-100,z=-100;

	int *p[3][3] = {
		{ &x, &y, &z },
		{ &z, &x, &y },
		{ &y, &z, &x }
	};

	const int SIZE = 3;	//=101

	for( int ptn=0; ptn<3; ptn++ )
	{
		std::cout << "ptn " << ptn << std::endl;

		int &I = *p[ptn][0];
		int &J = *p[ptn][1];
		int &K = *p[ptn][2];

		for( K=0; K<SIZE; K++ )
		{
			for( J=0; J<SIZE; J++ )
			{
				for( I=0; I<SIZE; I++ )
				{
					//x,y,zはptnに応じた順で変化していくけど…
					std::cout << x << ", " << y << ", " << z << std::endl;

					//今どの平面に着目してるのかを知らずに処理を書けるだろうか?
				}
			}
		}
		std::cout << std::endl;
	}

	//
	//std::cin.ignore();
	return 0;
}

Re: for文の順番を変えたい

Posted: 2015年7月02日(木) 06:01
by 小森
みけCATさんusaoさんありがとうございました。
お二人のアドバイスを参考にして、無事まとめられました。
本当にありがとうございました

Re: for文の順番を変えたい

Posted: 2015年7月02日(木) 08:50
by みけCAT
解決でしたら、解決チェックをお願いします。
具体的には、投稿画面の「送信」ボタンの右にある「解決!」にチェックを入れてから返信してください。
記事の件名は変えないべきです。