سؤال

أحاول إنشاء مثلث (مثلث متساوي الساقين) للتنقل حول الشاشة وفي نفس الوقت تدويره قليلاً عندما يضغط المستخدم على مفتاح الاتجاه (مثل اليمين أو اليسار).

أود أن يكون الأنف (النقطة العليا) للمثلث هو الذي يقود المثلث في جميع الأوقات.(مثل لعبة الكويكبات القديمة).

مشكلتي هي مع الرياضيات وراء هذا.في كل فاصل زمني X، أريد أن يتحرك المثلث في "اتجاه ما"، أحتاج إلى مساعدة في العثور على هذا الاتجاه (زيادات/تناقصات x وy).

يمكنني العثور على النقطة المركزية (النقطه الوسطى) للمثلث، ولدي أعلى نقاط x و y، لذلك لدي متجه خطي للعمل معه، ولكن ليس لدي أدنى فكرة عن "كيفية" العمل معه.

أعتقد أن الأمر يتعلق بطرق Sin وCos القديمة ومقدار (الزاوية) التي تم تدويرها للمثلث، لكنني غير متأكد من هذه الأشياء.

أي مساعدة يحظى بتقدير كبير.

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

المحلول

وقوس الظل (معكوس الظل) من VY / VX، حيث VX وVY هي مكونات ناقلات الخاص بك (centroid-> غيض)، يمنحك زاوية يواجه النواقل.

وقوس الظل الكلاسيكية يتيح لك زاوية طبيعية ل-90 ° <ص <+ 90 ° درجة، ومع ذلك، لديك لإضافة أو طرح 90 درجة من نتيجة اعتمادا على علامة النتيجة وعلامة اكس.

لحسن الحظ، المكتبة القياسية الخاصة بك ينبغي أن proive وظيفة ATAN2 () أن يأخذ VX وVY منفصل كمعلمات، والعودة زاوية بين 0 درجة و 360 درجة مئوية، أو -180 ° و + 180 ° درجة. وسوف يتناول أيضا مع حالة خاصة حيث VX = 0، والذي من شأنه أن يؤدي في القسمة على صفر إذا لم تكن حذرا.

http://www.arctangent.net/atan.html أو مجرد البحث ل "قوس الظل".

وتحرير: لدي درجة المستخدمة في منصبي لوضوح، ولكن جافا والعديد من اللغات الأخرى / مكتبات تعمل بالراديان حيث 180 درجة = π

ويمكنك أيضا أن أضيف VX وVY إلى نقطة المثلث لجعلها تتحرك في الاتجاه "إلى الأمام"، ولكن تأكد أن ناقلات هو تطبيع (vx² + vy² = 1)، وإلا سرعة سيعتمد على المثلث الخاص بك الحجم.

نصائح أخرى

وMark:

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

والنقطه الوسطى ديك والإحداثيات "طرف" ليست ناقلات. وهذا هو القول، ليس هناك ما يمكن كسبه من التفكير منهم كما ناقلات.

ومتجه تريد، vForward = pTip - pCentroid، ويمكن حساب بطرح إحداثيات الزاوية "طرف" من وجهة النقطه الوسطى. وATAN2 () من هذه النواقل، أي ATAN2 (tipY-centY، tipX-centX)، يمنحك زاوية المثلث الخاص بك "تواجه".

وأما ما في الأمر بالنسبة ل، لا يهم. سوف مكتبتك ربما تستخدم اصطلاح أن زيادة X محور (---> الحق / اتجاه الشرق على جميع الرسوم البيانية 2D يفترض كنت قد رأيت) هو 0 درجة أو 0π. وY (أعلى، شمال) الاتجاه المتزايد سوف تتوافق إلى 90 درجة أو (1/2) π.

ويبدو لي أن تحتاج إلى تخزين زاوية دوران مثلث وربما انها السرعة الحالية.

x' = x + speed * cos(angle)
y' = y + speed * sin(angle)

لاحظ أن الزاوية بالراديان وليس درجة!

وراديان = الدرجات * RadiansInACircle / DegreesInACircle

وRadiansInACircle = 2 * بي

وDegressInACircle = 360

لمواقع القمم، ويقع كل على مسافة معينة وزاوية من المركز. إضافة زاوية دوران الحالية قبل القيام بذلك الحساب. انها نفس الرياضيات بالنسبة لكشف الحركة.

وهنا بعض أكثر:

تمثل المتجهات النزوح.الإزاحة أو الترجمة أو الحركة أو أي شيء تريد أن تسميها، لا معنى لها بدون نقطة بداية، ولهذا السبب أشرت إلى المتجه "الأمامي" أعلاه باسم "من النقطه الوسطى"، ولهذا السبب "متجه النقطه الوسطى"، المتجه مع مكونات x/y لنقطة النقطه الوسطى لا معنى لها.تمنحك هذه المكونات إزاحة النقطة الوسطى من نقطة الأصل.بمعنى آخر، pOrigin + vCentroid = pCentroid.إذا بدأت من النقطة 0، ثم أضفت متجهًا يمثل إزاحة النقطة الوسطى، فستحصل على النقطة الوسطى.

لاحظ أن:

ناقل + ناقل = ناقل
(إضافة إزاحتين يمنحك إزاحة ثالثة مختلفة)

نقطة + ناقل = نقطة
(تحريك/إزاحة نقطة يمنحك نقطة أخرى)

نقطة + نقطة = ؟؟؟
(إضافة نقطتين ليس له معنى؛لكن:)

نقطة - نقطة = المتجه
(الفرق بين نقطتين هو الإزاحة بينهما)

الآن، يمكن التفكير في هذه الإزاحات بطريقتين مختلفتين (على الأقل).الشخص الذي تعرفه بالفعل هو مستطيلي (x, y) النظام، حيث يمثل مكونا المتجه الإزاحة في اتجاهي x وy، على التوالي.ومع ذلك، يمكنك أيضًا استخدام القطبية الإحداثيات، (ص، Θ).هنا، Θ تمثل اتجاه الإزاحة (في الزوايا بالنسبة إلى زاوية صفر اعتباطية) وr، المسافة.

خذ المتجه (1، 1) على سبيل المثال.إنه يمثل حركة وحدة واحدة إلى اليمين ووحدة واحدة لأعلى في نظام الإحداثيات الذي اعتدنا جميعًا على رؤيته.وسيكون المكافئ القطبي لهذا المتجه (1.414، 45°)؛نفس الحركة، ولكن تم تمثيلها على أنها "إزاحة 1.414 وحدة في اتجاه زاوية 45 درجة.(مرة أخرى، باستخدام نظام إحداثيات قطبية مناسب حيث يكون الاتجاه الشرقي 0 درجة وتزداد الزوايا عكس اتجاه عقارب الساعة.)

العلاقة بين الإحداثيات القطبية والمستطيلة هي:

Θ = atan2(ص، س)
ص = الجذر التربيعي (س²+ص²) (الآن هل ترى أين يأتي المثلث الأيمن؟)

وعلى العكس من،

س = ص * كوس (Θ)
ص = ص * الخطيئة(Θ)

الآن، بما أن القطعة المستقيمة المرسومة من المركز الأوسط لمثلثك إلى زاوية "الطرف" ستمثل الاتجاه الذي "يواجهه" مثلثك، إذا أردنا الحصول على متجه موازٍ لذلك الخط (على سبيل المثال: vForward = pTip - pCentroid)، فإن إحداثي Θ لهذا المتجه يتوافق مع الزاوية التي يواجهها مثلثك.

خذ المتجه (1، 1) مرة أخرى.إذا كان هذا هو vForward، فهذا يعني أن إحداثيات x وy لنقطة "الطرف" الخاصة بك كانت أكثر بمقدار 1 من إحداثيات النقطه الوسطى.لنفترض أن النقطه الوسطى في (10، 10).وهذا يضع زاوية "الطرف" عند (11، 11).(يتذكر، pTip = pCentroid + vForward وذلك بإضافة "+ pCentroid" إلى طرفي المعادلة السابقة.) الآن في أي اتجاه يواجه هذا المثلث؟45 درجة، أليس كذلك؟هذا هو الإحداثي Θ للمتجه (1، 1)!

والحفاظ على النقطه الوسطى في الأصل. استخدام ناقلات من النقطه الوسطى إلى الأنف مثل ناقلات الاتجاه. http://en.wikipedia.org/wiki/Coordinate_rotation#Two_dimensions ستدور هذه قوه موجهة. بناء اثنين من نقاط أخرى من هذه النواقل. ترجمة النقاط الثلاث إلى أين هم على الشاشة ورسم.

double v; // velocity
double theta; // direction of travel (angle)
double dt; // time elapsed

// To compute increments
double dx = v*dt*cos(theta);
double dy = v*dt*sin(theta);

// To compute position of the top of the triangle
double size; // distance between centroid and top
double top_x = x + size*cos(theta);
double top_y = y + size*sin(theta);

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

aib, ، ذكر أن:

يمنحك VX و VY مكونات متجه (TIP-> TIP) ، حيث يعطيك VX و VY مكونات متجه (TIP-> TIP) الخاص بك (TILP-> TIP) ، حيث يكون VX و VY مكونات متجه (TIP-> TIP) ، حيث يكون VX و VY مكونات ناقل (TIP-> TIP) الخاص بك (TIP-> TIP) ، الزاوية التي يواجهها المتجه VX و VY مكونات متجهك (TIP-> TIP) ، حيث يعطيك VX و VY مكونات متجه (TIP-> TIP) ، حيث يمنحك الزاوية التي يواجهها ناقل VX و VX و VY ، المقياس (TELATING TRACTALLESS (TRACKANCH (TOWER أن الزاوية التي يمنياتب إن VX وًطً

هل vx و vy هما إحداثيات x و y للمركز المركزي أم الطرف؟أعتقد أنني أشعر بالارتباك فيما يتعلق بمصطلحات "المتجه" هنا.كان لدي انطباع بأن المتجه كان مجرد نقطة في الفضاء ثنائي الأبعاد (في هذه الحالة) الذي يمثل الاتجاه.

إذن، في هذه الحالة، كيف يتم حساب متجه النقطه الوسطى->الطرف؟هل هو المركز المركزي فقط؟

com.meyahoocomlorenpechtel معلن:

يبدو لي أنك تحتاج إلى تخزين زاوية الدوران للمثلث وربما تكون السرعة الحالية.

ما هي زاوية الدوران بالنسبة إلى؟أصل المثلث أم نافذة اللعبة نفسها؟أيضًا، بالنسبة للدورات المستقبلية، هل الزاوية هي الزاوية من الدورة الأخيرة أم الموضع الأصلي للمثلث؟

شكرا لكم جميعا على المساعدة حتى الآن، وأنا أقدر ذلك حقا!

هل تريد الأكثر علوا قمة الرأس لتكون النقطه الوسطى من أجل تحقيق التأثير المطلوب.

أولا، أود أن تبدأ مع النقطه الوسطى بدلا من حساب ذلك. أنت تعرف موقف النقطه الوسطى وزاوية دوران مثلث، وأود أن استخدام هذا لحساب مواقع verticies. (أعتذر مقدما عن أي أخطاء في بناء الجملة، ولقد بدأت للتو أن اشتغل في جاوة).

و// نقطة انطلاق

double tip_x = 10;
double tip_y = 10;

should be

double center_x = 10;
double center_y = 10;

و// تفاصيل مثلث

int width = 6; //base
int height = 9;

يجب أن يكون مجموعة من 3 زاوية، والمسافة أزواج.

angle = rotation_angle + vertex[1].angle;
dist = vertex[1].distance;    
p1_x = center_x + math.cos(angle) * dist;
p1_y = center_y - math.sin(angle) * dist;
// and the same for the other two points

ملاحظة أنني <م> الطرح المسافة Y. كنت يجري تعثرت بسبب حقيقة أن مساحة الشاشة هو مقلوب. في عقولنا يزيد Y كما ترتفع - ولكن إحداثيات الشاشة لا تعمل بهذه الطريقة

والرياضيات أبسط كثيرا إذا كنت تتبع الأشياء كما الموقف وزاوية دوران بدلا من استخلاص زاوية دوران.

وكما في قطعة النهائي الخاص بك من التعليمات البرمجية كنت تعديل الموقع من قبل زاوية دوران. وستكون النتيجة أن سفينتك تتحول من زاوية دوران كل دورة التحديث. أعتقد أن الهدف من ذلك هو شيء من هذا القبيل الكويكبات، وليس القط مطاردة انها ذيل!

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