हम खेल भौतिकी में पायथागॉरियन प्रमेय का उपयोग क्यों करते हैं?


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;
    }
}

आइए कुछ संख्याओं के साथ इसे आज़माएँ:

एक ऑब्जेक्ट x में 5 यूनिट और z में 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 से 1 से चल रहा है, जेड -1 से 1 से चल रहा है, और वाई -1 से 1. तक की रनियां - वस्तुतः वह सब कुछ है जो मैं यूनिट वैक्टर के बारे में जानता हूं ... बहुत नहीं: पी और मैं उनकी उपयोगिता को देखने में विफल रहता हूं।

इसके अलावा, हम वास्तव में उपरोक्त उदाहरणों में एक इकाई वेक्टर नहीं बना रहे हैं। क्या मुझे स्केलर को इस तरह निर्धारित करना चाहिए:

// 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

फिर से, मैं यह नहीं देख सकता कि यह बेहतर क्यों है, लेकिन यह अधिक "यूनिट-वेक्टर-वाई" है क्योंकि गुणक_सालकर एक Unit_vector है? जैसा कि आप देख सकते हैं, मैं "यूनिट-वेक्टर-वाई" जैसे शब्दों का उपयोग करता हूं इसलिए मैं वास्तव में गणित नहीं हूं! यह भी जानते हैं कि यूनिट वैक्टर का पाइथागोरस प्रमेय से कोई लेना-देना नहीं हो सकता है, इसलिए अगर मैं गलत पेड़ को काट रहा हूं तो इस सब को अनदेखा करें।

मैं एक बहुत ही दृश्य व्यक्ति हूं (व्यापार द्वारा 3 डी मॉडेलर और कॉन्सेप्ट कलाकार!) और मुझे आरेख और रेखांकन वास्तव में, वास्तव में इतने उपयोगी हैं जितना कि मानवीय रूप से संभव है!


2
वास्तव में, न तो एल्गोरिदम के रूप में लिखा गया सही ढंग से वेग को सीमित करता है। वेक्टर (2.5, 2.5)का परिमाण लगभग 3.54 है, न कि 5.
bcrist

1
sqrt(2.5*2.5 + 2.5*2.5)
bcrist

1
हम नहीं करते हैं, दार्शनिक 2,500 साल पहले मर गया था और प्रमेय जो अपने नाम को सहन करता है, उसे अन्य सभ्यताओं के मिलनिया द्वारा समझा जाता था, इससे पहले कि वह पैदा हुआ था। यह कहना थोड़ा सा है कि हम आइंस्टीन का उपयोग परमाणु पनडुब्बियों में करते हैं, यह सुनिश्चित करने के लिए एक मज़ेदार विचार है (हर उप-दल में आइंस्टीन का होना), लेकिन हम जो करते हैं वह एक सिद्धांत का हिस्सा है जिसे उन्होंने प्रकाशित किया। आइंस्टीन के मामले में वह भौतिकी में कई सिद्धांतों के लिए प्रसिद्ध है, इसलिए आप उस सिद्धांत को नाम दे सकते हैं जिसमें द्रव्यमान-ऊर्जा तुल्यता इसके नाम के केवल भाग (जैसे "विशेष सापेक्षता" के बजाय "सापेक्षता") का उपयोग किए बिना प्राप्त की जाती है। व्यक्ति।
एंडन एम। कोलमैन

3
आपकी स्थिति के साथ समस्या यह दावा है कि "हम पाइथागोरस के बिना एक ही काम कर सकते हैं"। लेकिन मैनहट्टन की दूरी यूक्लिडियन दूरी के समान नहीं है, इसलिए आप सेब और संतरे की तुलना कर रहे हैं। आप एक एक्स / Y जोड़ी से इयूक्लिडियन दूरी चाहते हैं, आप है गणित कर।
जेरी बी

3
संबंधित: "हम गणित का उपयोग भौतिकी में क्यों करते हैं" और "हम खेलों में गणित का उपयोग क्यों करते हैं?"
vaxquis

जवाबों:


104

आपका पाइथागोरस-मुक्त कोड एक लंबाई की गणना नहीं करता है जैसा कि हम सामान्य रूप से सोचते हैं।

सामान्य रूप से 3 डी गेम में हम दुनिया को यूक्लिडियन स्पेस के रूप में मॉडल करते हैं, और हम घटकों और वीएक्स vx के साथ वेक्टर वी की कुल लंबाई की गणना करने के लिए यूक्लिडियन दूरी मीट्रिक ( पाइथागोरियन प्रमेय के रूप में भी जाना जाता है ) का उपयोग करते हैं:

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

(ध्यान दें कि यह वर्गमूल आपके नमूना कोड में ऊपर गायब है, यही कारण है कि दो दृष्टिकोण एक ही उत्तर देने के लिए दिखाई देते हैं। कुछ ही समय में अधिक ...)

आपके द्वारा वर्णित कोड मैनहट्टन दूरी मीट्रिक का उपयोग करता है :

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 ^ 2 = 1. आप देख सकते हैं कि यह घूर्णी रूप से सममित है, और इसलिए हम इसे पसंद करते हैं: यह बड़े करीने से इस विचार का प्रतिनिधित्व करता है कि दूरी के साथ परिवर्तन नहीं होता है दिशा।

मैनहट्टन मीट्रिक नीला हीरा है। दूरी के हमारे सहज विचार के लिए एक महान मैच नहीं है - लेकिन यह बुरा नहीं बनाता है। कई टाइल-आधारित खेलों में जहां आप चार कार्डिनल दिशाओं में असतत चरणों में चलते हैं, मैनहट्टन मीट्रिक अंक के बीच सही दूरी देता है ("वहां पहुंचने के लिए कितनी चालें चलेंगी?"

अंत में, मैं Chebyshev मीट्रिक में मज़े के लिए फेंक दिया - यह हरे रंग का वर्ग है:

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

यह टाइल-आधारित गेम के लिए भी अच्छा है, जहाँ आपको विकर्णों पर जाने की अनुमति है। शतरंज में एक राजा चेबीशेव मीट्रिक के अनुसार चलता है।

मुझे आशा है कि विशिष्ट पाइथोगोरियन-शैली कोड और आपके द्वारा ऊपर दिए गए उदाहरण के बीच अंतर क्या है, यह स्पष्ट करता है।


11

पाइथागोरस के बिना, आप प्रत्येक अक्ष पर एक निश्चित वेग से बंधे होते हैं। आपके पास एक x- गति, एक y- गति और (एक 3D दुनिया में) एक z- गति है जो सभी एक दूसरे से स्वतंत्र हैं। किसी भी आंदोलन को इन लंबवत अक्ष से जोड़ा जाएगा।

हालांकि, पाइथागोरस के साथ, आपके पास एक गति है जो किसी भी कोण में स्थिर हो सकती है। यह आपको ग्रिड को गायब करने की अनुमति देता है और वस्तुओं को किसी भी संभावित दिशा में एक स्थिर गति के साथ आगे बढ़ता है।

पाइथागोरस (फे चेबीशेव मैट्रिक) के बिना एक सेकंड में एक वस्तु जिस क्षेत्र में जाती है, वह इस प्रकार दिखती है:

यहाँ छवि विवरण दर्ज करें

और पाइथागोरस के साथ यह:

यहाँ छवि विवरण दर्ज करें

उत्तरार्द्ध आमतौर पर कई मामलों में अधिक स्वाभाविक लगता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.