web-dev-qa-db-ja.com

C ++:特定の点を中心にベクトルを回転させる

ベクトル上の特定の点を中心にベクトルを回転させようとしています(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)の周りに回転させたくありません

15
Erik Ahlswede

Mehrdad AfshariPesto の投稿にコメントしたように、元の座標系への変換を含めると、次のようになります。

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
28
Mark Booth

解決策は、ベクトルを回転の中心が(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]
11
Mehrdad Afshari

(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はy_Origin - yであることに注意してください。

3
Pesto

マークブースからの答えが間違っていることがわかりました((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;

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

別のポイントを中心に回転を移動するには、 変換行列 を使用する必要があります。

1
Ben S