Files
dotfiles/.config/quickshell/nucleus-shell/modules/components/morphedPolygons/shapes/point.js

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);
}
}