Home > Blockchain >  How to refactor and optimize function
How to refactor and optimize function

Time:12-21

I have two points in x,y,z format. If p1.x < p2.x I want my variable directionX = 1, otherwise directionX = -1.

"1" means later to increase p1.x in distance calculation until it becomes 15 (for example below). It's find unknow point task where I have only distance and starting point coordinates. Basically I did this task. But I can't refactor and orginize my code in better way =(

At first I want to find in what direction later to change x,y,z. By changing x,y,z I see how distance increases or decreases. This is my logic to find unknow point.

But I found difficult to refactor my "findDirection" function. It is huge and makes same work 3 times for x, y , z.

const p1 = { x: 11, y: 12, z: 2 };
const p2 = { x: 15, y: 10, z: 5 };


function calculateDistance(p1, p2) {
  const a = p2.x - p1.x;
  const b = p2.y - p1.y;
  const c = p2.z - p1.z;

  return Math.sqrt(a * a   b * b   c * c);
}

const distance = calculateDistance(p1, p2);

let directionX = 1;
let directionY = 1;
let directionZ = 1;

function findDirection(p1, p2, distance) {
  let newDistance = distance;

  p1.x  = 1;
  newDistance = calculateDistance(p1, p2);
  if (newDistance > distance) {
    directionX = -1;
  }
  p1.x -= 1;

  p1.y  = 1;
  newDistance = calculateDistance(p1, p2);
  if (newDistance > distance) {
    directionY = -1;
  }
  p1.y -= 1;

  p1.z  = 1;
  newDistance = calculateDistance(p1, p2);
  if (newDistance > distance) {
    directionZ = -1;
  }
  p1.z -= 1;
}

findDirection(p1, p2, distance);
console.log("directionX: "   directionX);
console.log("directionY: "   directionY);
console.log("directionZ: "   directionZ);

How to make like this

directionX = findDirection(p1, p2, distance, p1.x); 
// and have result 1 or -1;

CodePudding user response:

I would extract the calculation for each coordinate into a separate function. I pass the coordinate variable to it which chooses the corresponding key from the object. Also you don't need to mutate the p1 object, so I create a copy of it, but increment the required coordinate by 1. The resulting distance can also be an object rather than three separate variables.

const p1 = { x: 11, y: 12, z: 2 };
const p2 = { x: 15, y: 10, z: 5 };

function calculateDistance(p1, p2) {
  const a = p2.x - p1.x;
  const b = p2.y - p1.y;
  const c = p2.z - p1.z;

  return Math.sqrt(a * a   b * b   c * c);
}

function findDirectionForCoordinate(p1, p2, distance, coordinate) {
  const p = { ...p1 }; // make a copy of p1 so that we don't mutate the original object
  p[coordinate]  = 1; // increment the coordinate

  if (calculateDistance(p, p2) > distance) {
    return -1;
  }
  return 1;
}

function findDirection(p1, p2) {
  const distance = calculateDistance(p1, p2);
  return {
    x: findDirectionForCoordinate(p1, p2, distance, 'x'),
    y: findDirectionForCoordinate(p1, p2, distance, 'y'),
    z: findDirectionForCoordinate(p1, p2, distance, 'z')
  };
}

const direction = findDirection(p1, p2);
console.log('directionX: '   direction.x);
console.log('directionY: '   direction.y);
console.log('directionZ: '   direction.z);

CodePudding user response:

You could take a new object with incremented values and take a built in function for distance.

function getDistance(p1, p2) {
    return Math.hypot(p2.x - p1.x, p2.y - p1.y, p2.z - p1.z);
}

function findDirection(p1, p2) {
    const
        distance = getDistance(p1, p2),
        getDirection = key =>  (getDistance({...p1, [key]: p1[key]   1 }, p2) <= distance) || -1
        directionX = getDirection('x'),
        directionY = getDirection('y'),
        directionZ = getDirection('z');

    return { directionX, directionY, directionZ };
}

const
    p1 = { x: 11, y: 12, z: 2 },
    p2 = { x: 15, y: 10, z: 5 };

console.log(findDirection(p1, p2));

  • Related