Показать сообщение отдельно
Старый 17.01.2014, 04:05   #1
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
[js] Vec2 (двумерный вектор)

Двумерный Вектор (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 раз шустрее, без кеша почти вдвое.

Последний раз редактировалось moka, 18.01.2014 в 21:43.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Harter (18.01.2014), Mr_F_ (18.01.2014)