(let* ( (ObjMass (obj 'getMass))
(collisionObjMass (collisionObj 'getMass))
(normalVec ((origin 'getNormalVec) otherOrig))
(unitNormalVec (normalvec 'getUnitNormalVec))
(unitTangentVec (unitNormalVec 'getUnitTangentVec))
(initialVelocity-obj (obj 'getSpeedVec))
(initialVelocity-collisionObj (collisionObj 'getSpeedVec))
(scalarVelocity-v1n ((unitNormalVec 'getDotProduct) initialVelocity-obj))
(scalarVelocity-v1t ((unitTangentVec 'getDotProduct) initialVelocity-obj))
(scalarVelocity-v2n ((unitNormalVec 'getDotProduct) initialVelocity-collisionObj))
(scalarVelocity-v2t ((unitTangentVec 'getDotProduct) initialVelocity-collisionObj))
(newNormalVelocity (makeVector (/ (+ (* scalarVelocity-v1n (- objMass collisionObjMass))
(* 2 collisionObjMass scalarVelocity-v2n))
(+ objMass collisionObjMass))
(/ (+ (* scalarVelocity-v2n (- collisionObjMass objMass))
(* 2 objMass scalarVelocity-v1n))
(+ objMass collisionObjMass))))
(normalVel-v1n (newNormalVelocity 'getX))
(normalVel-v2n (newNormalVelocity 'getY))
(v1n ((unitNormalVec 'vec*) normalVel-v1n))
(v1t ((unitTangentVec 'vec*) scalarVelocity-v1t))
(v2n ((unitNormalVec 'vec*) normalVel-v2n))
(v2t ((unitTangentVec 'vec*) scalarVelocity-v2t))
(finalVelocity-obj ((v1n 'vec+) v1t))
(finalVelocity-collisionObj ((v2n 'vec+) v2t)))