تحديد الاتجاه العام لمتجه ثنائي الأبعاد

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

  •  06-07-2019
  •  | 
  •  

سؤال

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

بالنظر إلى المتجه v = (x,y) ، أود أن أعرف اتجاهه "العام".وهذا إما "أعلى" أو "أسفل" أو "يسار" أو "يمين"

يكون الاتجاه العام للمتجه "لأعلى" إذا كان اتجاه المتجه بين 45 و135 درجة."اليسار" يتراوح بين 135 و 225 درجة."الأسفل" يتراوح بين 225 و 315 درجة."اليمين" يتراوح بين 315 و 45 درجة.

لا أهتم حقًا بالحالات التي تكون فيها الزاوية 45 أو 135 أو 225 أو 315 درجة بالضبط.

المهم هو أنني لا أريد استخدام علم المثلثات.أنا متأكد من أن هناك حلاً بسيطًا.

أعتقد أن الحل يمكن أن يقسم الدائرة بأكملها إلى ثمانية.هذا ما لدي حتى الآن.

if(x > 0 && y > x)
    return Up
if(x > 0 && y > 0 && y < x )
    return Right

... etc ...

في الأساس، أعلم أنه يمكنني إيجاد حل.أنا مهتم أكثر بنهجك الخاص في التعامل مع هذه المشكلة.

شكرًا !

يحرر :لم يتم تطبيع المتجه المستخدم.يمكنك تمثيل أي متجه باستخدام زوج من النقاط.ببساطة تظاهر بأن أصل المتجه هو (0,0).

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

المحلول

وهناك طريقة، في الواقع. كل ما عليك هو أن ندرك إذا القيمة المطلقة (ص)> القيمة المطلقة (خ)، ثم الاتجاه رأسيا، وإلا فإن الاتجاه هو أفقي. إذا عمودي، فإن علامة على ذ تشير إلى أعلى / أسفل، وإلا، علامة على الأشعة سوف تشير يسار / يمين. لذلك:

if (abs(y) > abs(x)) {
  if (y > 0) up else down
} else {
  if (x > 0) right else left
}

والزوايا 45ish دائما يتجه يسارا أو يمينا.

نصائح أخرى

وأنا أعلم أنك قلت أردت تجنب علم حساب المثلثات، ولكن هل تستخدم أي وقت مضى ATAN2 وظيفة؟ انها السوبر سهلة الاستعمال لتحديد زاوية متجه:

double ldAngle = atan2(vector.y, vector.x) * 180 / PI;

بافتراض وجود مساحة متجهة طبيعية (يحرر: وهذا يعني أن ناقلك يتكون من ناقلات الوحدة) كما يبدو أنك تفعل، فإن أسلوبك دقيق وهو الأكثر استخدامًا للألعاب والرسوم المتحركة ثنائية الأبعاد.ومع ذلك، سأتحقق من جدول الحقيقة الخاص بك.

نهج @Daniel هو IMO الأكثر أناقة.

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