File: src/shapes/Capsule.js
var Shape = require('./Shape')
, vec2 = require('../math/vec2');
module.exports = Capsule;
/**
* Capsule shape class.
* @class Capsule
* @constructor
* @extends Shape
* @param {Number} [length] The distance between the end points
* @param {Number} [radius] Radius of the capsule
*/
function Capsule(length,radius){
/**
* The distance between the end points.
* @property {Number} length
*/
this.length = length || 1;
/**
* The radius of the capsule.
* @property {Number} radius
*/
this.radius = radius || 1;
Shape.call(this,Shape.CAPSULE);
}
Capsule.prototype = new Shape();
/**
* Compute the mass moment of inertia of the Capsule.
* @method conputeMomentOfInertia
* @param {Number} mass
* @return {Number}
* @todo
*/
Capsule.prototype.computeMomentOfInertia = function(mass){
// Approximate with rectangle
var r = this.radius,
w = this.length + r, // 2*r is too much, 0 is too little
h = r*2;
return mass * (h*h + w*w) / 12;
};
/**
* @method updateBoundingRadius
*/
Capsule.prototype.updateBoundingRadius = function(){
this.boundingRadius = this.radius + this.length/2;
};
/**
* @method updateArea
*/
Capsule.prototype.updateArea = function(){
this.area = Math.PI * this.radius * this.radius + this.radius * 2 * this.length;
};
var r = vec2.create();
/**
* @method computeAABB
* @param {AABB} out The resulting AABB.
* @param {Array} position
* @param {Number} angle
*/
Capsule.prototype.computeAABB = function(out, position, angle){
var radius = this.radius;
// Compute center position of one of the the circles, world oriented, but with local offset
vec2.set(r,this.length,0);
vec2.rotate(r,r,angle);
// Get bounds
vec2.set(out.upperBound, Math.max(r[0]+radius, -r[0]+radius),
Math.max(r[1]+radius, -r[1]+radius));
vec2.set(out.lowerBound, Math.min(r[0]-radius, -r[0]-radius),
Math.min(r[1]-radius, -r[1]-radius));
// Add offset
vec2.add(out.lowerBound, out.lowerBound, position);
vec2.add(out.upperBound, out.upperBound, position);
};