4

私は数学で一見単純な問題に悩まされています:2次元デカルト座標系で点を回転させる必要があります。つまり、(x / y)と角度ガンマで与えられる点があり、の座標を取得する必要がありますガンマで回転した場合のこの点...

例:x=2およびy=0で、回転角が90°の場合、結果のポイントはx'= 0、y' = -2(時計回りに回転)になります。

だから私はネット( http://en.wikipedia.org/wiki/Rotation_matrix )でこの式を見つけ、それをテストするためにいくつかのコードを実装しました:

$x = 1; echo "x: " . $x . "<br>";
$y = 1; echo "y: " . $y . "<br>";
$gamma = 45; echo "gamma: " . $gamma . "<br>";

$sinGamma = sin(deg2rad($gamma));
$cosGamma = cos(deg2rad($gamma));

$x2 = $x*$cosGamma - $y*$sinGamma; echo "x2: " . $x2 . "<br>";
$y2 = $y*$cosGamma + $x*$sinGamma; echo "y2: " . $y2 . "<br>";

これは90/180/270度の角度でうまく機能しますが、それ以外の場合は完全にがらくたになります。

すなわち:

x=1およびy=1およびgamma=45°の場合、結果のポイントは正確にx軸上に配置されます...まあ-上記のスクリプトは次のように出力します。

x: 1
y: 1
gamma: 45
x2: 1.11022302463E-16
y2: 1.41421356237

私はsthが間違っていることを理解しましたか?(私にとって学校は長い間続いています^^)どうすればこれを正しく行うことができますか?

4

2 に答える 2

4

あなたの数は実際にはほとんどそこに見えます-原点を中心に45度回転した(1,1)は(0、sqrt(2))になります。x2は前に1があるため奇妙に見えますが、E-16は、実際には.000000000000000111022などの番号を意味します。そして、sqrt(2)は1.414あたりのどこかに出てきます。

浮動小数点の丸め誤差のために正確な結果を得ることができません(無理数で作業していることは言うまでもありません)。

于 2010-08-19T17:34:19.057 に答える
1

あなたのコードは正しいです。例がy軸上で正確に終了しないという事実は、本質的に不正確な浮動小数点計算によるものであり、実際の座標点を回転させたい場合は、とにかく回避することはできません。

于 2010-08-19T17:34:48.463 に答える