回転処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 回転処理について

#2

投稿記事 by softya(ソフト屋) » 14年前

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

あとこちらの掲示板は丸投げ禁止なので、穴埋め問題は自分なりの答えとなぜそれを選んだの書いていただけますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

rayor

Re: 回転処理について

#3

投稿記事 by rayor » 14年前

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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 回転処理について

#4

投稿記事 by softya(ソフト屋) » 14年前

失礼しました。まったく同じ質問の仕方だったので同じ質問だと勘違いしておりました。申し訳ありません。

>それに、穴埋め問題ですが、正解を張り付けています。しかし、なぜこれが正解かわかりません。恐れ入りますが、これでも丸投げでしょうか。
それだと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を壊すからです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

rayor

Re: 回転処理について

#5

投稿記事 by rayor » 14年前

softya(ソフト屋) さんが書きました:失礼しました。まったく同じ質問の仕方だったので同じ質問だと勘違いしておりました。申し訳ありません。



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


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

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 回転処理について

#6

投稿記事 by softya(ソフト屋) » 14年前

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

コード:

for( i=0; i<5 ; i++ )
 for( j=0; j<5 ;j++ ) 
  num[j][4-i] = num[i][j];
として後ろの配列コピーを止めてみてください。
プログラムは動かして、いろいろ変えてみて初めて理解できるものなので疑問があったら納得するまでいじり倒すのが正解です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

rayor

Re: 回転処理について

#7

投稿記事 by rayor » 14年前

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

コード:

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

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 回転処理について

#8

投稿記事 by softya(ソフト屋) » 14年前

全部手書きでやっても分かると思うのですが、ここは賢くプログラムを使って状況を確認します。

コード:

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];		
	}
}
これを実行して確認してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る