ทำไมเราถึงใช้ทฤษฎีบทพีทาโกรัสในเกมฟิสิกส์?


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 หน่วยใน x และ 5 หน่วยใน z มันควรจะสามารถเคลื่อนที่ได้ 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
    }
}

ตอนนี้ใช้งานได้ดี แต่เราสามารถทำสิ่งเดียวกันได้โดยไม่ต้อง Pythagoras:

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

ประโยชน์ของการทำโดยไม่ใช้ Pythagoras:

  1. เส้นหัก
  2. ภายในบรรทัดเหล่านั้นจะง่ายต่อการอ่านสิ่งที่เกิดขึ้น
  3. ... และใช้เวลาในการคำนวณน้อยลงเนื่องจากมีการคูณที่น้อยลง

ดูเหมือนว่าฉันชอบคอมพิวเตอร์และมนุษย์ได้รับข้อตกลงที่ดีกว่าโดยไม่มีทฤษฎีบทพีทาโกรัส! แต่ฉันแน่ใจว่าฉันผิดที่ผมเคยเห็นทฤษฎีบทพีทาโกรัสในหลายสถานที่ที่มีชื่อเสียงดังนั้นฉันต้องการใครสักคนที่จะอธิบายให้ฉันประโยชน์ของการใช้พีทาโกรัสทฤษฎีบทกับคณิตศาสตร์มือใหม่

สิ่งนี้เกี่ยวข้องกับเวกเตอร์หน่วยหรือไม่ สำหรับฉันเวกเตอร์หน่วยคือเมื่อเราทำให้เวกเตอร์เป็นมาตรฐานและทำให้เป็นเศษส่วน เราทำได้โดยการหารเวกเตอร์ด้วยค่าคงที่ที่มากขึ้น ฉันไม่แน่ใจว่ามันคงที่ ขนาดทั้งหมดของกราฟ? อย่างไรก็ตามเพราะมันเป็นเศษส่วนผมก็เอาเวกเตอร์หน่วยมาเป็นกราฟที่สามารถใส่เข้าไปในกริด 3 มิติโดยที่แกน x วิ่งจาก -1 ถึง 1, แกน z วิ่งจาก -1 ถึง 1 และ y -axis วิ่งจาก -1 ถึง 1 นั่นคือทุกสิ่งที่ฉันรู้เกี่ยวกับเวกเตอร์หน่วย ... ไม่มาก: P และฉันไม่เห็นประโยชน์ของมัน

นอกจากนี้เราไม่ได้สร้างเวกเตอร์หน่วยในตัวอย่างข้างต้น ฉันควรจะกำหนดสเกลาร์แบบนี้:

// 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-y" มากกว่าเพราะ multiplicative_scalar เป็น unit_vector อย่างที่คุณเห็นฉันใช้คำเช่น "unit-vector-y" ดังนั้นฉันจึงไม่ใช่นักคณิตศาสตร์ โปรดทราบด้วยว่าเวกเตอร์หน่วยอาจไม่มีส่วนเกี่ยวข้องกับทฤษฎีบทพีทาโกรัสดังนั้นอย่าสนใจทั้งหมดนี้ถ้าฉันเห่าต้นไม้ผิดไป

ฉันเป็นคนที่มองเห็นได้ (ผู้สร้างภาพสามมิติและศิลปินแนวความคิดโดยการแลกเปลี่ยน!) และฉันพบว่าไดอะแกรมและกราฟจริงๆมีประโยชน์มากจริงๆ


2
ที่จริงแล้วอัลกอริทึมที่เขียนไม่ถูกต้อง จำกัด ความเร็ว เวกเตอร์(2.5, 2.5)มีขนาดประมาณ 3.54 ไม่ใช่ 5
bcrist

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

1
เราไม่ได้นักปรัชญาเสียชีวิต 2,500 ปีที่ผ่านมาและทฤษฎีบทที่แสดงถึงชื่อของเขาถูกเข้าใจโดยอารยธรรมอื่น ๆ นับพันปีก่อนที่เขาจะเกิด นั่นเป็นเหมือนการพูดว่าเราใช้ Einstein ในเรือดำน้ำนิวเคลียร์เป็นความคิดที่ตลกแน่นอน (ทุก ๆ ย่อยที่มี Einstein อยู่ในทีม) แต่สิ่งที่เราทำคือนำทฤษฎีที่เขาตีพิมพ์ไปใช้ ในกรณีของไอน์สไตน์เขามีชื่อเสียงในหลายทฤษฎีทางฟิสิกส์ดังนั้นคุณสามารถตั้งชื่อทฤษฎีที่ว่าความเท่าเทียมกันของมวลพลังงานได้มาจากการใช้เพียงบางส่วนของชื่อ (เช่น "สัมพัทธภาพ" แทน "สัมพัทธภาพพิเศษ") โดยไม่ทำให้สับสน คน
Andon M. Coleman

3
ปัญหาเกี่ยวกับตำแหน่งของคุณคือการอ้างว่า "เราสามารถทำสิ่งเดียวกันได้โดยไม่ต้อง Pythagoras" แต่ระยะทางแมนฮัตตันไม่เหมือนกับระยะทางยูคลิดดังนั้นคุณจึงเปรียบเทียบแอปเปิ้ลกับส้ม หากคุณต้องการระยะทางแบบยุคลิดจากคู่ X / Y คุณต้องทำคณิตศาสตร์
Jerry B

3
ที่เกี่ยวข้อง: "ทำไมเราถึงใช้คณิตศาสตร์ในวิชาฟิสิกส์" และ "ทำไมเราถึงใช้คณิตศาสตร์ในเกม"
vaxquis

คำตอบ:


104

โค้ดที่ปราศจาก Pythagoras ของคุณไม่ได้คำนวณความยาวตามที่เราคาดคิดไว้

โดยปกติในเกม 3 มิติเราจำลองโลกเป็นพื้นที่ยุคลิดและเราใช้ตัวชี้วัดระยะทางแบบยุคลิด ( หรือที่รู้จักกันในชื่อทฤษฎีบทพีทาโกรัส ) เพื่อคำนวณความยาวทั้งหมดของเวกเตอร์ v ด้วยองค์ประกอบ vx และ vy Namely:

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 metricเพื่อความสนุก - มันเป็นสี่เหลี่ยมสีเขียว:

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

นอกจากนี้ยังเป็นเกมที่ดีสำหรับเกมไพ่ที่คุณได้รับอนุญาตให้เล่นเกมแนวทแยงมุม ราชาแห่งหมากรุกเคลื่อนตาม Chebyshev metric

ฉันหวังว่าจะเคลียร์ความแตกต่างระหว่างโค้ดสไตล์พีทาโกรัสและตัวอย่างที่คุณให้ไว้ข้างต้น


11

หากไม่มี Pythagoras คุณจะได้รับความเร็วคงที่ในแต่ละแกน คุณมี x-speed, y-speed และ (ในโลก 3 มิติ) z-speed ซึ่งทั้งหมดเป็นอิสระจากกัน การเคลื่อนไหวใด ๆ จะจัดชิดกับแกนตั้งฉากเหล่านี้

อย่างไรก็ตามด้วย Pythagoras คุณมีความเร็วที่สามารถคงที่ได้ทุกมุม ที่ช่วยให้คุณทำให้กริดหายไปและให้วัตถุเคลื่อนที่ด้วยความเร็วคงที่ในทิศทางที่เป็นไปได้

พื้นที่ที่วัตถุเดินทางในหนึ่งวินาทีมีลักษณะเช่นนี้โดยไม่มี Pythagoras (fe Chebyshev metric):

ป้อนคำอธิบายรูปภาพที่นี่

และสิ่งนี้กับพีธากอรัส:

ป้อนคำอธิบายรูปภาพที่นี่

หลังมักจะดูเหมือนเป็นธรรมชาติมากขึ้นในหลายกรณี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.