Почему это значение возвращает ноль?

1

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

public float getDistance(Ball ball2)
{
    float distance = (float) (Math.sqrt(Math.pow(ball2.x - x, 2) +
                                Math.pow(ball2.y - y, 2)));
    return distance;
}

В другой части кода я неоднократно печатаю значение этого расстояния, и я продолжаю получать нули. Почему это?

EDIT: Я понял это. Я забыл, что координаты позиции сохраняются в векторном объекте, поэтому вместо того, чтобы говорить ball2.x, я должен был указать ball2.position.x. Теперь все правильно вычисляется, и моя программа работает. Спасибо за помощь людям! Я не уверен, что эти вопросы должны быть закрыты или что-то в этом роде, но что бы ни думали моды!

Теги:
game-physics
physics

5 ответов

2
Лучший ответ

Метод прекрасен. Проблема кроется в другом месте.

Это может быть так: ball2.x == this.x и ball2.y == this.y Это может быть связано с ball2 что ball2 и this и тот же объект, или потому, что вы забываете инициализировать x и y или по ряду других возможных причин.

Другая возможность заключается в том, что значение, которое вы печатаете, не является результатом вызова distance(), а является чем-то другим (например, из-за ошибки в коде).

  • 0
    Нет, я облажался. Я забыл, что координаты шаров хранятся в векторном объекте, поэтому вместо того, чтобы сказать ball2.x, я должен был сказать ball2.position.x, а не просто x, я должен был сказать this.position.x. Извините за путаницу!
0

Если ваши ball2.x и x являются целыми числами, тогда, когда они находятся в пределах 1 единицы друг от друга, x - x может округлить до 0, потому что вы все еще выполняете математику целых чисел. Вы должны бросить их как плавающие, прежде чем вычесть их. затем выполните математику.

Это одинаково для ball2.y и y.

  • 0
    Извините, но первое предложение не имеет смысла. Нет абсолютно никакого способа, которым оператор вычитания может округлить результат.
  • 0
    тьфу, ты прав. Я думал о разделении. неважно.
0

Как уже отмечали некоторые люди, в коде нет ничего плохого. Я скопировал и вставил его в демо-класс и получил 0.223

public class Demo {
    public static void main(String[] args) {
        Demo d = new Demo();
        Ball b1 = d.new Ball(0.1f, 0.5f);
        Ball b2 = d.new Ball(0.2f, 0.7f);
        System.out.println(b1.getDistance(b2));
    }

    class Ball{
        float x,y;

        public Ball(float x, float y) {
            this.x = x;
            this.y = y;
        }

        public float getDistance(Ball ball2)
        {
            float distance = (float) (Math.sqrt(Math.pow(ball2.x - x, 2) +
                                        Math.pow(ball2.y - y, 2)));
            return distance;
        }
    }
}
0

Разве вы не хотите сравнивать расстояние до второго шара?

  public float getDistance(Ball ball2, Ball ball1)
{
    float distance = (float) (Math.sqrt(Math.pow(ball2.x - ball1.x, 2) +
               Math.pow(ball2.y - ball1.y, 2)));
    return distance;

}

Вы в настоящее время вычитаете x из x, возвращая 0.

  • 1
    Я предполагаю, что getDistance является методом шара, поэтому ему не нужно пропускать второй мяч.
  • 0
    Хорошо, тогда x и y не определены правильно.
0

Поскольку ball2.x = x и ball2.y = y

Ещё вопросы

Сообщество Overcoder
Наверх
Меню