Published
Edited
Nov 20, 2021
Fork of Point
Insert cell
Insert cell
Insert cell
class Line {
constructor(...line) {
if (Object.prototype.toString.call(line) === "[object Array]" && line.length === 1) {
this.gradient = line[0].gradient || 0;
this.offset = line[0].offset || 0;
}

if (Object.prototype.toString.call(line) === "[object Array]" && line.length === 2) {
if (line[0].equals(line[1])) {
return {err: 'repeated points'}
}

if (line[0].x === line[1].x) {
this.gradient = Infinity
this.offset = line[0].x
} else if (line[0].y === line[1].y) {
this.gradient = 0
this.offset = line[0].y
} else {
this.gradient = (line[0].y - line[1].y) / (line[0].x - line[1].x)
this.offset = line[0].y - (this.gradient * line[0].x)
}
}
}

equals(line) {
return this.gradient === line.gradient && this.offset === line.offset
}

slopeInterceptForm() {
return 'Y = ' + this.gradient + 'X + ' + this.offset
}

lineOnAxis() {
if (this.gradient === Infinity && this.offset === 0) {
return {err: 'is yAxis'}
}

if (this.gradient === 0 && this.offset === 0) {
return {err: 'is xAxis'}
}

if (this.gradient === Infinity) {
return {xAxis: new Point(this.offset, 0)}
}

if (this.gradient === 0) {
return {yAxis: new Point(0, this.offset)}
}

return {xAxis: new Point(- this.offset / this.gradient, 0), yAxis: new Point(0, this.offset)}
}

throughZero() {
return this.offset === 0 ? true : false
}

pointOnLine(point) {
return this.gradient * point.x + this.offset === point.y ? true : false
}

parallel(line) {
return line.gradient === this.gradient ? true : false
}

distance(line) {
if (line.gradient !== this.gradient) {
return 0
}

const radian = Math.atan(this.gradient)
const dy = Math.abs(this.offset - line.offset)
const d = Math.cos(radian) * dy

return d
}

intersection(line) {
if (line.gradient === this.gradient) {
return new Point('null', 'null')
}

const x = (line.offset - this.offset) / (this.gradient - line.gradient)
const y = [(this.gradient * line.offset) - (line.gradient * this.offset)] / (this.gradient - line.gradient)

return new Point(x, y)
}

move(offset) {
return new Line({gradient: this.gradient, offset: this.offset + offset})
}
}
Insert cell
Insert cell
{
let message = "";
const P1 = new Point(2, 8);
const P2 = new Point(4, 10);
const L = new Line(P1, P2);

// equals
if (L.equals(new Line(P1, P2)) !== true) {
message += `equals: L.equals(new Line(P1, P2)) !== true test failed. \n`;
}

if (L.equals(new Line({gradient: 1, offset: 6})) !== true) {
message += `equals: L.equals(new Line({gradient: 1, offset: 6})) !== true test failed. \n`;
}

// SlopeInterceptForm
if (L.slopeInterceptForm() !== 'Y = 1X + 6') {
message += `SlopeInterceptForm: L.slopeInterceptForm() !== 'Y = 1X + 6' test failed. \n`;
}

// Gradient, Offset
if (new Line(new Point(-1, -1), new Point(-1,0)).equals(new Line(new Point(-1,0), new Point(-1, -1))) !== true) {
message += `GradientAndOffset: new Line(new Point(-1, -1), new Point(-1,0)).equals(new Line(new Point(-1,0), new Point(-1, -1)) test failed. \n`;
}

if (new Line(new Point(-1, -1), new Point(-1,0)).equals(new Line({gradient: Infinity, offset: -1})) !== true) {
message += `GradientAndOffset: new Line(new Point(-1, -1), new Point(-1,0)).equals(new Line({gradient: Infinity, offset: -1})) !== true test failed. \n`;
}

if (new Line(new Point(-1, -1), new Point(0,-1)).equals(new Line({gradient: 0, offset: -1})) !== true) {
message += `GradientAndOffset: new Line(new Point(-1, -1), new Point(0,-1)).equals(new Line({gradient: 0, offset: -1})) !== true test failed. \n`;
}

if (new Line({gradient: 2, offset: 6}).gradient !== 2 || new Line({gradient: 2, offset: 6}).offset !== 6){
message += `GradientAndOffset: new Line({gradient: 2, offset: 6}).gradient !== 2 || new Line({gradient: 2, offset: 6}).offset !== 6 test failed. \n`;
}

if (new Line({gradient: 2}).gradient !== 2 || new Line({gradient: 2}).offset !== 0){
message += `GradientAndOffset: new Line({gradient: 2}).gradient !== 2 || new Line({gradient: 2}).offset !== 0 test failed. \n`;
}

if (new Line({offset: 5}).gradient !== 0 || new Line({offset: 5}).offset !== 5){
message += `GradientAndOffset: new Line({offset: 5}).gradient !== 0 || new Line({offset: 5}).offset !== 5 test failed. \n`;
}

// LineOnAxist
if(L.lineOnAxis().xAxis.equals(new Point(-6, 0)) !== true || L.lineOnAxis().yAxis.equals(new Point(0, 6)) !== true) {
message += `LineOnAxist: L.lineOnAxis().xAxis.equals(new Point(-6, 0)) !== true || L.lineOnAxis().yAxis.equals(new Point(0, 6)) !== true test failed. \n`;
}

if(new Line(new Point(1, 1), new Point(2, 1)).lineOnAxis().yAxis.equals(new Point(0, 1)) !== true) {
message += `LineOnAxist: new Line(new Point(1, 1), new Point(2, 1)).lineOnAxis().yAxis.equals(new Point(0, 1)) !== true test failed. \n`;
}

if(new Line(new Point(1, 1), new Point(1, 2)).lineOnAxis().xAxis.equals(new Point(1, 0)) !== true) {
message += `LineOnAxist: new Line(new Point(1, 1), new Point(1, 2)).lineOnAxis().xAxis.equals(new Point(1, 0)) !== true test failed. \n`;
}

// ThroughZero
if (L.throughZero() === true) {
message += `ThroughZero: L.throughZero() === true test failed. \n`;
}

if (new Line({gradient: 1, offset: 1}).throughZero() === true) {
message += `ThroughZero: new Line({gradient: 1, offset: 1}).throughZero() !== true test failed. \n`;
}

if (new Line({gradient: 1, offset: 0}).throughZero() !== true) {
message += `ThroughZero: new Line({gradient: 1, offset: 0}).throughZero() !== true test failed. \n`;
}

//PointOnLint
if (L.pointOnLine(new Point(0, 6)) !== true) {
message += `PointOnLint: L.pointOnLine(new Point(0, 6)) !== true test failed. \n`;
}

if (L.pointOnLine(new Point(0, 0)) === true) {
message += `PointOnLint: L.pointOnLine(new Point(0, 0)) === true test failed. \n`;
}

if (new Line({gradient: 0, offset: 1}).pointOnLine(new Point(1, 1)) !== true) {
message += `PointOnLine: new Line({gradient: 0, offset: 1}).pointOnLine(new Point(1, 1)) !== true test failed. \n`;
}

// Parallel
if (L.parallel(new Line({gradient: 1, offset: 10})) !== true) {
message += `Parallel: L.parallel(new Line(gradient: 4, offset: 10)) !== true test failed. \n`;
}

if (L.parallel(new Line(new Point(3, 6), new Point(0, 3))) !== true) {
message += `Parallel: L.parallel(new Line(new Point(3, 6), new Point(0, 3))) !== true test failed. \n`;
}

if (L.parallel(new Line({gradient: 2, offset: 10})) === true) {
message += `Parallel: L.parallel(new Line(gradient: 4, offset: 10)) !== true test failed. \n`;
}

// Distance
if (L.distance(new Line({gradient: 0, offset: 2})) !== 0) {
message += `Distance: L.distance(new Line({gradient: 0, offset: 2})) !== 0 test failed. \n`;
}
if (L.distance(new Line({gradient: 1, offset: 2})) !== 2 * Math.sqrt(2)) {
message += `Distance: L.distance(new Line({gradient: 1, offset: 2}) !== 2 * Math.sqrt(2) test failed. \n`;
}

if (L.distance(new Line({gradient: 1, offset: 10})) !== 2 * Math.sqrt(2)) {
message += `Distance: L.distance(new Line({gradient: 1, offset: 10})) !== 2 * Math.sqrt(2) test failed. \n`;
}

// Intersection
if (L.intersection(new Line({gradient: 1, offset: 2})).equals(new Point('null', 'null')) !== true) {
message += `Intersection: L.intersection(new Line({gradient: 1, offset: 2})).equals(new Point('null', 'null')) !== true test failed. \n`;
}
if (L.intersection(new Line({gradient: 2, offset: 2})).equals(new Point(4, 10)) !== true) {
message += `Intersection: L.intersection(new Line({gradient: 2, offset: 2})).equals(new Point(4, 10)) !== true test failed. \n`;
}

if (L.intersection(new Line({gradient: -1, offset: 2})).equals(new Point(-2, 4)) !== true) {
message += `Intersection: L.intersection(new Line({gradient: 2, offset: 2})).equals(new Point(4, 10)) !== true test failed. \n`;
}

// Move
if (L.move(3).equals(new Line({gradient: 1, offset: 9})) !== true) {
message += `Move: L.move(3).equals(new Line({gradient: 1, offset: 9}) test failed. \n`;
}

if (L.move(-3).equals(new Line({gradient: 1, offset: 3})) !== true) {
message += `Move: L.move(3).equals(new Line({gradient: 1, offset: 9}) test failed. \n`;
}

if (L.move(0).equals(L) !== true) {
message += `Move: L.move(0).equals(L) !== true test failed. \n`;
}
// Succeed?
if (message === "") {
message = "Succeed";
}

return md`${message}`;
}
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more