0

この3x3マトリックスを使用して、平行移動、スケーリング、回転などの基本的な変換を実行していますが、回転部分が正常に機能していません。30度程度を超える角度の場合、見た目は奇妙です。

メソッドは次のようになります。

public void rotate(float angle) {
    double rads = angle * (Math.PI/180);
    float sin = (float) Math.sin(rads);
    float cos = (float) Math.cos(rads);

    matrix[0][0] = cos;
    matrix[0][1] = -sin;
    matrix[1][0] = sin;
    matrix[1][1] = cos; 
}

そして、変換を適用する方法:

Xの場合:

public float[] applyTransformX(float[] x, float[] y) {
    float[] transformed = new float[x.length];
    for(int i=0; i<x.length; i++) {
        transformed[i] = (x[i] * matrix[0][0]) + (y[i] * matrix[0][1] + matrix[0][2]);
        System.out.println((x[i] * matrix[0][0]) + (y[i] * matrix[0][1] + matrix[0][2]));

    }
    return transformed;
}

Yについて:

public float[] applyTransformY(float[] x, float[] y) {
    float[] transformed = new float[x.length];
    for(int i=0; i<x.length; i++) {
        transformed[i] = (x[i] * matrix[1][0]) + (y[i] * matrix[1][1] + matrix[1][2]);
    }
    return transformed;
}

ここで欠けている基本的なことはありますか?固定小数点の周りで変換を行っていないという事実を認識しています。それがおそらく私がこの問題を経験している理由ですか?

私が言ったように、変換とスケーリングは正常に機能しています。

4

2 に答える 2

1

x[i]私が考えることができるのは、それぞれを取得するために、およびそれぞれを取得するために追加する3つの項のサイズの不一致に起因する丸め誤差がある可能性があるということだけですy[i]。私の本能は、翻訳用語を最後に追加することです。そうすれば、かなりの翻訳が、ローテーションの結果として生じる用語の重要性を失うことはありません。これには、括弧の一部を削除するだけで、標準の左から右への操作の順序が始まります。つまり、X値を計算する方法では、次のように記述します。

transformed[i] = x[i] * matrix[0][0] + y[i] * matrix[0][1] + matrix[0][2];

括弧なし。同様に、Y値を計算するときは、次のように記述します。

transformed[i] = x[i] * matrix[1][0] + y[i] * matrix[1][1] + matrix[1][2];

それでも問題が解決しない場合は、実際の数値を投稿してください。これにより、どの計算が重要性の喪失を引き起こしている可能性があるかを確認できます。これが小さな角度で問題なく機能するという事実は、実際の誤った計算方法とは対照的に、丸め誤差が発生していることを示しています。

于 2012-09-25T22:34:57.447 に答える
0

問題は、両方の場合の計算にあり transformed[i]ます。Xの場合、次のようになります。

transformed[i] = (x[i] * matrix[0][0]) + (y[i] * matrix[0][1]);

Yの場合は次のようになります。

transformed[i] = (x[i] * matrix[1][0]) + (y[i] * matrix[1][1]);

これを含めるmatrix[0][2]と、matrix[1][2]これはZコンポーネントの場合になりますが、Z軸を中心とした回転の場合は0と評価されます(matrix[2][2]完全ではありますが1になります)。おそらく、それらを再初期化するのを忘れただけです…</ p>

于 2012-09-25T22:19:24.887 に答える