質問

ベクター上の特定の点を中心にベクターを回転させようとしています(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;

これはもちろんさらに単純化できますが、できるだけ単純にしたいと思います。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top