Показать сообщение отдельно
Старый 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
equalequalSequalXY,
setsetSsetRsetXY,
addaddSaddXY,
lerplerpSlerpXY,
subsubSsubXY,
mulmulSmulXY,
divdivSdivXY,
len,
distdistXY,
dotdotXY,
norm,
radians,
rotrotRrotXY,
sat,
floorroundceil 
Метод без приставки обычно принимает другой вектор.
Приставка S - метод принимает один аргумент - число.
Приставка R - принимает один аргумент - угол в radians.
Приставка XY - принимает два аргумента, x и y.

Вот пример реализации 2д камеры pick (координаты экрана курсора преобразуем в координаты мира), с учётом - позиции, поворота и приближения камеры:
Camera.prototype.pick = function(viewportv) {
    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(mouseXmouseY)); 
Бенчмарк с glMatrix (больше - лучше), как видим с кешем мы в 11 раз шустрее, без кеша почти вдвое.

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