143 lines
4.9 KiB
JavaScript
143 lines
4.9 KiB
JavaScript
////////////////////////////////////////////////////////////
|
|
//// © Microsoft. All rights reserved. ////
|
|
////////////////////////////////////////////////////////////
|
|
|
|
(function (AppNS) {
|
|
'use strict';
|
|
|
|
// The Vector class represents a position-less vector in 2-Dimensional space.
|
|
// A Vector has direction and length, both represented in the form of change in x and change in y.
|
|
var Vector = WinJS.Class.define(
|
|
|
|
// Constructor
|
|
function (x, y) {
|
|
this.x = x || 0; // The x-component of this vector
|
|
this.y = y || 0; // The y-component of this vector
|
|
},
|
|
|
|
// Variables and Functions
|
|
{
|
|
// The length of this vector, as calculated by it's x and y components
|
|
length: {
|
|
get: function () {
|
|
return Math.sqrt(this.x * this.x + this.y * this.y);
|
|
},
|
|
set: function (length) {
|
|
this.normalize();
|
|
this.scale(length);
|
|
}
|
|
},
|
|
|
|
// Return the dot product of this vector and v
|
|
dot: function (vector) {
|
|
return this.x * vector.x + this.y * vector.y;
|
|
},
|
|
|
|
// Sets this vector to the given x and y
|
|
fromXY: function (x, y) {
|
|
this.x = x;
|
|
this.y = y;
|
|
},
|
|
|
|
// Set this vector to the given vector
|
|
fromVector: function (vector) {
|
|
this.x = vector.x;
|
|
this.y = vector.y;
|
|
},
|
|
|
|
// Create a vector from point1 pointing towards point2
|
|
fromPoints: function (point1, point2) {
|
|
this.x = point2.x - point1.x;
|
|
this.y = point2.y - point1.y;
|
|
},
|
|
|
|
// Rotates this vector by 90 degrees counter-clockwise, making it perpendicular to what it was
|
|
toPerp: function () {
|
|
var temp = this.x;
|
|
this.x = -1 * this.y
|
|
this.y = temp;
|
|
},
|
|
|
|
// Rotates this vector counter-clockwise by angle in radians
|
|
rotate: function (angle) {
|
|
var cos = Math.cos(angle);
|
|
var sin = Math.sin(angle);
|
|
var x = this.x;
|
|
var y = this.y;
|
|
this.x = x * cos - y * sin;
|
|
this.y = x * sin + y * cos;
|
|
},
|
|
|
|
// Scales this vector by a constant
|
|
scale: function (constant) {
|
|
this.x = this.x * constant;
|
|
this.y = this.y * constant;
|
|
},
|
|
|
|
// Returns the angle in radians between this vector and v
|
|
angle: function (vector) {
|
|
var l1 = this.length;
|
|
var l2 = vector.length;
|
|
if (l1 !== 0 && l2 !== 0) {
|
|
var val = this.dot(vector) / (l1 * l2);
|
|
val = val > 1.0 ? 1.0 : val;
|
|
val = val < -1.0 ? -1.0 : val;
|
|
return Math.acos(val);
|
|
}
|
|
},
|
|
|
|
// Returns the slope (dy/dx) of this vector
|
|
getSlope: function () {
|
|
return this.y / this.x;
|
|
},
|
|
|
|
// Normalizes (sets to length 1) this vector
|
|
normalize: function () {
|
|
var length = this.length;
|
|
if (length !== 0) {
|
|
this.scale(1 / length);
|
|
}
|
|
},
|
|
|
|
// Sets this vector to the result of subtracting the given vector from this
|
|
sub: function (vector) {
|
|
this.x = this.x - vector.x;
|
|
this.y = this.y - vector.y;
|
|
},
|
|
|
|
// Sets this vector to the result of adding the given vector to this
|
|
add: function (vector) {
|
|
this.x = this.x + vector.x;
|
|
this.y = this.y + vector.y;
|
|
},
|
|
|
|
// Returns true if this vector is equal to another
|
|
equals: function (vector) {
|
|
return this.x === vector.x && this.y === vector.y;
|
|
},
|
|
|
|
// Returns a copy of this vector
|
|
copy: function () {
|
|
return new AppNS.Painter.Math.Vector(this.x, this.y);
|
|
},
|
|
|
|
// Projects this vector onto the given direction.
|
|
// Note: the length of the direction vector is irrelevant.
|
|
project: function (vector) {
|
|
var direction = vector.copy();
|
|
var length = this.componentIn(direction);
|
|
direction.length = length;
|
|
this.fromVector(direction);
|
|
},
|
|
|
|
// Returns the length of the component of this vector in the given vector's direction
|
|
componentIn: function (vector) {
|
|
return this.dot(vector) / vector.length;
|
|
}
|
|
});
|
|
|
|
WinJS.Namespace.defineWithParent(AppNS, "Painter.Math", {
|
|
Vector: Vector
|
|
});
|
|
|
|
})(Microsoft.Paint);
|