File: src/shapes/Line.js
var Shape = require('./Shape')
, vec2 = require('../math/vec2');
module.exports = Line;
/**
* Line shape class. The line shape is along the x direction, and stretches from [-length/2, 0] to [length/2,0].
* @class Line
* @param {object} [options] (Note that this options object will be passed on to the {{#crossLink "Shape"}}{{/crossLink}} constructor.)
* @param {Number} [options.length=1] The total length of the line
* @extends Shape
* @constructor
*/
function Line(options){
if(typeof(arguments[0]) === 'number'){
options = {
length: arguments[0]
};
console.warn('The Line constructor signature has changed. Please use the following format: new Line({ length: 1, ... })');
}
options = options || {};
/**
* Length of this line
* @property {Number} length
* @default 1
*/
this.length = options.length || 1;
options.type = Shape.LINE;
Shape.call(this, options);
}
Line.prototype = new Shape();
Line.prototype.constructor = Line;
Line.prototype.computeMomentOfInertia = function(mass){
return mass * Math.pow(this.length,2) / 12;
};
Line.prototype.updateBoundingRadius = function(){
this.boundingRadius = this.length/2;
};
var points = [vec2.create(),vec2.create()];
/**
* @method computeAABB
* @param {AABB} out The resulting AABB.
* @param {Array} position
* @param {Number} angle
*/
Line.prototype.computeAABB = function(out, position, angle){
var l2 = this.length / 2;
vec2.set(points[0], -l2, 0);
vec2.set(points[1], l2, 0);
out.setFromPoints(points,position,angle,0);
};
var raycast_hitPoint = vec2.create();
var raycast_normal = vec2.create();
var raycast_l0 = vec2.create();
var raycast_l1 = vec2.create();
var raycast_unit_y = vec2.fromValues(0,1);
/**
* @method raycast
* @param {RaycastResult} result
* @param {Ray} ray
* @param {number} angle
* @param {array} position
*/
Line.prototype.raycast = function(result, ray, position, angle){
var from = ray.from;
var to = ray.to;
var l0 = raycast_l0;
var l1 = raycast_l1;
// get start and end of the line
var halfLen = this.length / 2;
vec2.set(l0, -halfLen, 0);
vec2.set(l1, halfLen, 0);
vec2.toGlobalFrame(l0, l0, position, angle);
vec2.toGlobalFrame(l1, l1, position, angle);
var fraction = vec2.getLineSegmentsIntersectionFraction(l0, l1, from, to);
if(fraction >= 0){
var normal = raycast_normal;
vec2.rotate(normal, raycast_unit_y, angle); // todo: this should depend on which side the ray comes from
ray.reportIntersection(result, fraction, normal, -1);
}
};