実行結果は
% ./a.out
回転前
1 2 3
4 5 6
7 8 9
回転後
1
4 2
7 5 3
8 6
9
%
です
プログラムは
#include <stdio.h>
#define NUMBER (3) /* 回転する行列の列と行の要素数 */
int main(void)
{
/* 回転する行列の宣言と初期化 */
int matrix[NUMBER][NUMBER]={
{1,2,3},{4,5,6},{7,8,9}
};
/* 回転した行列を代入する配列.0で初期化 */
int rotate[NUMBER+2][NUMBER+2] = {0};
int i,j; /* for文用のカウンタ変数 */
/* 行列matrixを右に45度回転させた行列rotateを作る */
for(i=0;i<NUMBER;i++)
for(j=0;j<NUMBER;j++)
rotate[(4-j)]=matrix[j];<ーーーーーーーーーーーーーーーーーーーーーーここがわからない
/* 行列rotateを印字する */
for(i=0;i<NUMBER+2;i++) {
for(j=0;j<NUMBER+2;j++) {
if(rotate[j]!=0)
printf("%3d", rotate[j]);
else
printf(" ");
}
printf("\n");
}
return 0;
}
です
矢印の部分がわかりません
教えてください
お願いします
3行3列の行列を右へ45度回転した行列を表示するプログラム
Re: 3行3列の行列を右へ45度回転した行列を表示するプログラム
「わからない」 って何がわからないのですか?
・そのわからないとされている行は,あなたではない誰かが書いたものであり,どうしてこう書かれているのかがわからない
・現在の記述はあなたが行ったものであるが,これでは目的の動作になっておらず,どう修正すればよいのかがわからない
・その他,何かがわからない
どれ?
・そのわからないとされている行は,あなたではない誰かが書いたものであり,どうしてこう書かれているのかがわからない
・現在の記述はあなたが行ったものであるが,これでは目的の動作になっておらず,どう修正すればよいのかがわからない
・その他,何かがわからない
どれ?
オフトピック
考え方がわからないということであれば,
3*3行列を図のように格子に見立てて,45度回転することを考えれば良いのでは?
簡単のため要素間の距離を1とし,中央の要素(図で青色の丸)を回転中心( (x,y)=(0,0) )と考えるとすると
図に示した回転変換の式により各要素の回転後座標(x',y')が計算できる.
(例えば,図で赤色で示した左上要素(-1,-1)の回転後の座標は(x',y')=(0,-√2)である.)
ここで,(回転後の状態に対して)図内緑色線で示したような新しい格子を考えれば,この格子の間隔は √2 / 2 であるから
回転後の座標を √2 / 2 で割れば,全ての要素の位置が整数単位になってすっきりする(5*5の配列とかで表現できる形にできる).
このことは,あらかじめ回転行列の全ての要素を √2 / 2 で割った値としておくことに等しい.
…→で,まとめれば結局,計算は整数の世界でやれる形になる. その結果をコーディングすればよい.
3*3行列を図のように格子に見立てて,45度回転することを考えれば良いのでは?
簡単のため要素間の距離を1とし,中央の要素(図で青色の丸)を回転中心( (x,y)=(0,0) )と考えるとすると
図に示した回転変換の式により各要素の回転後座標(x',y')が計算できる.
(例えば,図で赤色で示した左上要素(-1,-1)の回転後の座標は(x',y')=(0,-√2)である.)
ここで,(回転後の状態に対して)図内緑色線で示したような新しい格子を考えれば,この格子の間隔は √2 / 2 であるから
回転後の座標を √2 / 2 で割れば,全ての要素の位置が整数単位になってすっきりする(5*5の配列とかで表現できる形にできる).
このことは,あらかじめ回転行列の全ての要素を √2 / 2 で割った値としておくことに等しい.
…→で,まとめれば結局,計算は整数の世界でやれる形になる. その結果をコーディングすればよい.
-
けら
Re: 3行3列の行列を右へ45度回転した行列を表示するプログラム
返信ありがとうございます
rotate[j]=matrix[2-j];
この部分で行列matrixを45度回転した行列rotateを作りたいのですが
うまくいかないのです
usaoさんの考えでは
rotate[j]=matrix[i*1.41421356237/2][j*1.41421356237/2];
ということでしょうか?
rotate[j]=matrix[2-j];
この部分で行列matrixを45度回転した行列rotateを作りたいのですが
うまくいかないのです
usaoさんの考えでは
rotate[j]=matrix[i*1.41421356237/2][j*1.41421356237/2];
ということでしょうか?
-
相互リンク
Re: 3行3列の行列を右へ45度回転した行列を表示するプログラム
http://detail.chiebukuro.yahoo.co.jp/qa ... 1141596521
c言語 の問題です 3行3列の行列を右へ45度回転し
c言語 の問題です 3行3列の行列を右へ45度回転し
おなじ質問者でしょうか?フォーラムルールをご覧になってください複数の掲示板で同じ質問をすることをマルチポストといい、大抵禁止されています。
しかし、ここでは相互リンクし、リンク先の掲示板でマルチポストが許されていれば
マルチポストはOKとしています。複数の掲示板で同じ質問をするときは相互リンクし、
どこの掲示板で同じ質問をしているか明確にして下さい。
Re: 3行3列の行列を右へ45度回転した行列を表示するプログラム
>usaoさんの考えでは
> rotate[j]=matrix[i*1.41421356237/2][j*1.41421356237/2];
>ということでしょうか?
>結局,計算は整数の世界でやれる形になる.
と書いたはずですが.
> rotate[j]=matrix[i*1.41421356237/2][j*1.41421356237/2];
>ということでしょうか?
>結局,計算は整数の世界でやれる形になる.
と書いたはずですが.