আমরা গেম পদার্থবিজ্ঞানে পাইথাগোরিয়ান উপপাদকটি কেন ব্যবহার করব?


38

আমি সম্প্রতি শিখেছি যে আমরা আমাদের পদার্থবিজ্ঞানের গণনায় পাইথাগোরিয়ান উপপাদ্যটি প্রচুর ব্যবহার করি এবং আমি ভয় করি যে আমি সত্যিই বিষয়টিটি পাই না।

অনুভূমিক সমতলে স্থির চেয়ে কোনও বস্তু দ্রুত ভ্রমণ না করে তা নিশ্চিত করার জন্য এখানে একটি বইয়ের উদাহরণ রয়েছে MAXIMUM_VELOCITY:

MAXIMUM_VELOCITY = <any number>;
SQUARED_MAXIMUM_VELOCITY = MAXIMUM_VELOCITY * MAXIMUM_VELOCITY; 

function animate(){
    var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);

    if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){

        scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;

        x_velocity = x_velocity / scalar;
        z_velocity = x_velocity / scalar;
    }
}

কিছু নম্বর দিয়ে এটি চেষ্টা করুন:

একটি অবজেক্ট এক্সে 5 ইউনিট এবং জেডে 5 ইউনিট সরানোর চেষ্টা করছে। এটি কেবলমাত্র মোট 5 টি ইউনিটকে অনুভূমিকভাবে স্থানান্তর করতে সক্ষম হওয়া উচিত!

MAXIMUM_VELOCITY = 5;
SQUARED_MAXIMUM_VELOCITY = 5 * 5;
SQUARED_MAXIMUM_VELOCITY = 25;

function animate(){
    var x_velocity = 5;
    var z_velocity = 5;

    var squared_horizontal_velocity = (x_velocity * x_velocity) + (z_velocity * z_velocity);
    var squared_horizontal_velocity = 5 * 5 + 5 * 5;
    var squared_horizontal_velocity = 25 + 25;
    var squared_horizontal_velocity = 50;

//  if( squared_horizontal_velocity <= SQUARED_MAXIMUM_VELOCITY ){
    if( 50 <= 25 ){
        scalar = squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY;
        scalar = 50 / 25;
        scalar = 2.0;

        x_velocity = x_velocity / scalar;
        x_velocity = 5 / 2.0;
        x_velocity = 2.5;

        z_velocity = z_velocity / scalar;
        z_velocity = 5 / 2.0;
        z_velocity = 2.5;

        // new_horizontal_velocity = x_velocity + z_velocity
        // new_horizontal_velocity = 2.5 + 2.5
        // new_horizontal_velocity = 5
    }
}

এখন এটি ভালভাবে কাজ করে তবে পাইথাগোরাস ব্যতীত আমরা একই জিনিসটি করতে পারি:

MAXIMUM_VELOCITY = 5;

function animate(){
    var x_velocity = 5;
    var z_velocity = 5;

    var horizontal_velocity = x_velocity + z_velocity;
    var horizontal_velocity = 5 + 5;
    var horizontal_velocity = 10;

//  if( horizontal_velocity >= MAXIMUM_VELOCITY ){
    if( 10 >= 5 ){
        scalar = horizontal_velocity / MAXIMUM_VELOCITY;
        scalar = 10 / 5;
        scalar = 2.0;

        x_velocity = x_velocity / scalar;
        x_velocity = 5 / 2.0;
        x_velocity = 2.5;

        z_velocity = z_velocity / scalar;
        z_velocity = 5 / 2.0;
        z_velocity = 2.5;

        // new_horizontal_velocity = x_velocity + z_velocity
        // new_horizontal_velocity = 2.5 + 2.5
        // new_horizontal_velocity = 5
    }
}

পাইথাগোরাস ব্যতীত এটি করার সুবিধা:

  1. কম লাইন
  2. এই লাইনের মধ্যে, কী চলছে তা পড়া সহজ
  3. ... এবং কম গুণ করা হওয়ায় এটি কম সময় নেয়

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

ইউনিট ভেক্টরগুলির সাথে এটির কি কোনও সম্পর্ক আছে? আমার কাছে একটি ইউনিট ভেক্টর হ'ল যখন আমরা কোনও ভেক্টরকে স্বাভাবিক করি এবং এটি ভগ্নাংশে পরিণত করি। আমরা ভেক্টরকে বৃহত্তর ধ্রুবক দ্বারা ভাগ করে এটি করি। আমি নিশ্চিত না এটি কি ধ্রুবক। গ্রাফের মোট আকার? যাইহোক, এটি একটি ভগ্নাংশ হিসাবে, আমি এটি গ্রহণ করি, ইউনিট ভেক্টরটি মূলত একটি গ্রাফ যা -3 থেকে 1 অবধি চলমান এক্স-অক্ষের সাথে 3 ডি গ্রিডের অভ্যন্তরে ফিট হতে পারে, জেড-অক্ষটি -1 থেকে 1 পর্যন্ত চলবে এবং y -অ্যাক্সিস -1 থেকে 1 পর্যন্ত চলমান That's ইউনিট ভেক্টর সম্পর্কে আমি আক্ষরিকভাবে যা জানি তা সবই ... খুব বেশি নয়: পি এবং আমি তাদের কার্যকারিতাটি দেখতে ব্যর্থ।

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

// a mathematical work-around of my own invention. There may be a cleverer way to do this! I've also made up my own terms such as 'divisive_scalar' so don't bother googling
var divisive_scalar = (squared_horizontal_velocity / SQUARED_MAXIMUM_VELOCITY);
var divisive_scalar = ( 50 / 25 );
var divisive_scalar = 2;

var multiplicative_scalar = (divisive_scalar / (2*divisive_scalar));
var multiplicative_scalar = (2 / (2*2));
var multiplicative_scalar = (2 / 4);
var multiplicative_scalar = 0.5;

x_velocity = x_velocity * multiplicative_scalar
x_velocity = 5 * 0.5
x_velocity = 2.5

আবার, আমি দেখতে পাচ্ছি না কেন এটি আরও ভাল, তবে এটি আরও বেশি "ইউনিট-ভেক্টর-ওয়াই" কারণ গুণক_স্কালার একটি ইউনিট_ভেক্টর? আপনি দেখতে পাচ্ছেন, আমি "ইউনিট-ভেক্টর-ওয়াই" এর মতো শব্দ ব্যবহার করি তাই আমি সত্যিই গণিতের ঝকঝকে না! এছাড়াও জেনে থাকুন যে ইউনিট ভেক্টরগুলির সাথে পাইথাগোরিয়ান উপপাদনের কোনও সম্পর্ক থাকতে পারে তাই যদি আমি ভুল গাছটি ছাঁটাই করে দিই তবে এই সমস্তটি উপেক্ষা করুন।

আমি খুব ভিজ্যুয়াল ব্যক্তি (ট্রেডের মাধ্যমে 3 ডি মডেলার এবং ধারণা শিল্পী!) এবং আমি ডায়াগ্রাম এবং গ্রাফগুলি সত্যই খুঁজে পেয়েছি, যতটা সম্ভব মানবিকভাবে সম্ভব দয়া করে!


2
প্রকৃতপক্ষে, লিখিত হিসাবে অ্যালগরিদমের কোনওটিই বেগটিকে সীমাবদ্ধ করে না। ভেক্টরের (2.5, 2.5)পরিমান
..৫৪

1
sqrt(2.5*2.5 + 2.5*2.5)
খ্রিস্ট

1
আমরা করি না, দার্শনিক ২,৫০০ বছর আগে মারা গিয়েছিলেন এবং তাঁর নাম ধারণ করে যে উপপাদ্যটি জন্মগ্রহণ করেছিলেন তার আগে অন্য সভ্যতা সহস্রাব্দিয়া দ্বারা বুঝতে পেরেছিলেন । এটি কিছুটা বলার মতো যে আমরা নিউক্লিয়ার সাবমেরিনে আইনস্টাইনকে ব্যবহার করি, এটি নিশ্চিতভাবেই মজার একটি ধারণা (ক্রুতে আইনস্টাইনযুক্ত প্রতিটি উপ), তবে আমরা যা করি তা হ'ল তিনি প্রকাশিত একটি তত্ত্বের অংশ। আইনস্টাইনের ক্ষেত্রে তিনি পদার্থবিজ্ঞানের অনেক তত্ত্বের জন্য বিখ্যাত তাই আপনি যে তত্ত্বটি থেকে ভর-শক্তি সমতাটি তার নামের একমাত্র অংশ (উদাহরণস্বরূপ "বিশেষ আপেক্ষিকতা" এর পরিবর্তে "আপেক্ষিকতা") ব্যবহার করে এটির জন্য কোনও বিভ্রান্ত না করে নামকরণ করতে পারেন name ব্যক্তি।
অ্যান্ডন এম। কোলেম্যান

3
আপনার অবস্থান নিয়ে সমস্যা হ'ল দাবি আমরা "পাইথাগোরাস ব্যতীত আমরা একই জিনিস করতে পারি"। তবে ম্যানহাটনের দূরত্ব ইউক্লিডিয়ান দূরত্বের মতো নয় , তাই আপনি আপেল এবং কমলার তুলনা করছেন। আপনি একটি এক্স / ওয়াই যুগল থেকে ইউক্লিডিয় দূরত্ব চান, আপনি আছে গণিত না।
জেরি বি

3
সম্পর্কিত: "কেন আমরা পদার্থবিজ্ঞানে গণিত ব্যবহার করি" এবং "আমরা গেমসে গণিত কেন ব্যবহার করি?"
ভ্যাক্সকুইস

উত্তর:


104

আপনার পাইথাগোরাস মুক্ত কোডটি দৈর্ঘ্যের গণনা করে না কারণ আমরা সাধারণত এটি ভাবি।

সাধারণত 3 ডি গেমগুলিতে আমরা বিশ্বকে ইউক্লিডিয়ান স্পেস হিসাবে মডেল করি এবং আমরা উপাদানগুলি vx এবং vy সহ ভেক্টরের মোট দৈর্ঘ্য গণনা করতে একটি ইউক্লিডিয়ান দূরত্বের মেট্রিক ( পাইথাগোরিয়ান উপপাদ্য নামেও পরিচিত ) ব্যবহার করি যথা:

EuclideanLength(v) = sqrt(v.x * v.x + v.y * v.y)

(দ্রষ্টব্য যে এই বর্গমূলটি উপরের আপনার নমুনা কোডে অনুপস্থিত, যে কারণে দুটি পদ্ধতির একই উত্তর দেওয়া দেখা যাচ্ছে shortly শিগগিরই আরও ...)

আপনার বর্ণিত কোডটি ম্যানহাটন দূরত্বের মেট্রিক ব্যবহার করে :

ManhattanLength(v) = abs(v.x) + abs(v.y)

(যদিও আপনি নিখুঁত মানগুলি অন্তর্ভুক্ত করেননি, যা এটি নেতিবাচক সংখ্যার জন্য অপ্রত্যাশিতভাবে আচরণ করতে পারে)

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

আসুন বলি vx = vy = 1। এই ভেক্টরটি কত দীর্ঘ (সমতুল্যভাবে, এটির গতিবেগটি কতটা দ্রুত বর্ণনা করে)?

Euclidean                              Manhattan

sqrt(v.x*v.x + v.y * v.y)              abs(v.x) + abs(v.y)
sqrt(1 * 1 + 1 * 1)                    abs(1) + abs(1)
sqrt(2)                                1 + 1
1.414...                               2

আপনি দেখতে পাচ্ছেন যে এই ম্যাট্রিকগুলি আসলে তির্যক রেখার জন্য সম্মত নয়।

আসুন প্রতিটি গ্রাফিক সূচনা থেকে 1 দূরের একটি পয়েন্টের সেটের গ্রাফটিতে প্লট করুন:

দূরত্বের মেট্রিক্স

আমাদের পরিচিত ইউক্লিডিয়ান মেট্রিক হল লাল বৃত্ত। এটি সমস্ত পয়েন্ট x, y এর মতো x ^ 2 + y all 2 = 1 এর সেট You অভিমুখ.

ম্যানহাটন মেট্রিক হ'ল নীল হীরা। আমাদের দূরত্বের স্বজ্ঞাত ধারণার জন্য দুর্দান্ত মিল নয় - তবে এটি খারাপ করে না। অনেকগুলি টাইল-ভিত্তিক গেমগুলিতে যেখানে আপনি চারটি মূল দিকগুলিতে বিচ্ছিন্ন পদক্ষেপে চলে যান, ম্যানহাটন মেট্রিক পয়েন্টগুলির মধ্যে সঠিক দূরত্ব দেয় ("সেখানে যাওয়ার জন্য এটি কতগুলি চালনা গ্রহণ করবে?" এর পরিপ্রেক্ষিতে)

অবশেষে, আমি মজাদার জন্য চেবিশেভ মেট্রিকটিতে ফেলেছিলাম - এটি সবুজ বর্গ:

ChebyshevLength(v) = max(abs(v.x), abs(v.y))

এটি টাইল-ভিত্তিক গেমগুলির জন্যও ভাল, যেখানে আপনাকে তির্যকগুলিতে অগ্রসর হওয়ার অনুমতি দেওয়া হয়। দাবাতে একজন কিং চেবিশেভ মেট্রিক অনুসারে চলে।

আমি আশা করি যে পাইপাগোরিয়ান-স্টাইলের আদর্শ কোড এবং আপনি উপরে যে উদাহরণটি দিয়েছেন তার মধ্যে পার্থক্য কী তা পরিষ্কার হয়ে যায়।


11

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

তবে পাইথাগোরাসের সাথে আপনার গতি রয়েছে যা যে কোনও কোণে স্থির থাকতে পারে। এটি আপনাকে গ্রিডকে অদৃশ্য করতে এবং কোনও সম্ভাব্য দিকটিতে ধ্রুবক গতিতে অবজেক্টগুলি সরিয়ে আনতে সহায়তা করে।

কোনও বস্তু যে এক সেকেন্ডে ভ্রমণ করে সেটিকে পাইথাগোরাস (ফে চেবিশেভ মেট্রিক) ছাড়াই দেখায়:

এখানে চিত্র বর্ণনা লিখুন

এবং এটি পাইথাগোরাস দ্বারা:

এখানে চিত্র বর্ণনা লিখুন

পরেরটি সাধারণত অনেক ক্ষেত্রে অনেক বেশি প্রাকৃতিক বলে মনে হয়।

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