UNPKG

p2s

Version:

A JavaScript 2D physics engine.

93 lines (79 loc) 2.62 kB
var Shape = require('./Shape') , shallowClone = require('../utils/Utils').shallowClone , 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 * @example * var body = new Body(); * var lineShape = new Line({ * length: 1 * }); * body.addShape(lineShape); */ function Line(options){ options = options ? shallowClone(options) : {}; /** * Length of this line * @property {Number} length * @default 1 */ this.length = options.length !== undefined ? options.length : 1; options.type = Shape.LINE; Shape.call(this, options); } Line.prototype = new Shape(); Line.prototype.constructor = Line; Line.prototype.computeMomentOfInertia = function(){ return 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_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); } };