Рассчитать расстояние между точками с большими значениями xy - PullRequest
0 голосов
/ 05 января 2012

Я пытаюсь сравнить расстояние между пунктом 1 и пунктом 2 с расстоянием между пунктом 1 и пунктом 3. И я пытаюсь найти меньшее.Единственная проблема состоит в том, что значения xy всех трех точек довольно велики, и использование формулы расстояния, вероятно, вызовет переполнение.Есть ли другой способ узнать расстояния?

Ответы [ 3 ]

2 голосов
/ 05 января 2012

Масштабируйте значения с помощью константы, рассчитайте расстояние, затем «отмените масштаб» значений.Например, разделите ваши значения на 10 ^ 6, или 10 ^ 9, или что угодно, затем рассчитайте масштабированное расстояние и затем выполните обратное преобразование, используя вашу постоянную масштаба.

1 голос
/ 05 января 2012

Это самое быстрое решение:

double dx12=x1-x2;
double dy12=y1-y2; 
double dx13=x1-x3; 
double dy13=y1-y3; 
double r12sq=dx12*dx12+dy12*dy12;
double r13sq=dx13*dx13+dy13*dy13;
int minR= r12sq>r13sq ? Math.sqrt(r13sq) : Math.sqrt(r12sq);

вам нужно взять только один sqrt - этот самый короткий путь.

Нормализация некоторой фиксированной константой для двойного не имеет смысла.

Если вы используете целые числа вместо двойных, нормализация и центрирование координат по некоторой фиксированной константе может быть полезно для одних расстояний и плохо для других. Например, если вы делите на 1000, это хорошо для координат, которые имеют различия в несколько миллиардов, но для различий в несколько сотен его эффект будет убийственным. Таким образом, вы можете оценить полезный коэффициент нормализации только после того, как у вас есть среда dx и dy. Давайте вам понадобится 4 цифры для работы

int dx12=x1-x2;
int dy12=y1-y2; 
int dx13=x1-x3; 
int dy13=y1-y3; 
int d=(abs(dx12) +abs(dx13) + abs(dy12) + abs(dy13));

int coeff = d/10000;
if(coeff<1) coeff=1;

int dx12=dx12/coeff;
int dy12=dy12/coeff; 
int dx13=dx13/coeff; 
int dy13=dy13/coeff;

int r12sq=dx12*dx12+dy12*dy12;
int r13sq=dx13*dx13+dy13*dy13;
int minR= r12sq>r13sq ? Math.sqrt(r13sq) : Math.sqrt(r12sq);

Здесь вы можете умножить эти переменные int без переполнения.

1 голос
/ 05 января 2012

Math.hypot() может быть полезно в этом контексте, так как «конечный результат без потери или переполнения среды».

...