3行3列の行列を右へ45度回転した行列を表示するプログラム

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

3行3列の行列を右へ45度回転した行列を表示するプログラム

#1

投稿記事 by けら » 11年前

実行結果は
% ./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;
}
です
矢印の部分がわかりません
教えてください
お願いします

アバター
usao
記事: 1892
登録日時: 12年前
連絡を取る:

Re: 3行3列の行列を右へ45度回転した行列を表示するプログラム

#2

投稿記事 by usao » 11年前

「わからない」 って何がわからないのですか?

・そのわからないとされている行は,あなたではない誰かが書いたものであり,どうしてこう書かれているのかがわからない
・現在の記述はあなたが行ったものであるが,これでは目的の動作になっておらず,どう修正すればよいのかがわからない
・その他,何かがわからない

どれ?
オフトピック
考え方がわからないということであれば,
3*3行列を図のように格子に見立てて,45度回転することを考えれば良いのでは?

簡単のため要素間の距離を1とし,中央の要素(図で青色の丸)を回転中心( (x,y)=(0,0) )と考えるとすると
図に示した回転変換の式により各要素の回転後座標(x',y')が計算できる.
(例えば,図で赤色で示した左上要素(-1,-1)の回転後の座標は(x',y')=(0,-√2)である.)
ここで,(回転後の状態に対して)図内緑色線で示したような新しい格子を考えれば,この格子の間隔は √2 / 2 であるから
回転後の座標を √2 / 2 で割れば,全ての要素の位置が整数単位になってすっきりする(5*5の配列とかで表現できる形にできる).
このことは,あらかじめ回転行列の全ての要素を √2 / 2 で割った値としておくことに等しい.
…→で,まとめれば結局,計算は整数の世界でやれる形になる. その結果をコーディングすればよい.
クリップボード01.png
クリップボード01.png (12.3 KiB) 閲覧数: 5017 回

けら

Re: 3行3列の行列を右へ45度回転した行列を表示するプログラム

#3

投稿記事 by けら » 11年前

返信ありがとうございます
rotate[j]=matrix[2-j];
この部分で行列matrixを45度回転した行列rotateを作りたいのですが
うまくいかないのです
usaoさんの考えでは
    rotate[j]=matrix[i*1.41421356237/2][j*1.41421356237/2];
ということでしょうか?

相互リンク

Re: 3行3列の行列を右へ45度回転した行列を表示するプログラム

#4

投稿記事 by 相互リンク » 11年前

http://detail.chiebukuro.yahoo.co.jp/qa ... 1141596521
c言語 の問題です 3行3列の行列を右へ45度回転し
複数の掲示板で同じ質問をすることをマルチポストといい、大抵禁止されています。
しかし、ここでは相互リンクし、リンク先の掲示板でマルチポストが許されていれば
マルチポストはOKとしています。複数の掲示板で同じ質問をするときは相互リンクし、
どこの掲示板で同じ質問をしているか明確にして下さい。
おなじ質問者でしょうか?フォーラムルールをご覧になってください

アバター
usao
記事: 1892
登録日時: 12年前
連絡を取る:

Re: 3行3列の行列を右へ45度回転した行列を表示するプログラム

#5

投稿記事 by usao » 11年前

>usaoさんの考えでは
>    rotate[j]=matrix[i*1.41421356237/2][j*1.41421356237/2];
>ということでしょうか?

>結局,計算は整数の世界でやれる形になる.
と書いたはずですが.

閉鎖

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