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 оставляет это для вас.