প্রক্ষিপ্ত গতি - তীর


13

একটি 2 ডি গেমে, আমি কেবল ফ্লাইটে একটি তীরের পথটি আঁকতে চাই। নীচের কোড সহ, ট্র্যাজেক্টোরিটি (প্যারোবোলায়) ঠিক দেখাচ্ছে তবে কোণ (বা ঘোর) বা তীরটি নেই।

float g = -9.8f;
float x = (launchVelocity * time);
float y = (launchVelocity * time) + (0.5f * g * (float)Math.Pow(time, 2));
float angle = (float)Math.Tanh(y / x);

আমি কী মিস করছি? ধন্যবাদ।


3
একটি স্ক্রিনশট সাহায্য করতে পারে
ডপপেলগ্রিনিয়ার

উত্তর:


10

Arctanhহাইপারবোলিক বক্ররেখার জন্য আপনাকে স্পর্শক সরবরাহ করে! আমি যতদূর জানি আপনার প্যারোবোলার হাইপারবোলা নয়।

তবে আমাদের কাছে সুসংবাদ রয়েছে: আপনার প্যারোবোলার জন্য ট্যানজেন্ট সন্ধান করা আরও সহজ। সমীকরণটি হ'ল

x = s · t => t = x / s; y = s · t + g / 2 · t² => y = x + g / 2 · x² / s²

কোথায় আপনার হয় launchVelocity। এখন আপনার তীরটির opeালটি হ'ল:

/Y / ∂y = g / (2s²) · x + 1

আপনি Arctanযদি চান তবে আপনি এখন সুরক্ষা ব্যবহার করতে পারেন।

পদার্থবিজ্ঞান সম্পর্কে কিছু অতিরিক্ত তথ্য:

আনুমানিক ট্রাজেক্টোরি আপনি অনুকরণ করছেন যা আপনার তীরের ভর কেন্দ্রে প্রযোজ্য। আপনি যখন "অবস্থান" (x, y) বলবেন আপনি ভর অবস্থানের কেন্দ্রের কথা বলছেন। একটি তীর জন্য ভর কেন্দ্র মাঝপয়েন্ট থেকে সামান্য এগিয়ে এবং আপনি তীর আঁকা যাচ্ছে যদি আপনি এটি বিবেচনা করা উচিত।

মনে রাখবেন যে আপনি তীরটির নিবিড় গতি বিবেচনা করছেন না (আপনি যদি কোনও দৈত্য বলিস্টাকে গুলি চালিয়ে যাচ্ছেন তবে এটির অনেকগুলি পরিবর্তন হতে পারে) এবং আপনি তীরটির তরল গতিবিদ্যা বিবেচনা করছেন না: ধনুকের তীরের বিমানটি কোনও প্যারাবোলিক পথ অনুসরণ করবে না!


ধন্যবাদ Fxlll। কোনও ধারনা যেখানে আমি সূত্রগুলি পেতে পারি যা একটি তীরের পদার্থবিজ্ঞানের জন্য প্রযোজ্য?
মার্টিন

আমি মনে করি আপনার অর্থ:! [& অংশ; y / & অংশ; x = g / (2 এস & সুপার 2;) & মিডট; এক্স + 1] [2] তবে আমি মনে করি নীচে আরও ভাল পদ্ধতির প্রস্তাব দিয়েছি। একটি জিনিসের জন্য, আপনি x এবং y উপাদানগুলি পৃথক করার বিষয়ে ব্যাখ্যা করেননি, সুতরাং এটি একটি নির্বিচারে 45 ডিগ্রি কোণে হার্ডকোড করা হয়েছে, লঞ্চভেলুসিটি সত্যিকারের প্রবর্তনযোগ্যতা নয়, তবে এক্স এবং y উভয় ক্ষেত্রেই রয়েছে
ডভ

সহজেই জড়তার মুহুর্তগুলি গণনা করা যায়। এগুলি দুটি রডের জন্য, একটি তার ভর কেন্দ্রের ঘূর্ণনের জন্য এবং অন্যটি রডের অক্ষটি ঘোরানোর জন্য। সুপারপজিশন নীতি জড়তার মুহুর্তগুলির জন্য প্রযোজ্য যাতে তীরটি তিন ভাগে বিভক্ত করা যায়: পালক, শরীর এবং টিপ।
FxIII

1
সমস্যাটি হ'ল একক গতি গণনা করা সহজ কারণ হ'ল কোণ বৈচিত্রের কারণে (আপনি দেখতে পাচ্ছেন যে প্যারোবোলার দ্বিগুণ প্রাপ্তি কেবল একটি ধ্রুবক পদ অবশেষ)। অন্যটি পিছনের পালকের কারণে স্পিনিংয়ের কারণে ঘটে। এখানে পালকের টানাগুলি এবং ঘর্ষণ উভয় জড়িত গতিময় শক্তিকে স্পিনিংয়ে রূপান্তরিত করে, তীরটি ধীর করে দেয় তবে জাইরোস্কোপিক প্রভাব যুক্ত করে। এটি ট্র্যাজেক্টোরিটিকে প্রভাবিত করে এবং মডেল করা বেশ কঠিন
FxIII

যাইহোক আপনি যদি একটি পালক সেটআপ প্রদত্ত গতির সাথে গতি যুক্ত করতে পারেন তবে সমস্তকে পুরো সংহত হিসাবে গণনা করা যেতে পারে তবে আমি নিশ্চিত নই যে আপনি গতির সমীকরণের জন্য একটি বদ্ধ ফর্ম থাকতে পারেন (যেমন আপনি একটি সংহতকরণ অ্যালগরিদম পেতে পারেন তবে প্যারাম্যাট্রিক নয়) সমীকরণ)।
এফএক্সআইআইআই

4

আপনি যে কোনও সময় তীরের কোণটি চান। আপনি মনে রেখেছেন যে একটি কোণ গণনা করার জন্য, একটি স্পর্শক রয়েছে। তবে এখানে আপনার ভাবনাটি ভুল হতে শুরু করেছে:

  1. আপনি যা চান তা ডেল্টা ওয়াই / ডেল্টা এক্স, কারণ theাল হ'ল পরিবর্তনের হার (অন্য উত্তরের একটিতে উল্লিখিত)। নোট করুন যে x ঠিক সেই অবস্থান যেখানে আপনি সময়ে যে কোনও মুহুর্তে রয়েছেন, ডেক্স নয়।

ঠিক আছে, সুতরাং যদি আপনি বায়ুর ঘর্ষণকে অবহেলা করেন তবে তীরটির এক্স-বেগ একটি ধ্রুবক।

প্রথমে এক্স এবং ওয়াই উপাদানগুলিতে বেগটি পচন করুন। আপনি 45 ডিগ্রি বা 60 ডিগ্রি কোণে শুটিং করতে পারেন। সুতরাং আপনার লঞ্চভেলোসিটি এবং একটি কোণ দরকার, এটি কোনও স্কেলার নয়।

দ্বিতীয়ত, ভাসমান নয়, সবকিছুকে দ্বিগুণ হিসাবে গণনা করুন। রাউন্ডঅফ ত্রুটি কখন আপনাকে মেরে ফেলবে না তা জানতে আপনি সংখ্যাসূচকভাবে পরিশীলিত নন, তাই চেষ্টা করবেন না। এটি কোনও ক্ষেত্রেই দুর্দান্ত সময় রক্ষাকারী নয়।

তৃতীয়ত, ম্যাথ.পাউ ব্যবহার করবেন না, এটি ধীর এবং পূর্ণসংখ্যার শক্তির জন্য গুণনের মতো সঠিক নয়। এছাড়াও আপনি হর্নারের ফর্মটি ব্যবহার করে প্রচুর সময় বাঁচাতে পারেন (নীচে দেখুন)

final double DEG2RAD = Math.PI/180;
double ang = launchAngle * DEG2RAD;
double v0x = launchVelocity * cos(ang); // initial velocity in x
double v0y = launchVelocity * sin(ang); // initial velocity in y

double x = (v0x * time);
// double y = (v0y * time) + (0.5 * g * (float)Math.Pow(time, 2));
double y = (0.5 * g * time + v0y) * time

আপনি যদি পারফরম্যান্সের জন্য মরিয়া হয়ে থাকেন তবে আপনি ০.০ * জি প্রাক্টমুটও করতে পারেন তবে উপরের কোডটি আপনাকে খুব বেশি পাগল না করে 90% পথ নিয়ে যাবে। আপনার পছন্দ মতো বেঞ্চমার্ক এই ১০ মিলিয়ন বার করছে, এটি স্বীকার করা যে এটি প্রচুর পরিমাণে সময় নয় তবে শতাংশের ভিত্তিতে এটি বেশ বড় - লাইব্রেরিগুলি জাভাতে খুব ধীর

সুতরাং, আপনি যদি তীরটি কোথায় যেতে চান এমন কোণটি চান তবে আপনি যা চান তা চান

atan(dy/dx)

এবং এই ক্ষেত্রে, এটি কাজ করবে কারণ ডেক্স একটি ধ্রুবক। তবে সাধারণভাবে, ডিএক্স শূন্য হতে পারে, তাই আপনি সাধারণত ব্যবহার করতে চান:

atan2(dy, dx)

যা বিশেষ করে এই কাজের জন্য ডিজাইন করা একটি ফাংশন।

তবে আমি যেমন বলেছি, জাভাতে পাঠাগার ফাংশনগুলি আস্তে আস্তে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে যায় এবং উপরে এফএক্সআইআইআই এর উপর নির্ভর না করে এটি করার আরও ভাল উপায় আছে।

যদি অনুভূমিক বেগ সর্বদা v0x হয়, এবং উল্লম্ব বেগ হয়:

double vy = v0y - 0.5 * g * time;

তারপরে আপনার ব-দ্বীপটি হ'ল: vx, vy

আপনার কোণ দরকার নেই। আপনি যদি একটি তীর আঁকতে চান তবে নামমাত্র এমন কিছু ব্যবহার করুন:

প্লট (x, y, x + vx, y + vy);

আপনি কী আঁকছেন তা আমি জানি না, সুতরাং এটিকে ঘোরানোর জন্য আপনার যদি কোণ দরকার হয় (যেমন আপনি JOGL ব্যবহার করছেন) তবে অবশ্যই, কোণটি ব্যবহার করুন।

কোণটি আবার ডিগ্রীতে পরিণত করতে আপনি ওপেনগল ব্যবহার করছেন কিনা তা ভুলে যাবেন না, কারণ এটিএন 2 রেডিয়ানগুলি ফেরত দেয়:

final double RAD2DEG = 180 / Math.PI;
double ang = Math.atan2(vy,vx); // don't forget, vy first!!!
double deg = ang * RAD2DEG;

2

তানহ () (হাইপারবোলিক ট্যানজেন্ট ) একটি প্যারামিটার হিসাবে একটি কোণ নেয় তবে আপনি এটিকে পক্ষের অনুপাতটি খাওয়ান।

আপনি যা চান তা হ'ল হাইপারবোলিক আর্কট্যানজেন্ট ব্যবহার করা যা পক্ষগুলির অনুপাতটিকে প্যারামিটার হিসাবে গ্রহণ করে এবং কোণটি ফেরায়। (এটির নামকরণ "আতানহ", "আতানহ 2", "আর্টকানহ" বা অন্য কিছু অনুরূপ হতে পারে; বিভিন্ন গণিতের গ্রন্থাগারের মধ্যে অনেকটা আলাদা বলে মনে হয়)


না আপনি হাইপারবোলিক কিছু চান না
ডভ

গাহ, আপনি একেবারে ঠিক বলেছেন। আমি তাত্ক্ষণিকভাবে "বেসিক ত্রিকোণমিতির ব্যবহার" ত্রুটিটি ধরেছিলাম এবং মিস করেছি যে তিনি যে ফাংশনটি ব্যবহার করছেন সেটি তাঁর বাকি পদ্ধতির জন্য পুরোপুরি ভুল ছিল।
ট্রেভর পাওয়েল

ট্যান () একটি কোণ নেয়। আতান একটি ত্রিভুজ পার্শ্ব অনুপাত (পাপ / কোস) নেয়।
ডিভে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.