Further cleanup of point types

This commit is contained in:
be5invis 2020-12-05 19:01:16 -08:00
parent 82cea0e06d
commit e58a6965db
14 changed files with 231 additions and 252 deletions

View file

@ -1,71 +1,63 @@
"use strict";
module.exports = class Point {
constructor(x, y, on, cubic) {
class Point {
constructor(type, x, y) {
this.type = type;
this.x = x;
this.y = y;
this.on = on;
this.cubic = cubic;
}
get on() {
throw new Error("Unreachable");
}
get cubic() {
throw new Error("Unreachable");
}
add(z2) {
return this.addScale(1, z2);
}
addScale(scale, z2) {
return new Point(this.x + scale * z2.x, this.y + scale * z2.y, this.on, this.cubic);
return new Point(this.type, this.x + scale * z2.x, this.y + scale * z2.y);
}
mix(scale, z2) {
return new Point(
this.type,
this.x + scale * (z2.x - this.x),
this.y + scale * (z2.y - this.y),
this.on,
this.cubic
this.y + scale * (z2.y - this.y)
);
}
scale(t) {
return new Point(t * this.x, t * this.y, this.on, this.cubic);
return new Point(this.type, t * this.x, t * this.y);
}
round(d) {
return new Point(
Math.round(d * this.x) / d,
Math.round(d * this.y) / d,
this.on,
this.cubic
);
return new Point(this.type, Math.round(d * this.x) / d, Math.round(d * this.y) / d);
}
static from(z, on, cubic) {
return new Point(z.x || 0, z.y || 0, on, cubic);
static from(type, z) {
return new Point(type, z.x || 0, z.y || 0);
}
static cornerFrom(z) {
return new Point(z.x || 0, z.y || 0, true, false);
}
static offFrom(z) {
return new Point(z.x || 0, z.y || 0, false, false);
}
static cubicOffFrom(z) {
return new Point(z.x || 0, z.y || 0, false, true);
}
static cornerFromXY(x, y) {
return new Point(x || 0, y || 0, true, false);
}
static offFromXY(x, y) {
return new Point(x || 0, y || 0, false, false);
}
static cubicOffFromXY(x, y) {
return new Point(x || 0, y || 0, false, true);
static fromXY(type, x, y) {
return new Point(type, x || 0, y || 0);
}
static transformed(tfm, z) {
return Point.transformedXY(tfm, z.x, z.y, z.on, z.cubic);
return Point.transformedXY(tfm, z.type, z.x, z.y);
}
static transformedXY(tfm, x, y, on, cubic) {
static transformedXY(tfm, type, x, y) {
return new Point(
type,
x * tfm.xx + y * tfm.yx + tfm.x || 0,
x * tfm.xy + y * tfm.yy + tfm.y || 0,
on,
cubic
x * tfm.xy + y * tfm.yy + tfm.y || 0
);
}
static translated(z, dx, dy) {
return new Point(z.x + dx || 0, z.y + dy || 0, z.on, z.cubic);
return new Point(z.type, z.x + dx || 0, z.y + dy || 0);
}
}
Point.Type = {
Corner: 0,
CubicStart: 1,
CubicEnd: 2,
Quadratic: 3
};
module.exports = Point;