Добавление отрицательных значений с плавающей точкой приводит к 1.0f только при использовании пользовательского класса Vector - PullRequest
2 голосов
/ 16 октября 2011

Когда я вычисляю скалярное произведение двух векторов a = (-0, -0, -5) и b = (0, 1, 0), используя мой пользовательский класс Vector, он дает мне 1, когда он должен был дать 0.Тем не менее, когда я использую PVector, он работает как ожидалось.Я взглянул на исходный код для PVector, но не заметил ничего, что отличалось бы от того, что я пытался сделать.

Я подозреваю, что это как-то связано с тем, как -0.0f равно +1.0f, и я знаю, что могу просто использовать PVector, но странно, что моя реализация не работает.Кто-нибудь знает, почему он сломан?(Я использую Обработка 1.5.1)

Простой тестовый пример, сравнивающий точечные продукты для PVector и моего Vector:

void setup() {
  Vector a = new Vector(-0, -0, -5);
  Vector b = new Vector(0, 1, 0);
  println(a.dotProduct(b));

  PVector pA = new PVector(-0, -0, -5);
  PVector pB = new PVector(0, 1, 0);
  println(pA.dot(pB));
}

class Vector {
  public float x, y, z, w;

  Vector(float x, float y, float z) {
    this.x = x;
    this.y = y;
    this.z = z;
    this.w = 1;
  }

  void doScale(float scalar) {
    this.x *= scalar;
    this.y *= scalar;
    this.z *= scalar;
  }

  float dotProduct(Vector other) {
    return this.x * other.x + this.y + other.y + this.z * other.z; 
  }

}

Ответы [ 2 ]

3 голосов
/ 16 октября 2011

Это проблема:

float dotProduct(Vector other) {
  return this.x * other.x + this.y + other.y + this.z * other.z; 
}

Вы складываете this.y и other.y вместе, а не умножаете их.Это должно быть:

float dotProduct(Vector other) {
  return this.x * other.x + this.y * other.y + this.z * other.z; 
}

Лично я бы добавил скобки для удобства чтения:

float dotProduct(Vector other) {
  return (this.x * other.x) + (this.y * other.y) + (this.z * other.z);
}
1 голос
/ 16 октября 2011

Опечатка: должно быть this.y * other.y возможно?

...