рд╢реБрдн рджрд┐рди, рджреЛрд╕реНрддреЛрдВ!рд╢рд╛рд░реАрд░рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдирд╛ рдПрдХ рдХрдард┐рди рдХрд╛рдо рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЧрддрд┐, рддреНрд╡рд░рдг рдФрд░ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг (рдЖрдХрд░реНрд╖рдг) рдЬреИрд╕реА рднреМрддрд┐рдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВредрдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЬреЗрдПрд╕ рдореЗрдВ рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?
рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ редрд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ рдпрд╣рд╛рдБ редрд╡рд░реНрджреА рдФрд░ рддреНрд╡рд░рд┐рдд рдЧрддрд┐
рдЪрд▓реЛ рдЖрдВрджреЛрд▓рди рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВредрд╕рдорд╛рди рдЖрдВрджреЛрд▓рди рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:function move(dt) {
x += vx * dt
y += vy * dt
}
рдпрд╣рд╛рдБ x рдФрд░ y рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВ, vx рдФрд░ vy рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЧрддрд┐ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдЕрдХреНрд╖реЛрдВ рдХреЗ рд╕рд╛рде рдХреНрд░рдорд╢рдГ рд╣реИ, dt (рдЯрд╛рдЗрдо рдбреЗрд▓реНрдЯрд╛ - рдЯрд╛рдЗрдо рдбреЗрд▓реНрдЯрд╛) рджреЛ рдЯрд╛рдЗрдорд░ рдХреЗ рдирд┐рд╢рд╛рди рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдордп рд╣реИ, рдЬреЛ JS рдореЗрдВ рджреЛ рдХреЙрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХрд░рддрд╛ рд╣реИредрдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд╕реНрдерд┐рдд рдПрдХ рд╡рд╕реНрддреБ рдХреЛ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ 150, 50 рд╕реЗ рджрдХреНрд╖рд┐рдг-рдкрд╢реНрдЪрд┐рдо рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд (рдПрдХ рдЯрд╛рдЗрдорд░ рдЪрд┐рд╣реНрди рдпрд╛ рдПрдХ рдХрджрдо) рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:x = 150 += -1 * 0.1 - > 149.9
y = 50 += 1 * 0.1 - > 50.1
рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЖрдВрджреЛрд▓рди рдЙрдмрд╛рдК рд╣реИ, рддреЛ рдЪрд▓реЛ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБ рдХреЛ рдПрдХ рддреНрд╡рд░рдг рджреЗрдВ:function move(dt) {
vx += ax * dt
vy += ay * dt
x += vx * dt
y += vy * dt
}
рдпрд╣рд╛рдБ рдПрдХреНрд╕ рдФрд░ рд╡рд╛рдИ рдХреНрд░рдорд╢рдГ рдПрдХреНрд╕ рдФрд░ рд╡рд╛рдИ рдПрдХреНрд╕рд┐рд╕ рдХреЗ рд╕рд╛рде рддреНрд╡рд░рдг рд╣реИрдВред рд╣рдо рдЧрддрд┐ (vx / vy) рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рддреНрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЕрдм, рдпрджрд┐ рд╣рдо рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдПрдХреНрд╕ рдЕрдХреНрд╖ (рдкрд╢реНрдЪрд┐рдо рдореЗрдВ) рдХреЗ рд╕рд╛рде рддреНрд╡рд░рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:vx = -1 += -1 * 0.1 - > -1.1
vy = 1 += 0 * 0.1 - > 1
x = 150 += -1.1 * 0.1 - > 149.89
y = 50 += 1 * 0.1 - > 50.1
рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг
рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕реАрдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ? рдЗрд╕реЗ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдпрд╛ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХрд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?рдпрд╣рд╛рдБ рд╣рдо рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:
рдкрд╣рд▓реЗ, рдЪрд▓реЛ рд╣рд╛рдИ рд╕реНрдХреВрд▓ рд╕реЗ рдХреБрдЫ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВредрд╢рд░реАрд░ рдкрд░ рд▓рд╛рдЧреВ рдмрд▓ рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрди рд╕реВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ:F = m * a ... рдмрд▓ рд╕рд╛рдореВрд╣рд┐рдХ рд╕рдордп рддреНрд╡рд░рдгa = F / m рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ ... рдЗрд╕рд╕реЗ рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдмрд▓ рддреНрд╡рд░рдг рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИрдпрджрд┐ рд╣рдо рдЗрд╕реЗ рджреЛ рдкрд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддреЗ рд╣реБрдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:
рдпрд╣ рдЬрдЯрд┐рд▓ рд▓рдЧрддрд╛ рд╣реИ (рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП), рддреЛ рдЪрд▓реЛ рдЗрд╕реЗ рд╕рд╣реА рдХрд░реЗрдВред рдЗрд╕ рд╕рдореАрдХрд░рдг рдореЗрдВ | F | - рдпрд╣ рдмрд▓ рдХрд╛ рдкрд░рд┐рдорд╛рдг рд╣реИ, рдЬреЛ рджреЛрдиреЛрдВ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реИред рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ m_1 рдФрд░ m_2 рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред k, рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рд╕реНрдерд┐рд░рд╛рдВрдХ рд╣реИ рдФрд░ r рд╡рд╕реНрддреБрдУрдВ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдХреЗрдВрджреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рд╣реИред рдЕрднреА рднреА рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ? рдпрд╣рд╛рдБ рдПрдХ рджреГрд╖реНрдЯрд╛рдВрдд рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
рдпрджрд┐ рд╣рдо рдХреБрдЫ рджрд┐рд▓рдЪрд╕реНрдк рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рджреЛ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд╕реНрддреБрдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдЗрд╕ рдЫрд╡рд┐ рдореЗрдВ, рд╣рдо рджреЛ рдирд╛рд░рдВрдЧреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ F_1 рдФрд░ F_2 рдмрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рд▓реЗ рд░рдВрдЧ рдореЗрдВ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП рджреЗрдЦрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдкрд░рд┐рдгрд╛рдореА рдмрд▓ F рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:- рдкрд╣рд▓реЗ рд╣рдо рдкрд┐рдЫрд▓реЗ рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ F_1 рдФрд░ F_2 рдмрд▓реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ:

- рдлрд┐рд░ рд╕рдм рдХреБрдЫ рд╡реИрдХреНрдЯрд░ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ:

рдорд╣рд╛рди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЧрдгрдирд╛рдПрдВ рд╣реИрдВред рд╣рдо рдЗрд╕реЗ рдХреЛрдб рдореЗрдВ рдХреИрд╕реЗ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ? рдореИрдВ рдЖрдкрдХреЛ рдордзреНрдпрд╡рд░реНрддреА рдЪрд░рдгреЛрдВ рд╕реЗ рдмреЛрд░ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдореИрдВ рддреБрд░рдВрдд рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рдХреЛрдб рджреВрдВрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдП, рддреЛ рдЖрдк рдореБрдЭреЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореИрдВ рдЖрдкрдХреЗ рд╕рднреА рд╕рд╡рд╛рд▓реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреВрдВрдЧрд╛редfunction moveWithGravity(dt, o) {
for (let o1 of o) {
o1.fx = 0
o1.fy = 0
}
for (let [i, o1] of o.entries()) {
for (let [j, o2] of o.entries()) {
if (i < j) {
let dx = o2.x - o1.x
let dy = o2.y - o1.y
let r = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2))
if (r < 1) {
r = 1
}
let f = (1000 * o1.m * o2.m) / Math.pow(r, 2)
let fx = f * dx / r
let fy = f * dy / r
o1.fx += fx
o1.fy += fy
o2.fx -= fx
o2.fy -= fy
}
}
}
for (let o1 of o) {
let ax = o1.fx / o1.m
let ay = o1.fy / o1.m
o1.vx += ax * dt
o1.vy += ay * dt
o1.x += o1.vx * dt
o1.y += o1.vy * dt
}
}
рд╕рдВрдШрд░реНрд╖
рдЪрд▓рддреЗ рд╣реБрдП рд╢рд░реАрд░ рдХрднреА-рдХрднреА рдЯрдХрд░рд╛рддреЗ рд╣реИрдВред рдПрдХ рдЯрдХрд░рд╛рд╡ рд╕реЗ, рдпрд╛ рддреЛ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджреВрд╕рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрд╛рд╣рд░ рдзрдХреЗрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдХреБрдЫ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рджреВрд╕рд░реЛрдВ рд╕реЗ рдЙрдЫрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ
, рдзрдХреЗрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ: рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЯрдХреНрдХрд░ рдереА:class Collision {
constructor(o1, o2, dx, dy, d) {
this.o1 = o1
this.o2 = o2
this.dx = dx
this.dy = dy
this.d = d
}
}
function checkCollision(o1, o2) {
let dx = o2.x - o1.x
let dy = o2.y - o1.y
let d = Math.sqrt(Math.pow(dx, 2) + Math.pow(dy, 2))
if(d < o1.r + o2.r){
return {
collisionInfo: new Collision(o1, o2, dx, dy, d),
collided: true
}
}
return {
collisionInfo: null,
collided: false
}
}
рд╣рдо рдПрдХ рдЯрдХрд░рд╛рд╡ рд╡рд░реНрдЧ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рджреЛ рдЯрдХрд░рд╛рддреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред CheckCollision рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╡рд╕реНрддреБрдУрдВ рдХреЗ x рдФрд░ y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдлрд┐рд░ рд╣рдо рдЙрдирдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рджреВрд░реА d рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХрд╛ рдпреЛрдЧ рдЙрдирдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рд╕реЗ рдХрдо рд╣реИ, рддреЛ рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЯрдХрд░рд╛рд╡ рд╣реБрдЖ рдерд╛ - рдХреЛрд▓рд╛рдЗрдб рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рдПрдВред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рд╡рд┐рд╕реНрдерд╛рдкрди рдФрд░ рдЗрд╕рдХреА рдкрд░рд┐рдорд╛рдг (рдкрд░рд┐рдорд╛рдг) рдХреА рджрд┐рд╢рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:n_x = d_x / d ... рдпрд╣ рд╡реЗрдХреНрдЯрд░n_y = d_y / ds = r_1 + r_2 - d рд╣реИ ... рдпрд╣ рдЯрдХрд░рд╛рд╡ рдХреА "рдкрд░рд┐рдорд╛рдг" рд╣реИ (рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ рджреЗрдЦреЗрдВ)
рдЬреЗрдПрд╕ рдореЗрдВ, рдпрд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП:function resolveCollision(info){
let nx = info.dx / info.d
let ny = info.dy / info.d
let s = info.o1.r + info.o2.r - info.d
info.o1.x -= nx * s/2
info.o1.y -= ny * s/2
info.o2.x += nx * s/2
info.o2.y += ny * s/2
}
рдЙрдЫрд╛рд▓
рдкрд╣реЗрд▓реА рдХрд╛ рдЕрдВрддрд┐рдо рднрд╛рдЧ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЯрдХрд░рд╛рд╡ рдореЗрдВ рдЙрдЫрд╛рд▓ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдореИрдВ рд╕рднреА рдЧрдгрд┐рддреАрдп рдЧрдгрдирд╛ рдирд╣реАрдВ рджреВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рд▓реЗрдЦ рдмрд╣реБрдд рд▓рдВрдмрд╛ рдФрд░ рдЙрдмрд╛рдК рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдореИрдВ рдЦреБрдж рдХреЛ рдЗрд╕ рддрдереНрдп рддрдХ рд╕реАрдорд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдореИрдВ рдЧрддрд┐ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рдирд┐рдпрдо рдФрд░ рдКрд░реНрдЬрд╛ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рдХреЗ рдХрд╛рдиреВрди рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддрд╛ рд╣реВрдВ, рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рджреВ рдлрд╛рд░реНрдореВрд▓реЗ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ:k = -2 * (o2.vx) - o1.vx) * nx + (o2.vy - o1.vy) * ny) / (1 / o1.m + 1 / o2.m) ... * рдЬрд╛рджреВ *рд╣рдо рдЬрд╛рджреВ k рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╕реНрддреБрдПрдВ рдХрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рдмрдврд╝реЗрдВрдЧреА, рд▓реЗрдХрд┐рди рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдХрд┐рддрдиреА рджреВрд░ рд╣реИред рдпрд╣ рдХреЗред рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╡реЗрдХреНрдЯрд░ (z) рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХрд╣рд╛рдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:function resolveCollisionWithBounce(info){
let nx = info.dx / info.dy
let ny = info.dy / info.d
let s = info.o1.r + info.o2.r - info.d
info.o1.x -= nx * s/2
info.o1.y -= ny * s/2
info.o2.x += nx * s/2
info.o2.y += ny * s/2
let k = -2 ((info.o2.vx - info.o1.vx) * nx + (info.o2.vy - info.o1.vy) * ny) / (1/info.o1.m + 1/info.o2.m)
info.o1.vx -= k * nx / info.o1.m
info.o1.vy -= k * ny / info.o1.m
info.o2.vx += k * nx / info.o2.m
info.o2.vy += k * ny / info.o2.m
}
рдирд┐рд╖реНрдХрд░реНрд╖
рд▓реЗрдЦ рдореЗрдВ рдХрдИ рд╕рдореАрдХрд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдиреЗ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдереЛрдбрд╝реА рдорджрдж рдХреА рд╣реИ рдХрд┐ рдЬреЗрдПрд╕ рдореЗрдВ рднреМрддрд┐рдХ рдШрдЯрдирд╛рдПрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред