Нахождение расстояния между 2 3D точками

Я сталкиваюсь с проблемой, когда мой квадрат X всегда становится бесконечным, что приводит к тому, что итоговое расстояние также становится бесконечным, однако я не вижу ничего плохого в моей собственной математике:

// Claculate distance

xSqr = (x1 - x2) * (x1 - x2);
ySqr = (y1 - y2) * (y1 - y2);
zSqr = (z1 - z2) * (z1 - z2);

double mySqr = xSqr + ySqr + zSqr;

double myDistance = sqrt(mySqr);

Когда я запускаю свою программу, я получаю пользовательский ввод для каждой из координат и затем отображаю расстояние после того, как я запустил расчет.

0

Решение

Если ваши входы одинарной точности float, тогда у вас все будет в порядке, если вы используете арифметику двойной точности:

xSqr = double(x1 - x2) * (x1 - x2);
//     ^^^^^^

Если входные данные уже имеют двойную точность, и у вас нет большего типа с плавающей точкой, то вам нужно изменить порядок вычисления евклидова расстояния, чтобы избежать переполнения:

r = sqrt(x^2 + y^2 + z^2)
= abs(x) * sqrt(1 + (y/x)^2 + (z/x)^2)

где x является самым большим из трех координатных расстояний.

В коде это может выглядеть примерно так:

double d[] = {abs(x1-x2), abs(y1-y2), abs(z1-z2)};
if (d[0] < d[1]) swap(d[0],d[1]);
if (d[0] < d[2]) swap(d[0],d[2]);
double distance = d[0] * sqrt(1.0 + d[1]/d[0] + d[2]/d[0]);

или, альтернативно, используйте hypot, который использует аналогичные методы, чтобы избежать переполнения:

double distance = hypot(hypot(x1-x2,y1-y2),z1-z2);

хотя это может быть недоступно в библиотеках C ++ до 2011 года.

7

Другие решения

Попробуй это:

long double myDistance=sqrt(pow(x1-x2,2.0)+pow(y1-y2,2.0)+pow(z1-z2,2.0));
2

Я понял, что происходит, я скопировал и вставил код для установки x1, y1 и z1 и забыл изменить его на x2 y2 и z2, это всегда самое глупое со мной: P в любом случае спасибо за помощь, ребята

0
По вопросам рекламы [email protected]