Сначала вы можете использовать функцию гипотенуза .
Тогда на расстоянии может произойти целочисленное переполнение (-
).
решение состоит в том, чтобы использовать double, так как конечный результат вычисляется с использованием функции с плавающей запятой.
Результат может быть таким же большим, как sqrt(2)*2*Integer.MAX_VALUE
, также переполненным.
Итак:
public int distanceTo(Point that) {
double distanceX = ((double)this.x) - that.x;
double distanceY = ((double)this.y) - that.y;
double distance = Math.hypot(distanceX, distanceY);
if (distance + 1 >= Integer.MAX_VALUE) {
throw new ArithmeticException("Integer overflow");
}
return (int) distance; // (int) Math.round?
}
Или аккуратнее (как и Андреас):
public int distanceTo(Point that) {
double distanceX = ((double)this.x) - that.x;
double distanceY = ((double)this.y) - that.y;
double distance = Math.hypot(distanceX, distanceY);
return Math.toIntExact((long)distance); // (int) Math.round?
}