2016-11-01 6 views
0

私は行列A[M][M]を持っています。新しい位置が元の行列の外にある値を破棄し、欠損値をゼロで埋めて、行列の中心に対して度回転します。私は彼の新しい位置を取得するには、次の式を使用しています:行列をN度回転させる

newXPosition = ceil(cos(N*PI/180)*(oldXPosition - M/2) - sin(N*PI/180)*(oldYPosition - M/2) + M/2) 
newYPosition = ceil(sin(N*PI/180)*(oldXPosition - M/2) + cos(N*PI/180)*(oldYPosition - M/2) + M/2) 

しかし、これはいくつかの時点で失敗しています。 oldXPosition = oldYPosition = 0, M = 32 and N = 90ºについてnewXPositionnewYPositionを検索すると、newXPosition = 32, newYPosition = 0が得られます。次元が[0-31]であることを考慮すると、newXPositionに1を引くだけでは機能しません。なぜなら、他の場合には、差し引かなければならない変数、あるいはその両方がnewYositionになるからです。

私はどこで失敗したのか誰にも分かりますか?

PS:私はすでにthe 90 degrees rotationに関するいくつかの回答を読んでいますが、私の意図は、マトリックスを90度回転させるのではなく、Nです。

+0

cos/sinは引数として度をとらないので、[radians]をとります(http://www.cplusplus.com/reference/cmath/cos/) – UKMonkey

+0

画像の長さが0から31の場合実際の中心は31/2 = 15.5です。境界の外にあるピクセルを破棄しているため、そのようなピクセルは1つだけです。 – LutzL

答えて

1

各ピクセルが小さな正方形であると考えると、その中心が0.5,1.5などにあると思ってください。そうoldXPositionに "0.5" を追加 - newXPositionを形成する場合、それを引く:

newXPosition = CEIL(COS(N PI/180)(oldXPosition + 0.5〜M/2) - SIN(N PI/180)(oldYPosition + 0.5〜M/2)+ M/2-0.5)

だから、あなたのケースでnewXPositionは31になります - ない32、およびnewYPosition 0

私も逆にあなたをお勧めします論理ではなく、古いxとyに基づいて新しい位置を計算するのではなく、新しい行列で始まり、各ピクセルについて、対応する古い位置を見つけます(これは、あなたのfo rmulas) - それから値を取る。

それ以外の場合は、回転によって "ソリッド"形状がゼロになることがあります。

"ceil"の代わりにファンシー補間を行うことができます。

関連する問題