Двумерный Вектор (
Vec2), на
JavaScript.
Весьма "грубое" решение расширить Float32Array,
т.к. IE9 не держит их, лечиться правда очень просто - условием что если Float32Array нету, присваиваем к нему Array, и всё работает даже на древних платформах.
Исходники:
https://gist.github.com/Maksims/8464888
Список поддерживаемых методов:
new, delete, clone
equal, equalS, equalXY,
set, setS, setR, setXY,
add, addS, addXY,
lerp, lerpS, lerpXY,
sub, subS, subXY,
mul, mulS, mulXY,
div, divS, divXY,
len,
dist, distXY,
dot, dotXY,
norm,
radians,
rot, rotR, rotXY,
sat,
floor, round, ceil
Метод без приставки обычно принимает другой вектор.
Приставка S - метод принимает один аргумент - число.
Приставка R - принимает один аргумент - угол в radians.
Приставка XY - принимает два аргумента, x и y.
Вот пример реализации 2д камеры pick (координаты экрана курсора преобразуем в координаты мира), с учётом - позиции, поворота и приближения камеры:
Camera.prototype.pick = function(viewport, v) {
return v.clone() // копируем точку клика
.sub(viewport.middle) // централизуем на центр области обзора
.rotS(-this.rotation.radians()) // поворачиваем
.divS(this.zoom) // приближаем
.mulXY(1, -1) // реверсия Y координаты
.add(this.position) // сдвигаем
};
// ...
var pointInWorld = camera.pick(Vec2.new(mouseX, mouseY));
Бенчмарк с glMatrix (больше - лучше), как видим с кешем мы в 11 раз шустрее, без кеша почти вдвое.