質問
ベクター上の特定の点を中心にベクターを回転させようとしています(C ++):
1 2 3
4 5 6
7 8 9
ポイント(1,1)(「5」)を中心に90度回転すると、結果は次のようになります。
7 4 1
8 5 2
9 6 3
今、使用しています:
x = (x * cos(90)) - (y * sin(90))
y = (y * cos(90)) + (x * sin(90))
ただし、(0,0)を中心に回転させたくない
解決
Mehrdad Afshari がペストの投稿には、元の座標系への変換が含まれます。
x_rotated = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle)) + x_origin
y_rotated = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle)) + y_origin
他のヒント
解決策は、ベクトルを回転中心が(0,0)である座標系に変換することです。回転行列を適用し、ベクトルを元の座標系に変換します。
dx = x of rotation center
dy = y of rotation center
V2 = V - [dx, dy, 0]
V3 = V2 * rotation matrix
Result = V3 + [dx, dy, 0]
(0,0)が左上隅であり、ポイント(x_origin、y_origin)を中心に回転する標準的なベクトル実装を使用していると仮定すると、これが実行されるはずです:
x = ((x - x_origin) * cos(angle)) - ((y_origin - y) * sin(angle))
y = ((y_origin - y) * cos(angle)) - ((x - x_origin) * sin(angle))
yの値は y_origin-y
であることに注意してください。これは、下に行くほどyの値が増加するためです。
翻訳マトリックスを使用して、異なる点。
マークブースからの答えが間違っていることがわかりました((0,1,0)を0度回転すると、彼の式で(0、-1,0)が得られます)。 >
double cs = cos_deg(new_degrees);
double sn = sin_deg(new_degrees);
double translated_x = x - x_origin;
double translated_y = y - y_origin;
double result_x = translated_x * cs - translated_y * sn;
double result_y = translated_x * sn + translated_y * cs;
result_x += x_origin;
result_y += y_origin;
これはもちろんさらに単純化できますが、できるだけ単純にしたいと思います。
所属していません StackOverflow