我正在尝试将点1和点2之间的距离与点1和点3之间的距离进行比较。我正在尝试找到较小的点。唯一的问题是所有三个点的xy值都相当大,使用距离公式可能会导致溢出。还有另一种方法可以找到距离吗?
答案 0 :(得分:2)
按常数缩放值,计算距离,然后“取消刻度”值。例如,将您的值除以10 ^ 6,或10 ^ 9,或其他任何值,然后计算缩放距离,然后使用您的比例常数转换回来。
答案 1 :(得分:1)
Math.hypot()
在这种情况下可能很有用,因为“最终结果是没有中等下溢或溢出。”
答案 2 :(得分:1)
这是最快的解决方案:
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);
你只需要一个平方 - 一个最短的距离。
通过某个固定常数进行归一化对于double来说是无意义的。
如果使用整数而不是双精度,则通过某个固定常数对坐标进行归一化和居中可能对某些距离有用而对其他距离则不好。例如,如果你除以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变量相乘而不会溢出。