দুটি পয়েন্টের মধ্যে একটি লাইনে পয়েন্ট পান


9

আমি জাভাস্ক্রিপ্টে একটি সাধারণ স্পেস গেম তৈরি করছি তবে এখন আমি ভেক্টর সম্পর্কিত কোনও প্রাচীর আঘাত করেছি।

গেমের দৃশ্যটি 2 ডি গ্রিডের উপরে-ডাউন। ব্যবহারকারী যখন গ্রিডে ক্লিক করেন, স্পেস শিপটি সেই জায়গায় উড়ে যাবে।

সুতরাং, আমার কাছে যদি দুটি পয়েন্টের সেট থাকে:

{ x : 100.2, y : 100.6 }; // the ship
{ x : 20.5,  y : 55.95 }; // the clicked coordinates

যদি গেম লুপটি প্রতি সেকেন্ডে 60 টি পুনরাবৃত্তিতে টিক দেয় এবং কাঙ্ক্ষিত জাহাজের গতিবেগ প্রতি টিকের প্রতি 0.05 পয়েন্ট (প্রতি সেকেন্ডে 3 পয়েন্ট) হয় তবে আমি কীভাবে গেম লুপের প্রতিটি টিকের জন্য জাহাজের জন্য স্থানাঙ্কের নতুন সেটটি গণনা করব?

PS আমি জড়তা, বা জাহাজকে প্রভাবিতকারী একাধিক ভেক্টরগুলির জন্য অ্যাকাউন্ট করতে চাই না, আমি কেবল চাই জাহাজটি যা কিছু করছে তা বন্ধ করে (অর্থাত্ একটি উপায় উড়ন্ত) এবং স্থির গতিতে ক্লিক করা স্থানাঙ্কগুলিতে সরে যেতে।

উত্তর:


8

সিউডোকোডে:

speed_per_tick = 0.05
delta_x = x_goal - x_current
delta_y = y_goal - y_current
goal_dist = sqrt( (delta_x * delta_x) + (delta_y * delta_y) )
if (dist > speed_per_tick)
{
    ratio = speed_per_tick / goal_dist
    x_move = ratio * delta_x  
    y_move = ratio * delta_y
    new_x_pos = x_move + x_current  
    new_y_pos = y_move + y_current
}
else
{
    new_x_pos = x_goal 
    new_y_pos = y_goal
}

@ ত্রিস্তান: goal_distআপনার ifঅবস্থা বলতে চাইছেন ?
ন্যাট ডব্লিউ।

21

এলইআরপি - লিনিয়ার ইন্টারপোলেশন

আমি এই উত্তরটি কিছুদিন আগে একই ধরণের সমস্যার জন্য দিয়েছিলাম তবে এখানে আমরা যাচ্ছি:

লিনিয়ার ইন্টারপোলেশন একটি ফাংশন যা আপনাকে অগ্রগতির ভিত্তিতে দুটি সংখ্যার মধ্যে একটি সংখ্যা দেয়। আপনি আসলে দুটি পয়েন্টের মধ্যে একটি পয়েন্ট পেতে পারেন।


দুর্দান্ত সূত্র - এটি কীভাবে গণনা করা যায়

সাধারণ এলইআরপি সূত্রটি দেওয়া হয় pu = p0 + (p1 - p0) * u। কোথায়:

  • পু: ফলাফল সংখ্যা
  • p0: প্রাথমিক সংখ্যা
  • p1: চূড়ান্ত সংখ্যা
  • u: অগ্রগতি এটি শতাংশে দেওয়া হয়, 0 এবং 1 এর মধ্যে।

শতাংশ কীভাবে পাবেন

আপনি ভাবতে পারেন, "আমি এই শতাংশটি কীভাবে পেতে পারি !?" চিন্তা করবেন না। এটি এর মতো: শুরু ভেক্টরটি শেষ করতে পয়েন্টটি কত সময় লাগবে? ঠিক আছে, ইতিমধ্যে কেটে গেছে এমন সময় দ্বারা এটি ভাগ করুন। এটি আপনাকে শতাংশ দেবে।

দেখুন, এরকম কিছু: percentage = currentTime / finalTime;


ভেক্টর গণনা করা হচ্ছে

ফলস্বরূপ ভেক্টর পেতে, আপনাকে কেবল সূত্রটি দুটি বার প্রয়োগ করতে হবে, একটি এক্স উপাদানগুলির জন্য এবং একটি ওয়াই উপাদানটির জন্য। এটার মতো কিছু:

point.x = start.x + (final.x - start.x) * progress;
point.y = start.y + (final.y - start.y) * progress;

ভেরিয়েটের সময় গণনা করা হচ্ছে

আপনি আপনার পয়েন্টগুলি 0.5 পয়েন্টের গতিতে ভ্রমণ করতে চান, তাই না? সুতরাং যাক, একটি দীর্ঘ দূরত্ব একটি দীর্ঘ সময় ভ্রমণ করা হবে।

আপনি নিম্নলিখিত হিসাবে এটি করতে পারেন:

  • দূরত্বের দৈর্ঘ্য পান এর জন্য আপনার দুটি জিনিস প্রয়োজন। দূরত্বের ভেক্টর পান, তারপরে এটি একটি দৈর্ঘ্যের মানে রূপান্তর করুন।

    distancevec = final - start;
    distance = distancevec.length();

আমি আশা করি আপনি ভেক্টর গণিত জানেন। আপনি যদি না করেন তবে আপনি এই সূত্র ধরে একটি ভেক্টর দৈর্ঘ্য গণনা করতে পারেন d = sqrt(pow(v.x, 2) + pow(v.y, 2));

  • সময় লাগবে এবং চূড়ান্ত সময় আপডেট করবে। এই এক সহজ। আপনি প্রতিটি টিকটি করতে চান হিসাবে আপনি একটি 0.5 দৈর্ঘ্য পাবেন, আমাদের কেবল বিভক্ত করতে হবে এবং আমরা কত টিক্স পেয়েছি তা পেতে হবে।

    finalTime = distance / 0.5f;

সম্পন্ন.

বিজ্ঞপ্তি: হতে পারে, এটি আপনার জন্য লক্ষ্যযুক্ত গতি নাও হতে পারে তবে এটি সঠিক। সুতরাং আপনার একটি লিনিয়ার চলাচল, এমনকি তির্যক চলগুলি। আপনি যদি x + = 0.5f, y + = 0.5f করতে চান তবে কোনও ভেক্টর গণিতের বইটি পড়ুন এবং আপনার পরিকল্পনাগুলি আবার পরীক্ষা করুন।


আপনি যদি চান আপনার অবস্থান থেকে% বাম গন্তব্যে? যদি আপনি ডেল্টার সময়টি ব্যবহার না করে বরং এক্স: ওয়াই অর্ডিনেটস ব্যবহার করতে পারেন।
ডেভ

আপনি যদি progressএই উত্তরে বর্ণিত হিসাবে গণনা করেন তবে এটি 0..1সীমার মধ্যে হওয়া উচিত । কেবল করুন:progressLeft = 1.0 - progress;
গুস্তাভো ম্যাকিয়েল

3

এটি দিকের স্বাভাবিকের গণনা এবং তারপরে প্যারামেট্রিক সমীকরণের মাধ্যমে বর্তমান অবস্থানের কম্পিউটিংয়ের মাধ্যমে করা যায়

newPoint = startPoint + directionVector * velocity * t

জাহাজটি কাঙ্ক্ষিত দিকে যাত্রা শুরু করার পরে সময়টি কেটে যায় না। আপনি প্রতি আপডেট দ্বারা এটি সম্পাদন করতে পারেন

newPoint = currentPoint + directionVector * velocity * timeDelta

এবং আপনি কেবল প্রতিটি ফ্রেম / পদার্থবিজ্ঞান / ইত্যাদিতে এটি গণনা করুন। জাহাজটি তার গন্তব্যে পৌঁছা পর্যন্ত আপডেট করুন।

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