行列の回転についての関数をたてる

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

行列の回転についての関数をたてる

#1

投稿記事 by akasan » 7年前

行列の回転を実行する際にに関数を立てて、同じようなことを何度も書かないようにしたいのですが、できるのでしょうか?

void(char a[ ][ ]){ }の関数をとることはできないのですが、どのような方法があるのか知りたいです。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 行列の回転についての関数をたてる

#2

投稿記事 by みけCAT » 7年前

akasan さんが書きました:行列の回転を実行する際にに関数を立てて、同じようなことを何度も書かないようにしたいのですが、できるのでしょうか?
やりたいことがよくわからないですが、C言語はチューリング完全なので、(実際はメモリの容量などの制約を受けますが)理論上チューリングマシンでできることは全てできるはずです。
akasan さんが書きました:void(char a[ ][ ]){ }の関数をとることはできないのですが、どのような方法があるのか知りたいです。
例えばvoid(int a[ ][ ]){ }の「関数をとる」とか…でしょうか?
もしくは、行列を1次元配列で表現して任意の大きさの行列(を操作するためのポインタ)を関数に渡せるようにするとか…?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

たいちう
記事: 418
登録日時: 13年前

Re: 行列の回転についての関数をたてる

#3

投稿記事 by たいちう » 7年前

> 行列の回転を実行する際にに関数を立てて、同じようなことを何度も書かないようにしたいのですが、できるのでしょうか?

この説明では何をしたいのか判りません。
同じようなことを何度も書いているプログラムを載せてくれたら、改善点を指摘できるかもしれません。

かずま

Re: 行列の回転についての関数をたてる

#4

投稿記事 by かずま » 7年前

akasan さんが書きました:void(char a[ ][ ]){ }の関数をとることはできないのですが、どのような方法があるのか知りたいです。
こんなことがしたいのでしょうか?

コード:

#include <stdio.h>
 
void f(size_t m, size_t n, char a[m][n])
{
    for (size_t i = 0; i < m; i++) {
        for (size_t j = 0; j < n; j++)
            printf("%2c", a[i][j]);
        putchar('\n');
    }
}

int main(void)
{
    char a[1][6] = { "abcdef" };
    f(2, 3, a);
    f(3, 2, a);
    return 0;
}
C++ ではできませんが、C ではできます。

akasan

Re: 行列の回転についての関数をたてる

#5

投稿記事 by akasan » 7年前

#include<stdio.h>
#define N 4

int main(void){
char a[N][N+1]={{"++++"},{"****"},{"++++"},{"****"}},b[N][N+1];
int i,j;

for(i=0;i<N;i++){
for(j=0;j<N;j++){
b[j][N-1-i]=a[j]; b[N]='\0';
}
}
for(i=0;i<N;i++)
puts(b);
}

このfor以下の部分を関数にできないのかなぁと思いまして、投稿してみました。

かずま

Re: 行列の回転についての関数をたてる

#6

投稿記事 by かずま » 7年前

akasan さんが書きました:このfor以下の部分を関数にできないのかなぁと思いまして、投稿してみました。
これではダメですか?

コード:

#include <stdio.h>

#define N 4

void f(int i, int j, char a[N][N+1], char b[N][N+1])
{
    b[j][N - 1 - i] = a[i][j];
    b[i][N] = '\0';
}

int main(void)
{
    char a[N][N+1] = { "++++", "****", "++++", "****" },
         b[N][N+1];
    int i, j;

    for (i = 0; i < N; i++)
        for (j = 0; j < N; j++)
            f(i, j, a, b);

    for (i = 0; i < N; i++)
        puts(b[i]);
    return 0;
}

fm

Re: 行列の回転についての関数をたてる

#7

投稿記事 by fm » 7年前

回転行列というと、普通ゲームプログラムでは、3次元形状のモデルデータや、カメラ、ビュー行列などの
X,Y,Zの3次元座標の回転行列や線形代数で使う行列を表すと
個人的には考えています。

ただし、ゲームプログラムの回転する通常の行列と勘違いする行列といったら、転置行列か逆行列でしょうね。

ここではソースの提示は今すぐには出来ないですが、ネットで調べてみてはどうでしょうか?

もしかしたら、回転行列の意味が違うか、もしくは、一回の呼び出す関数で回転する角度が決まってしまったり違う関数なのか、
あるいは、複数回呼び出す事で回転する角度が同じや違う関数である可能性もありますが、ソースは
(ネット)で調べてください。自分はそれしか言えません。

閉鎖

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