ページ 11

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

Posted: 2016年10月22日(土) 00:49
by akasan
行列の回転を実行する際にに関数を立てて、同じようなことを何度も書かないようにしたいのですが、できるのでしょうか?

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

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

Posted: 2016年10月22日(土) 00:55
by みけCAT
akasan さんが書きました:行列の回転を実行する際にに関数を立てて、同じようなことを何度も書かないようにしたいのですが、できるのでしょうか?
やりたいことがよくわからないですが、C言語はチューリング完全なので、(実際はメモリの容量などの制約を受けますが)理論上チューリングマシンでできることは全てできるはずです。
akasan さんが書きました:void(char a[ ][ ]){ }の関数をとることはできないのですが、どのような方法があるのか知りたいです。
例えばvoid(int a[ ][ ]){ }の「関数をとる」とか…でしょうか?
もしくは、行列を1次元配列で表現して任意の大きさの行列(を操作するためのポインタ)を関数に渡せるようにするとか…?

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

Posted: 2016年10月22日(土) 09:15
by たいちう
> 行列の回転を実行する際にに関数を立てて、同じようなことを何度も書かないようにしたいのですが、できるのでしょうか?

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

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

Posted: 2016年10月22日(土) 17:59
by かずま
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 ではできます。

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

Posted: 2016年10月22日(土) 19:35
by akasan
#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: 行列の回転についての関数をたてる

Posted: 2016年10月22日(土) 19:52
by かずま
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;
}

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

Posted: 2016年10月22日(土) 20:04
by fm
回転行列というと、普通ゲームプログラムでは、3次元形状のモデルデータや、カメラ、ビュー行列などの
X,Y,Zの3次元座標の回転行列や線形代数で使う行列を表すと
個人的には考えています。

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

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

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