2

私はpythonとctypesを扱っています。C関数で四元数(虚数に似ています)を行列に変換します。引数のような関数で結果変数を送信するのは悪いトーンなので、型配列 c_float*16 で行列を Python コードに返すにはどうすればよいでしょうか。

float* QuaternionToMatrix(Quaternion q)
{
    float matrix[16];

    matrix[ 0] = 1.0f - 2.0f * ( q.y * q.y + q.z * q.z );
    matrix[ 1] = 2.0f * (q.x * q.y + q.z * q.w);
    matrix[ 2] = 2.0f * (q.x * q.z - q.y * q.w);
    matrix[ 3] = 0.0f;

    matrix[ 4] = 2.0f * ( q.x * q.y - q.z * q.w );
    matrix[ 5] = 1.0f - 2.0f * ( q.x * q.x + q.z * q.z );
    matrix[ 6] = 2.0f * (q.z * q.y + q.x * q.w );
    matrix[ 7] = 0.0f;

    matrix[ 8] = 2.0f * ( q.x * q.z + q.y * q.w );
    matrix[ 9] = 2.0f * ( q.y * q.z - q.x * q.w );
    matrix[10] = 1.0f - 2.0f * ( q.x * q.x + q.y * q.y );
    matrix[11] = 0.0f;

    matrix[12] = 0;
    matrix[13] = 0;
    matrix[14] = 0;
    matrix[15] = 1.0f;

    float* a = matrix;

    return a;
}
4

1 に答える 1

3

ローカル変数へのポインタを返しています。これにより、メモリが破損します。structマトリックスをカプセル化し、それを返すことをお勧めします。

typedef struct matrix {
    float data[16];
} matrix;

matrix QuaternionToMatrix(Quaternion q) {
    ...
}

これにより、ある程度の量のメモリ (約 512 バイト) がコピーされるため、行列を out-parameter として渡す方がよいでしょう。

void QuaternionToMatrix(Quaternion q, matrix *matrix) {
    ...
}
于 2012-08-02T16:13:12.520 に答える