مشكلة الرياضيات: الحصول على إحداثيات من الموقف والزاوية

StackOverflow https://stackoverflow.com/questions/3077814

سؤال

اسمحوا لي أن أبدأ بالقول إنني مروع في الرياضيات.

أحاول إعادة وضع وتدوير مستطيل. ومع ذلك ، أحتاج إلى تدوير المستطيل من نقطة ليست 0،0 ولكن وفقًا لمدى تحول إحداثياتها. أنا متأكد من أن هذا ليس له معنى كبير ، لذا فقد قدمت بعض الرسومات للمساعدة في شرح ما أحتاجه.

alt text

تُظهر الصورة أعلاه 3 مراحل من المستطيل الأحمر تتحرك من 0 ٪ إلى 100 ٪. تحرك إحداثيات Red Rectangle X و Y (أعلى يسار المستطيل الأحمر) فقط نسبة مئوية من ارتفاع المستطيل الأزرق.

alt text

المستطيل الأحمر يمكن تدوير. مع التركيز فقط على المثال الأوسط ("المسافة -50 ٪") من الأعلى ، حيث يتم إعادة وضع المستطيل الأحمر عند -50 من ارتفاع المستطيل الأزرق ، فإن زاويةه الجديدة في الصورة أعلاه الآن -45 درجة. تم تدويره من 0 ، 0 نقطة.

alt text

الآن ، مشكلتي هي أنني أريد أن تعكس نقطة الدوران موقفها.

المستطيلات الحمراء والأزرق هي نفس الحجم ، ولكن لها عرض وارتفاع معاكس. نظرًا لأن إحداثيات Red Rectangle 0،0 أصبحت الآن -50 ٪ من ارتفاع المستطيل الأزرق ، ولأنها لها عرض وارتفاع معاكس ، أريد أن تكون نقطة الدوران 50 ٪ من عرض المستطيل الأحمر (أو 50 ٪ من المستطيل الأزرق الارتفاع ، وهو نفس الشيء).

بدلاً من إخبار المستطيل الأحمر على وجه التحديد بالتدوير بنسبة 50 ٪ من عرضه ، من أجل القيام بما أريد ، أحتاج إلى محاكاة القيام بذلك باستخدام صيغة من شأنها وضع إحداثيات X و Y Red Rectangle بحيث تعكس نقطة الدوران موقفها.

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

المحلول

إليك حل مصور لمشكلتك:

Method for determining position deltas from an off-centre rotation.

نصائح أخرى

الأمر بسيط للغاية حقًا.

1. دعنا نستقر على وجهة نظرك التي تريد تدويرها ، أي نقطة الدوران (RP) الذي لا يتحرك عندما تدور حول مستطيلك. لنفترض أن النقطة يمثلها الماس في الشكل أدناه.

alt text

2. ترجمة النقاط الأربعة لذلك RP هو في (0,0). لنفترض أن إحداثيات هذه النقطة (RPx، RPذ), ، وبالتالي طرح جميع الزوايا الأربعة من المستطيل من قبل تلك الإحداثيات.

alt text

3. تدوير النقاط مع أ مصفوفة الدوران (التي تدور نقطة عكس اتجاه عقارب الساعة حول الأصل من خلال بعض الزاوية التي أصبحت الآن نقطة الدوران بفضل الترجمة السابقة):

alt text

يوضح الشكل التالي المستطيل الذي تم تدويره بمقدار 45 درجة عكس اتجاه عقارب الساعة.

alt text

4. ترجمة المستطيل مرة أخرى (عن طريق الإضافة RP إلى جميع النقاط الأربع):alt text

أفترض أن هذا ما تريده :)

لا أفهم بالضبط ما تحتاجه ، لكن يبدو أن الإجراء لتدوير مستطيل حول نقطة تعسفية قد يساعد.

لنفترض أننا نريد تدوير نقطة (x ، y) d حول الأصل (0،0). صيغة موقع النقطة المدورة هي:

x' = x*cos(d) - y*sin(d)
y' = x*sin(d) + y*cos(d)

الآن لا نريد التدوير حول الأصل ، ولكن حول نقطة معينة (أ ، ب). ما نقوم به هو نقل الأصل أولاً إلى (أ ، ب) ، ثم قم بتطبيق صيغة الدوران أعلاه ، ثم نقل الأصل إلى (0،0).

x' = (x-a)*cos(d) - (y-b)*sin(d) + a
y' = (x-a)*sin(d) + (y-b)*cos(d) + b

هذه هي صيغتك لتدوير نقطة (x ، y) d حول النقطة (a ، b).

بالنسبة لمشكلتك (أ ، ب) ستكون النقطة في منتصف الطريق على الجانب الأيمن من المستطيل الأزرق ، و (x ، y) ستكون في كل ركن من أركان المستطيل الأحمر. تعطي الصيغة (x '، y') لإحداثيات زوايا المستطيل الأحمر المدور.

يبدو أنك يمكن أن تتجنب دوران أكثر تعقيدًا عن طريق المزيد من المواقع في البداية؟ على سبيل المثال ، في المثال الأخير ، ضع المربع الأحمر في "-25 ٪ من الارتفاع الأزرق" و "-25 ٪ من الارتفاع الأحمر"-إذا اتبعت مخطط المرجع الخاص بك-ثم قم بتنفيذ الدوران الذي تريده.

إذا كنت تعرف الأصل O والنقطة P على جانب المستطيل المتناوب ، فيمكنك حساب المتجه بين الاثنين:

alt text
(مصدر: المعادلة)

يمكنك الحصول على الزاوية بين المتجه والمحور X عن طريق أخذ منتج DOT مع هذا المتجه:

alt text
(مصدر: المعادلة)

بالنظر إلى هذا ، يمكنك تحويل أي نقطة على المستطيل عن طريق ضربه بمصفوفة دوران:

alt text
(مصدر: المعادلة)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top