XNA - Почему он использует Vector2, а не Point?

Я использую графику WinForms, но я занимаюсь XNA, и одна вещь, которую я заметил, это то, что объект Point не очень полезен и, похоже, не очень-то используется, Для позиционирования различные методы SpriteBatch Draw используют либо Rectangle, либо Vector2. И Vector2 имеет множество полезных статических и экземплярных методов, тогда как Point имеет в основном ничего, кроме свойств X и Y.

Почему XNA использует Vector2 для представления позиции вместо Point? Я понимаю, что они оба имеют X и Y, но семантически и логически, использование Vector2 вместо Point для представления местоположения не имеет для меня никакого смысла. (Например, если вы нормализуете Vector2, у вас будет другое место!)

Как это странно, или я чего-то не хватает?

Ответ 1

Даже если Point используют значения float, какое значение вы бы дали "добавлению 2 точек вместе"? Теперь добавление векторов для обновления позиций - это хорошо понятая и широко используемая концепция, поэтому векторы лучше описывают позиции и скорости в виртуальном мире.

Ответ 2

Думал, что у меня будет небольшая магия расширения, так как я люблю расширения. Я создал метод расширения Point для простого преобразования в Vector2 для типа SpriteBatch.Draw()

public static class PointExt
{
    public static Vector2 ToVector2(this Point point)
    {
        return new Vector2(point.X, point.Y);
    }
}

то просто вызовите его с помощью myPoint.ToVector2().

Не самое содержательное использование расширения, но это облегчает мою жизнь.

Ответ 3

Семантически мало различий между вектором и точкой; они оба представляют смещение от начала координат в некоторой декартовой системе координат. Преимущество векторов заключается в том, что они имеют больше структуры (масштабирование, добавление и т.д.), Чем точки.

Например, вы можете найти смещение одного объекта от другого: это просто векторная разница между их соответствующими векторами положения. Они также более универсальны в представлении других величин, таких как скорость. Например, вы можете вычислить положение объекта с позицией r и скоростью v после временного интервала t; используя векторы, это можно было бы вычислить просто через r + t * v.

Пример нормализации может быть полезен, если вы хотите, чтобы направление было отправлено из источника (или некоторой другой точки).

Ответ 4

Основная причина... Vector2 использует float и поля вместо свойств. Это делает его более точным и более эффективным, чем Point, который использует целые числа и свойства.

Ответ 5

На определенном уровне вам просто нужен кортеж чисел. Вы можете применить некоторые абстракции и структуру над этими кортежами. Однако, как высокопроизводительная математическая библиотека, XNAMath оставляет это для вас.