مشكلة الرياضيات: الحصول على إحداثيات من الموقف والزاوية
-
28-09-2019 - |
سؤال
اسمحوا لي أن أبدأ بالقول إنني مروع في الرياضيات.
أحاول إعادة وضع وتدوير مستطيل. ومع ذلك ، أحتاج إلى تدوير المستطيل من نقطة ليست 0،0 ولكن وفقًا لمدى تحول إحداثياتها. أنا متأكد من أن هذا ليس له معنى كبير ، لذا فقد قدمت بعض الرسومات للمساعدة في شرح ما أحتاجه.
تُظهر الصورة أعلاه 3 مراحل من المستطيل الأحمر تتحرك من 0 ٪ إلى 100 ٪. تحرك إحداثيات Red Rectangle X و Y (أعلى يسار المستطيل الأحمر) فقط نسبة مئوية من ارتفاع المستطيل الأزرق.
المستطيل الأحمر يمكن تدوير. مع التركيز فقط على المثال الأوسط ("المسافة -50 ٪") من الأعلى ، حيث يتم إعادة وضع المستطيل الأحمر عند -50 من ارتفاع المستطيل الأزرق ، فإن زاويةه الجديدة في الصورة أعلاه الآن -45 درجة. تم تدويره من 0 ، 0 نقطة.
الآن ، مشكلتي هي أنني أريد أن تعكس نقطة الدوران موقفها.
المستطيلات الحمراء والأزرق هي نفس الحجم ، ولكن لها عرض وارتفاع معاكس. نظرًا لأن إحداثيات Red Rectangle 0،0 أصبحت الآن -50 ٪ من ارتفاع المستطيل الأزرق ، ولأنها لها عرض وارتفاع معاكس ، أريد أن تكون نقطة الدوران 50 ٪ من عرض المستطيل الأحمر (أو 50 ٪ من المستطيل الأزرق الارتفاع ، وهو نفس الشيء).
بدلاً من إخبار المستطيل الأحمر على وجه التحديد بالتدوير بنسبة 50 ٪ من عرضه ، من أجل القيام بما أريد ، أحتاج إلى محاكاة القيام بذلك باستخدام صيغة من شأنها وضع إحداثيات X و Y Red Rectangle بحيث تعكس نقطة الدوران موقفها.
المحلول
إليك حل مصور لمشكلتك:
نصائح أخرى
الأمر بسيط للغاية حقًا.
1. دعنا نستقر على وجهة نظرك التي تريد تدويرها ، أي نقطة الدوران (RP) الذي لا يتحرك عندما تدور حول مستطيلك. لنفترض أن النقطة يمثلها الماس في الشكل أدناه.
2. ترجمة النقاط الأربعة لذلك RP هو في (0,0). لنفترض أن إحداثيات هذه النقطة (RPx، RPذ), ، وبالتالي طرح جميع الزوايا الأربعة من المستطيل من قبل تلك الإحداثيات.
3. تدوير النقاط مع أ مصفوفة الدوران (التي تدور نقطة عكس اتجاه عقارب الساعة حول الأصل من خلال بعض الزاوية التي أصبحت الآن نقطة الدوران بفضل الترجمة السابقة):
يوضح الشكل التالي المستطيل الذي تم تدويره بمقدار 45 درجة عكس اتجاه عقارب الساعة.
4. ترجمة المستطيل مرة أخرى (عن طريق الإضافة RP إلى جميع النقاط الأربع):
أفترض أن هذا ما تريده :)
لا أفهم بالضبط ما تحتاجه ، لكن يبدو أن الإجراء لتدوير مستطيل حول نقطة تعسفية قد يساعد.
لنفترض أننا نريد تدوير نقطة (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 على جانب المستطيل المتناوب ، فيمكنك حساب المتجه بين الاثنين:
(مصدر: المعادلة)
يمكنك الحصول على الزاوية بين المتجه والمحور X عن طريق أخذ منتج DOT مع هذا المتجه:
(مصدر: المعادلة)
بالنظر إلى هذا ، يمكنك تحويل أي نقطة على المستطيل عن طريق ضربه بمصفوفة دوران:
(مصدر: المعادلة)