سؤال

واني اسعى الى تدوير متجه حول نقطة معينة على ناقلات (في 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)

هل كانت مفيدة؟

المحلول

وكما و مهرداد أفشاري علق على <لأ href = "https://stackoverflow.com/a/620769 / 42473 "> الصورة بيستو آخر، بما في ذلك ترجمة العودة الى نظام تنسيق الأصلي ستكون كما يلي:

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_origin - 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