mirror of
https://github.com/belsabbagh/dotfiles.git
synced 2026-04-11 09:36:46 +00:00
155 lines
2.8 KiB
JavaScript
155 lines
2.8 KiB
JavaScript
.pragma library
|
|
|
|
/**
|
|
* @param {number} x
|
|
* @param {number} y
|
|
* @returns {Point}
|
|
*/
|
|
function createPoint(x, y) {
|
|
return new Point(x, y);
|
|
}
|
|
|
|
class Point {
|
|
/**
|
|
* @param {float} x
|
|
* @param {float} y
|
|
*/
|
|
constructor(x, y) {
|
|
this.x = x;
|
|
this.y = y;
|
|
}
|
|
|
|
/**
|
|
* @param {float} x
|
|
* @param {float} y
|
|
* @returns {Point}
|
|
*/
|
|
copy(x = this.x, y = this.y) {
|
|
return new Point(x, y);
|
|
}
|
|
|
|
/**
|
|
* @returns {float}
|
|
*/
|
|
getDistance() {
|
|
return Math.sqrt(this.x * this.x + this.y * this.y);
|
|
}
|
|
|
|
/**
|
|
* @returns {float}
|
|
*/
|
|
getDistanceSquared() {
|
|
return this.x * this.x + this.y * this.y;
|
|
}
|
|
|
|
/**
|
|
* @param {Point} other
|
|
* @returns {float}
|
|
*/
|
|
dotProduct(other) {
|
|
return this.x * other.x + this.y * other.y;
|
|
}
|
|
|
|
/**
|
|
* @param {float} otherX
|
|
* @param {float} otherY
|
|
* @returns {float}
|
|
*/
|
|
dotProductScalar(otherX, otherY) {
|
|
return this.x * otherX + this.y * otherY;
|
|
}
|
|
|
|
/**
|
|
* @param {Point} other
|
|
* @returns {boolean}
|
|
*/
|
|
clockwise(other) {
|
|
return this.x * other.y - this.y * other.x > 0;
|
|
}
|
|
|
|
/**
|
|
* @returns {Point}
|
|
*/
|
|
getDirection() {
|
|
const d = this.getDistance();
|
|
return this.div(d);
|
|
}
|
|
|
|
/**
|
|
* @returns {Point}
|
|
*/
|
|
negate() {
|
|
return new Point(-this.x, -this.y);
|
|
}
|
|
|
|
/**
|
|
* @param {Point} other
|
|
* @returns {Point}
|
|
*/
|
|
minus(other) {
|
|
return new Point(this.x - other.x, this.y - other.y);
|
|
}
|
|
|
|
/**
|
|
* @param {Point} other
|
|
* @returns {Point}
|
|
*/
|
|
plus(other) {
|
|
return new Point(this.x + other.x, this.y + other.y);
|
|
}
|
|
|
|
/**
|
|
* @param {float} operand
|
|
* @returns {Point}
|
|
*/
|
|
times(operand) {
|
|
return new Point(this.x * operand, this.y * operand);
|
|
}
|
|
|
|
/**
|
|
* @param {float} operand
|
|
* @returns {Point}
|
|
*/
|
|
div(operand) {
|
|
return new Point(this.x / operand, this.y / operand);
|
|
}
|
|
|
|
/**
|
|
* @param {float} operand
|
|
* @returns {Point}
|
|
*/
|
|
rem(operand) {
|
|
return new Point(this.x % operand, this.y % operand);
|
|
}
|
|
|
|
/**
|
|
* @param {Point} start
|
|
* @param {Point} stop
|
|
* @param {float} fraction
|
|
* @returns {Point}
|
|
*/
|
|
static interpolate(start, stop, fraction) {
|
|
return new Point(
|
|
start.x + (stop.x - start.x) * fraction,
|
|
start.y + (stop.y - start.y) * fraction
|
|
);
|
|
}
|
|
|
|
/**
|
|
* @param {function(float, float): Point} f
|
|
* @returns {Point}
|
|
*/
|
|
transformed(f) {
|
|
const result = f(this.x, this.y);
|
|
return new Point(result.x, result.y);
|
|
}
|
|
|
|
/**
|
|
* @returns {Point}
|
|
*/
|
|
rotate90() {
|
|
return new Point(-this.y, this.x);
|
|
}
|
|
}
|
|
|