// Standard pythagoras
const pythagoras = (a, b) => Math.sqrt(a * a + b * b); // c = Math.sqrt(a*a + b*b)

// Using it to establish a simple distance calculation
// Here [x0, y0] .. define coordinate pairs in 2 dimensions
const distance2D = (x0, y0, x1, y1) => pythagoras(x1 - x0, y1 - y0);

// Expanding it to N dimensions
// vector is a list
// vector.reduce executes a reducer function (that you provide) on each element of the array, resulting in single output value. *1
const pythagorasND = (vector) => Math.sqrt(
  vector.reduce((sum, value) => sum + value * value)
);

// Expanding the distance function to N dimensions
// p0 and p1 are lists or vectors defining poinst in a respective dimension
// p0.map creates a new array populated with the results of calling a provided function on every element in the calling array
const distanceND = (p0, p1) => pythagorasND(
  p0.map((value, index) => value - p1[index])
);

// Keep in mind, for constant dimension sizes, it is always more performant to manually write out the distance function for the given dimension
const listA = [2,3,4,5];
const listB = [1,2,3,4];

console.log(distanceND(listA, listB)); // Prints: 2.0

// Practical Tasks
// Task 1: Create a function dedicated to finding the distance between two coordinate points in three dimensions by finishing these functions
// Replace 0s with your code

const pythagoras3D = (a, b, c) => 0;

const distance3D = (x0, y0, z0, x1, y1, y2) => pythagoras3D(
  0, 0, 0
);

// Results -- Should output: ~1.732
console.log("Task 1: expected", 1.732);

console.log(
  "Task 1: result", 
  distance3D(
    1, 2, 3, // First coordinate [x0, y0, z0]
    2, 3, 4  // Second coordinate [x1, y1, z1]
  )
); 

// Task 2: Find the closest point to our current position by finishing this formula
const ourPosition = [65,25];

const points = [
  [33,144],
  [155,55],
  [66,177],
  [76,12],
  [33,45]
];

let minimumDistance = 999999;
let closestPoint = null;

// Iterate through all the points, this can also be represented using array reduce, but is generally less readable that way
for (let i = 0; i < points.length; i++) {
  let point = points[i];
  let distance = 0;
  if (distance < minimumDistance) { // if the distance is less than the previous closest position, set the position and new minimum distance
    closestPoint = point;
    minimumDistance = distance;
  }
}

console.log("Task 2: expected", [76, 12], "with a distance of", 17.029);
console.log("Task 2: result", "The closest point is ", closestPoint, "with a distance of", minimumDistance);


External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.