如何重构和优化函数



我有两个x,y,z格式的点。如果p1。x & lt;p2。我希望我的变量directionX = 1,否则directionX = -1

"1";意味着之后增加p1。X在距离计算中,直到变为15(如下所示)。这是寻找未知点的任务,我只有距离和起点坐标。基本上我完成了这个任务。但是我不能以更好的方式重构和组织我的代码=(

)首先,我想找出x,y,z的变化方向。通过改变x y z,我看到距离是如何增加或减少的。这是我寻找未知点的逻辑。

但是我发现很难重构我的findDirection"函数。它是巨大的,对x, y, z做同样的工作3次。

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

如何制作成这样

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

我会将每个坐标的计算提取到一个单独的函数中。我将coordinate变量传递给它,它从对象中选择相应的键。此外,您不需要改变p1对象,因此我创建了它的副本,但将所需的坐标增加1。得到的距离也可以是一个对象,而不是三个独立的变量。

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

您可以接受一个具有递增值的新对象,并使用内置函数来表示距离。

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

最新更新