การเพิ่มการลากอากาศไปยังสมการวิถีลูกกอล์ฟ


10

ฉันกำลังพัฒนาเกมกอล์ฟ 2 มิติใน VB.NET 2005 แต่ฉันติดอยู่กับวิธีการนำอากาศหรือแรงลมที่น่าจะกระทบลูก

ฉันมีสมการเหล่านี้สำหรับกระสุนแล้ว:

  • v0สำหรับความเร็วเริ่มต้นของลูกกอล์ฟเมื่อถูกยิงหรือยิง
  • ส่วนประกอบแนวตั้งและแนวนอนความเร็วของลูกกอล์ฟ:

    vx=v0cos(θ)vy=v0sin(θ)gt
  • ระยะทางแนวตั้งและแนวนอนของลูกกอล์ฟ:

    x=v0cos(θ)ty=v0sin(θ)t(0.5)gt2

ฉันจะเพิ่มการลากอากาศในสมการนี้เพื่อส่งผลกระทบต่อความเร็วของลูกกอล์ฟได้อย่างไร ฉันไม่รู้ว่าจะทำยังไงมีใครเคยทำงานกับสมการที่คล้ายกันไหม

คำตอบ:


10

ฉันไม่แน่ใจว่ามีรูปแบบปิดสำหรับการลากหรือลมอยู่หรือไม่ แต่เป็นการง่ายที่จะจำลองในแบบที่ชาญฉลาด (เหมือนที่ห้องสมุดฟิสิกส์ทำ)

  1. กำหนดเงื่อนไขเริ่มต้นของคุณ:

    x,y,vx,vy(for t=0)
  2. อัปเดตตำแหน่ง:

    x=x+(vx×dt)y=x+(vy×dt)

    (โดยที่ dt คือเวลาที่ผ่านไปตั้งแต่การอัพเดตครั้งล่าสุดหรือเวลา delta)

  3. คำนวณผู้ช่วยเหลือความเร็วเหล่านี้:

    v2=(vx)2+(vy)2|v|=v2

    (โดยแสดงความยาวของv )|v|v

  4. คำนวณแรงลาก:

    fdrag=c×v2

    (โดยที่ c คือสัมประสิทธิ์แรงเสียดทานน้อย! )

  5. กองกำลังสะสม:

    fx=(fdrag×vx|v|)fy=(fdrag×vy|v|)+(g×mass)

    (ที่คือมวลของลูกกอล์ฟของคุณ)mass

  6. อัปเดตความเร็ว:

    vx=vx+fx×dtmassvy=vy+fy×dtmass

นั่นเป็นวิธีการของออยเลอร์ในการประมาณฟิสิกส์เหล่านั้น


อีกเล็กน้อยเกี่ยวกับวิธีการจำลองตามที่ร้องขอในความคิดเห็น:

  • (t=0)

x=0y=0vx=v0×cos(θ)vy=v0×sin(θ)

โดยพื้นฐานแล้วมันเหมือนกับในสูตรวิถีการเคลื่อนที่ของคุณโดยที่การเกิดขึ้นของ t ทุกครั้งจะถูกแทนที่ด้วย 0

  • KE=0.5m(V2)tv2

  • PE=m×g×y

  • (x,y)t1t=0t=t1

  • (x,y)t1t2t1<t2t1t2

หลอกรหัสสินค้า:

simulate(v0, theta, t1)
  dt = 0.1
  x = 0
  y = 0
  vx = v0 * cos(theta)
  vy = v0 * sin(theta)
  for (t = 0; t < t1; t += dt)
    x += vx * dt
    y += vy * dt
    v_squared = vx * vx + vy * vy
    v_length = sqrt(v_squared)
    f_drag = c * v_squared
    f_grav = g * mass
    f_x = (-f_drag * vx / v_length)
    f_y = (-f_drag * vy / v_length) + (-f_grav)
    v_x += f_x * dt / mass
    v_y += f_y * dt / mass
  end for
  return x, y
end simulate

ขอบคุณมากสำหรับสิ่งนี้ฉันจะลองกลับไปหาคุณ
สมิ ธ

จากสมการที่คุณให้ฉันต้องการรับ X & Y ปัจจุบันเป็นเวลาให้ (t) ฉันควรแทนที่ Vo ด้วย V_x และ Vo ด้วย v_y หรือไม่ นอกจากนี้หากฉันต้องการเพิ่ม KE เริ่มต้นด้วยการยิงบอลสิ่งนี้KE=0.5*m*(V*V)จะถูกต้องหรือไม่
สมิ ธ

@Smith ฉันจะแก้ไขคำตอบสำหรับคำถามของคุณ
Jonas Bötel

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