Menambahkan seretan udara ke persamaan lintasan bola golf

10

Saya sedang mengembangkan permainan golf 2D di VB.NET 2005, tapi saya terjebak pada bagaimana menerapkan hambatan udara atau angin yang harus memengaruhi bola.

Saya sudah memiliki persamaan ini untuk proyektil:

  • untuk kecepatan awal bola golf saat dipukul atau ditembakkanv0
  • Komponen vertikal dan horizontal kecepatan bola golf:

    vx=v0cos(θ)vy=v0sin(θ)gt
  • Jarak bola golf vertikal dan horizontal:

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

Bagaimana cara menambahkan hambatan udara ke persamaan ini untuk memengaruhi kecepatan bola golf dengan benar? Saya tidak tahu bagaimana melakukannya, apakah ada yang bekerja dengan persamaan yang sama?

Smith
sumber

Jawaban:

10

Saya tidak yakin apakah bahkan ada bentuk tertutup untuk drag atau angin, tetapi cukup mudah untuk mensimulasikan secara bertahap (seperti semua perpustakaan fisika lakukan):

  1. atur kondisi awal Anda:

    x,y,vx,vy(for t=0)
  2. perbarui posisi:

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

    (di mana dt adalah waktu berlalu sejak pembaruan terakhir, alias waktu delta)

  3. hitung pembantu kecepatan ini:

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

    |v|v

  4. menghitung gaya seret:

    fdrag=c×v2

    (di mana c adalah koefisien gesek kecil! )

  5. mengumpulkan kekuatan:

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

    mass

  6. perbarui kecepatan:

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

Itu pada dasarnya Metode Euler untuk mendekati fisika itu.


Sedikit lebih banyak tentang bagaimana simulasi seperti yang diminta dalam komentar:

  • (t=0)

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

Ini pada dasarnya sama dengan rumus lintasan dasar Anda di mana setiap kemunculan t diganti dengan 0.

  • KE=0.5m(V2)tv2

  • PE=m×g×y

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

  • (x,y)t1t2t1<t2t1t2

Pseudo-Code:

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
Jonas Bötel
sumber
Terima kasih banyak untuk ini, saya akan mencobanya kembali kepada Anda.
Smith
dari persamaan yang Anda berikan ini, saya ingin mendapatkan X & Y saat ini untuk waktu yang diberikan (t), haruskah saya mengganti Vo saya dengan V_x dan Vo dengan v_y? Juga jika saya perlu menambahkan KE awal dengan mana bola dipecat, apakah ini KE=0.5*m*(V*V)valid?
Smith
@Smith saya akan mengedit jawaban saya untuk menjawab pertanyaan Anda
Jonas Bötel
ini persis apa yang saya lakukan, dan x selalu negatif, mengapa?
Smith