ページ 11

回転処理について

Posted: 2011年10月09日(日) 16:43
by rayor

Re: 回転処理について

Posted: 2011年10月09日(日) 17:00
by softya(ソフト屋)
知恵袋とマルチポストになっていますので相互リンクをお願いします。
相互リンクは、どちらの掲示板の回答者からも別の掲示板でどのような回答が行わているか分かるようにするためのものです。知恵袋の相互リンクは補足をお使いください。
詳しくはフォーラムルールご覧下さい。
http://dixq.net/board/board.html

あとこちらの掲示板は丸投げ禁止なので、穴埋め問題は自分なりの答えとなぜそれを選んだの書いていただけますか?

Re: 回転処理について

Posted: 2011年10月09日(日) 17:48
by rayor
softya(ソフト屋) さんが書きました:知恵袋とマルチポストになっていますので相互リンクをお願いします。
相互リンクは、どちらの掲示板の回答者からも別の掲示板でどのような回答が行わているか分かるようにするためのものです。知恵袋の相互リンクは補足をお使いください。
詳しくはフォーラムルールご覧下さい。
http://dixq.net/board/board.html

あとこちらの掲示板は丸投げ禁止なので、穴埋め問題は自分なりの答えとなぜそれを選んだの書いていただけますか?
突然ですが、申し訳ありません。上記の問題は、その他の掲示板にのっていないため、マルチポストになっていないと思います。
それに、穴埋め問題ですが、正解を張り付けています。しかし、なぜこれが正解かわかりません。恐れ入りますが、これでも丸投げでしょうか。

Re: 回転処理について

Posted: 2011年10月09日(日) 18:16
by softya(ソフト屋)
失礼しました。まったく同じ質問の仕方だったので同じ質問だと勘違いしておりました。申し訳ありません。

>それに、穴埋め問題ですが、正解を張り付けています。しかし、なぜこれが正解かわかりません。恐れ入りますが、これでも丸投げでしょうか。
それだと3枚目は必要ないって事ですね?穴埋めされているの訳ですから。

では肝心の考え方だけ説明します。
右90度回転のポイントは、
wrk[j][4-i] = num[j]
ですがまず行と列の添字が違うのが分かると思います。
これで面倒ですが、for( i=0; i<5 ; i++ ) {とor( j=0; j<5 ;ji++ ) {のループでwrk[?][?] = num[?][?]のパターンを全部書きだしてみてください。理解するのに必要なことなので25パターンです。
(例)
wrk[0][4] = num[0][0]
これで配列がどのようにコピーされているか手作業で書いてみると分かります。

もう一つの
num[j]=wrk[j];
については回転が終わった図形がwrkに入っているので、numに書き戻しているだけです。
「何故コピーだけで済むのか」と言えば、既に回転しているのがwrkに入っているからとしか言えません。
numを直接回転せずにwrkを使って回転させているかというとnumを壊すからです。

Re: 回転処理について

Posted: 2011年10月09日(日) 18:23
by rayor
softya(ソフト屋) さんが書きました:失礼しました。まったく同じ質問の仕方だったので同じ質問だと勘違いしておりました。申し訳ありません。



もう一つの
num[j]=wrk[j];
については回転が終わった図形がwrkに入っているので、numに書き戻しているだけです。
「何故コピーだけで済むのか」と言えば、既に回転しているのがwrkに入っているからとしか言えません。
numを直接回転せずにwrkを使って回転させているかというとnumを壊すからです。


丁寧なご回答ありがとうございます。

numを壊すことはどういうことでしょうか。

Re: 回転処理について

Posted: 2011年10月09日(日) 18:32
by softya(ソフト屋)
rayor さんが書きました:丁寧なご回答ありがとうございます。
numを壊すことはどういうことでしょうか。
タイミング的に同時に全部の添字の要素を動かすことが出来ませんから順番にコピーすることになりますが、その時に動かす前の値に動かした後の値を書きこんでしまうからです。
これも試してみれば分かります。

コード:

for( i=0; i<5 ; i++ )
 for( j=0; j<5 ;j++ ) 
  num[j][4-i] = num[i][j];
として後ろの配列コピーを止めてみてください。
プログラムは動かして、いろいろ変えてみて初めて理解できるものなので疑問があったら納得するまでいじり倒すのが正解です。

Re: 回転処理について

Posted: 2011年10月10日(月) 19:32
by rayor
softya(ソフト屋) さんが書きました:
rayor さんが書きました:丁寧なご回答ありがとうございます。
numを壊すことはどういうことでしょうか。
タイミング的に同時に全部の添字の要素を動かすことが出来ませんから順番にコピーすることになりますが、その時に動かす前の値に動かした後の値を書きこんでしまうからです。
これも試してみれば分かります。

コード:

for( i=0; i<5 ; i++ )
 for( j=0; j<5 ;j++ ) 
  num[j][4-i] = num[i][j];
として後ろの配列コピーを止めてみてください。
プログラムは動かして、いろいろ変えてみて初めて理解できるものなので疑問があったら納得するまでいじり倒すのが正解です。
ご回答ありがとうございます。上記のコードで試してみたところ、全部空白になってしまいました。実行の流れはどうなっているのでしょうか。たびたびの質問で申し訳ありません。

Re: 回転処理について

Posted: 2011年10月10日(月) 21:08
by softya(ソフト屋)
全部手書きでやっても分かると思うのですが、ここは賢くプログラムを使って状況を確認します。

コード:

printf( "---- 角度=%d -----------------------------\n",kak );
for( i=0; i<5 ; i++ ) {
	for( j=0; j<5 ;j++ ) {
		printf( "num[%d][%d]=%d <= num[%d][%d]=%d\n", j,4-i,num[j][4-i] i,j,num[i][j]);
		num[j][4-i] = num[i][j];		
	}
}
これを実行して確認してみてください。