Tôi không chắc liệu thậm chí còn tồn tại một dạng đóng cho kéo hay gió, nhưng nó khá dễ dàng để mô phỏng theo kiểu thông minh từng bước (giống như tất cả các thư viện vật lý làm):
đặt điều kiện ban đầu của bạn:
x,y,vx,vy(for t=0)
cập nhật vị trí:
x=x+(vx×dt)y=x+(vy×dt)
(trong đó dt là thời gian trôi qua kể từ lần cập nhật cuối cùng, còn gọi là thời gian delta)
tính toán những người trợ giúp vận tốc:
v2|v|=(vx)2+(vy)2=v2−−√
|v|v
tính toán lực kéo:
fdrag=c×v2
(trong đó c là hệ số ma sát nhỏ! )
tích lũy lực lượng:
fxfy=(−fdrag×vx|v|)=(−fdrag×vy|v|)+(−g×mass)
mass
cập nhật vận tốc:
vx=vx+fx×dtmassvy=vy+fy×dtmass
Về cơ bản đó là Phương pháp của Euler để tính gần đúng các vật lý đó.
Một chút nữa về cách mô phỏng theo yêu cầu trong các bình luận:
xyvxvy=0=0=v0×cos(θ)=v0×sin(θ)
Về cơ bản, nó giống như trong công thức quỹ đạo cơ bản của bạn trong đó mọi lần xuất hiện của t được thay thế bằng 0.
KE=0.5m(V2)tv2
PE=m×g×y
(x,y)t1t=0t=t1
(x,y)t1t2t1<t2t1t2
Mã giả:
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