рд╣рдо рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рджреЛ-рдЖрдпрд╛рдореА рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ

рд╢реБрдн рджрд┐рди, рджреЛрд╕реНрддреЛрдВ!

рд╢рд╛рд░реАрд░рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдирд╛ рдПрдХ рдХрдард┐рди рдХрд╛рдо рдХреА рддрд░рд╣ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдмрд╣реБрдд рд╕рд░рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдЧрддрд┐, рддреНрд╡рд░рдг рдФрд░ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг (рдЖрдХрд░реНрд╖рдг) рдЬреИрд╕реА рднреМрддрд┐рдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ рдкреБрди: рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред

рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЬреЗрдПрд╕ рдореЗрдВ рдЗрди рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?



рдЙрджрд╛рд╣рд░рдг рдпрд╣рд╛рдВ рджреЗрдЦреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

рд╕реНрд░реЛрдд рдХреЛрдб рд╣реИ рдпрд╣рд╛рдБ ред

рд╡рд░реНрджреА рдФрд░ рддреНрд╡рд░рд┐рдд рдЧрддрд┐


рдЪрд▓реЛ рдЖрдВрджреЛрд▓рди рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рд╕рдорд╛рди рдЖрдВрджреЛрд▓рди рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

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 // vx += ax * dt
vy = 1 += 0 * 0.1 - > 1 // vy += ay * dt
x = 150 += -1.1 * 0.1 - > 149.89 // x += vx * dt;     -0.01
y = 50 += 1 * 0.1 - > 50.1 // y += vy * dt

рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг


рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреИрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рд╕реАрдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреИрд╕реЗ рдЙрдиреНрд╣реЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реИ? рдЗрд╕реЗ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдпрд╛ рдЧреБрд░реБрддреНрд╡рд╛рдХрд░реНрд╖рдг рдХрд╣рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдпрд╣рд╛рдБ рд╣рдо рдХреНрдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:



рдкрд╣рд▓реЗ, рдЪрд▓реЛ рд╣рд╛рдИ рд╕реНрдХреВрд▓ рд╕реЗ рдХреБрдЫ рд╕рдореАрдХрд░рдгреЛрдВ рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВред

рд╢рд░реАрд░ рдкрд░ рд▓рд╛рдЧреВ рдмрд▓ рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрди рд╕реВрддреНрд░ рджреНрд╡рд╛рд░рд╛ рдХреА рдЬрд╛рддреА рд╣реИ:
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) { // 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) { //     0
                    r = 1
                }

                //     ; k = 1000
                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 / d

s = r_1 + r_2 - d рд╣реИ ... рдпрд╣ рдЯрдХрд░рд╛рд╡ рдХреА "рдкрд░рд┐рдорд╛рдг" рд╣реИ (рдиреАрдЪреЗ рджреА рдЧрдИ рддрд╕реНрд╡реАрд░ рджреЗрдЦреЗрдВ)



рдЬреЗрдПрд╕ рдореЗрдВ, рдпрд╣ рджрд┐рдЦ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП:

function resolveCollision(info){ // "info" -   Collision   
    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 //   ,   "k"   "s/2"  "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
}

рдирд┐рд╖реНрдХрд░реНрд╖


рд▓реЗрдЦ рдореЗрдВ рдХрдИ рд╕рдореАрдХрд░рдг рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдиреЗ рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдереЛрдбрд╝реА рдорджрдж рдХреА рд╣реИ рдХрд┐ рдЬреЗрдПрд╕ рдореЗрдВ рднреМрддрд┐рдХ рдШрдЯрдирд╛рдПрдВ рдФрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИрдВред

All Articles