Simple Physics Engine :: Reflection

A demo in several parts.

HTML

<canvas id="the_canvas" width="250" height="250"></canvas>

JavaScript

/*
 * Simple Physics Engine
 * http://jsfiddle.net/user/klenwell/fiddles/
 *
 * TODO:
 *   Add start/stop button
 *
 * NOTES:
 *   Resolves vanishing ball issue by adding last_point method to ball object
 *     for Physics.find_contact_point, but still occasional wedging issues
 */
var __VERSION__ = "0.3.5"
var inspector = {};

var Physics = {
    
    collide_balls: function(ball1, ball2) {
        // calculate restitution
        // TODO: add elasticity attr to circles
        var ball1_elasticity = 1.0;
        var ball2_elasticity = 1.0;
        
        
        // invert masses
        var im1 = 1.0 / ball1.m;
        var im2 = 1.0 / ball2.m;
        
        // get minimum translation distance
        var delta = ball1.point().subtract(ball2.point()); // soustrait vecteur B de A
        var d = delta.get_length();
        var mtd = delta.multiply(ball1.r + ball2.r - d).multiply(1.0 / d);
        
        // push-pull apart based on mass
        var ball1_pt = ball1.point().add(mtd.multiply(im1 / (im1 + im2)));
        var ball2_pt = ball2.point().subtract(mtd.multiply(im2 / (im1 + im2)));
        ball1.set_point(ball1_pt.x, ball1_pt.y);
        ball2.set_point(ball2_pt.x, ball2_pt.y);
        
        // calculate impact speed
        var v = ball1.velocity().subtract(ball2.velocity());
        var vn = v.dot(mtd.normalized());
        
        // positive vn means balls are already moving away for one another
        if ( vn > 0 ) {
            return;
        }
        var restitution = ball1_elasticity * ball2_elasticity;
        
        // collision impulse
        var i = (-1.0 * (1.0 + restitution) * vn) / (im1 + im2);
        var impulse = mtd.normalized().multiply(i);
        
        // transfer momentum
        var v1 = ball1.velocity().add(impulse.multiply(im1));
        var v2 = ball2.velocity().subtract(impulse.multiply(im2));
        
        // set new velocities
        ball1.set_velocity(v1.x, v1.y);
        ball2.set_velocity(v2.x,...