كيفية وضع عقدة على طول مدار دائري حول مركز ثابت بناءً على إحداثيات الماوس (JavaFX)؟

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

سؤال

أحاول الدخول في بعض عمليات تطوير ألعاب JavaFX الأساسية وأشعر بالارتباك مع بعض الرياضيات الدائرية.

لدي دائرة عند (x:250, y:250) ونصف قطرها 50.

هدفي هو إنشاء دائرة أصغر يتم وضعها على محيط الدائرة أعلاه بناءً على موضع الماوس.

ما أشعر به من حيرة هو الفضاء الإحداثي ومثلثات وراء كل ذلك.

تأتي مشكلتي من حقيقة أن مساحة X/Y على الشاشة لا تتمركز عند 0,0.لكن أعلى يسار الشاشة هو 0,0 وأسفل اليمين هو 500,500.

حساباتي هي:

var xpos:Number = mouseEvent.getX();
var ypos:Number = mouseEvent.getY();

var center_pos_x:Number = 250;
var center_pos_y:Number = 250;

var length = ypos - center_pos_y;
var height = xpos - center_pos_x;

var angle_deg = Math.toDegrees(Math.atan(height / length));
var angle_rad = Math.toRadians(angle_deg);

var radius = 50;

moving_circ_xpos = (radius * Math.cos(angle_rad)) + center_pos_x;
moving_circ_ypos = (radius * Math.sin(angle_rad)) + center_pos_y;

لقد جعلت التطبيق يطبع الزاوية (angle_deg) التي حسبتها عندما أقوم بتحريك الماوس ويكون الإخراج الخاص بي أدناه:

عندما يكون الماوس (بالدرجات يتحرك عكس اتجاه عقارب الساعة):

  • مباشرة فوق الدائرة ومتوافقة أفقياً مع المركز، الزاوية هي -0
  • إلى اليسار ومركزها عموديًا، الزاوية هي -90
  • مباشرة تحت الدائرة ومتوافقة أفقيا مع المركز، الزاوية هي 0
  • إلى اليمين ومركزها عموديًا، الزاوية هي 90

إذن، ماذا يمكنني أن أفعل لجعله 0، 90، 180، 270؟؟

أعلم أنه يجب أن يكون شيئًا صغيرًا، لكني لا أستطيع التفكير في ما هو عليه.

شكرا على أي مساعدة (ولا ، هذه ليست مهمة)

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

المحلول

atan(height/length) لا يكفي للحصول على الزاوية.تحتاج إلى التعويض عن كل ربع، بالإضافة إلى إمكانية "القسمة على صفر".توفر معظم مكتبات لغات البرمجة طريقة تسمى atan2 والتي تأخذ حجتين؛ y و x.هذه الطريقة تقوم بهذا الحساب نيابة عنك.

مزيد من المعلومات حول ويكيبيديا:أتان2

نصائح أخرى

يمكنك الابتعاد دون حساب الزاوية.بدلاً من ذلك، استخدم مركز دائرتك (250,250) وموضع الماوس (xpos,ypos) لتحديد خط.يتقاطع الخط مع دائرتك عندما يكون طوله مساويًا لنصف قطر دائرتك:

// Calculate distance from center to mouse.
xlen = xpos - x_center_pos;
ylen = ypos - y_center_pos;

line_len = sqrt(xlen*xlen + ylen*ylen);  // Pythagoras: x^2 + y^2 = distance^2

// Find the intersection with the circle.
moving_circ_xpos = x_center_pos + (xlen * radius / line_len);
moving_circ_ypos = y_center_pos + (ylen * radius / line_len);

فقط تأكد من أن الفأرة ليست في مركز دائرتك، وإلا فإن line_len سيكون صفرًا وسيتم امتصاص الفأرة إلى ثقب أسود.

هناك كتاب عظيم اسمه "جواهر الرسومات" التي يمكن أن تساعد في هذا النوع من المشاكل.إنه كتاب طبخ للخوارزميات والكود المصدري (في لغة C على ما أعتقد)، ويسمح لك بحل مشكلة بسرعة باستخدام الوظائف التي تم اختبارها.أود أن أوصي بشدة بالحصول عليه - لقد وفر لي الكثير من الوقت عندما كنت بحاجة بسرعة إلى إضافة تعليمات برمجية للقيام بعمليات معقدة إلى حد ما مع الأسطح الطبيعية واكتشاف الاصطدام.

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