malwoden
Version:
   
109 lines • 3.54 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Vector = void 0;
/** Contains math for common vector operations. */
var Vector = /** @class */ (function () {
function Vector() {
}
/**
* Returns true if two vectors have the same x and y values.
* @param v1 The first Vector2.
* @param v2 The second Vector2.
*/
Vector.areEqual = function (v1, v2) {
return v1.x === v2.x && v1.y === v2.y;
};
/**
* Returns the distance between two vectors.
*
* If no topology is given, diagonal distance is sqrt(2).
* If topology is four, diagonal distance is 2.
* If topology is eight, diagonal distance is 1.
*
* @param start The starting Vector2.
* @param end The ending Vector2.
* @param topology Can use "four" or "eight" for non-cartesian distances.
*/
Vector.getDistance = function (start, end, topology) {
if (topology === "four") {
return Math.abs(start.x - end.x) + Math.abs(start.y - end.y);
}
else if (topology === "eight") {
return Math.max(Math.abs(start.x - end.x), Math.abs(start.y - end.y));
}
else {
var a = start.x - end.x;
var b = start.y - end.y;
return Math.sqrt(a * a + b * b);
}
};
/**
* Will find the center of an area by averaging all Vectors in the area.
* This point may not be in the area itself, for example in a donut shaped area.
* @param area Vector2
*/
Vector.getCenter = function (area) {
if (area.length < 1) {
throw new Error("Error: Trying to find center of empty area");
}
var sx = 0;
var sy = 0;
for (var _i = 0, area_1 = area; _i < area_1.length; _i++) {
var v = area_1[_i];
sx += v.x;
sy += v.y;
}
return {
x: sx / area.length,
y: sy / area.length,
};
};
/**
* Will find the position in the area closest to the target
* @param area Vector2[]
* @param target Vector2
* @param topology Either 'four' or 'eight'. Default 'four'
*/
Vector.getClosest = function (area, target, topology) {
if (topology === void 0) { topology = "four"; }
// Throw an error if area is empty
if (area.length < 1) {
throw new Error("Error: Trying to find closest position of an empty area");
}
// Keep track of the closest we've found.
var minDistance = Infinity;
var closest = area[0];
for (var _i = 0, area_2 = area; _i < area_2.length; _i++) {
var v = area_2[_i];
var distance = Vector.getDistance(target, v, topology);
// Found exact one, immediately return
if (distance === 0) {
return {
x: target.x,
y: target.y,
};
}
// Closer than currently known
if (distance < minDistance) {
minDistance = distance;
closest = v;
}
}
return closest;
};
Vector.add = function (v1, v2) {
return {
x: v1.x + v2.x,
y: v1.y + v2.y,
};
};
Vector.subtract = function (v1, v2) {
return {
x: v1.x - v2.x,
y: v1.y - v2.y,
};
};
return Vector;
}());
exports.Vector = Vector;
//# sourceMappingURL=vector.js.map