Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Математика

Математика Методы математического моделлирования, программирование математических концепций, роль математики в создании игр

Ответ
 
Опции темы
Старый 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)
Старый 17.01.2014, 06:28   #2
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,743
Написано 5,461 полезных сообщений
(для 15,676 пользователей)
Ответ: [js] Vec2 (двумерный вектор)

Изобрёл велосипед, не поискав готовых решений.

http://glmatrix.net/docs/2.2.0/

mat2
mat2d
mat3
mat4
quat
vec2
vec3
vec4

Уже давно есть и работает везде.
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

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

Я давно вкурсе про glMatrix ещё до имплементации данной библиотеки.
Но если ты работал с glMatrix, то ты отметишь для себя что данная библиотека не поддерживает chaining, а имеено то что я указал в примере, т.к. классы (по факту объекты) - лишь имеют функции а не методы над данными (не прототип над массивом).

Следственно твой аргумент не уместен по причине отличия решений, и по факту невозможность chain'ить мат. выражения - является первопричиной разработки своей библиотеки.
Также не имеет никакого "прозрачного" кеша для тебя, что прийдётся расширять библиотеку и переписывать методы копирования, инициализации и т.п.

Моё решение решает только одну задачу: vec2, то что мне требуется.
Да и моя библиотека рвёт glMatrix по производительности в клочья.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
Harter (18.01.2014), Mr_F_ (18.01.2014)
Старый 18.01.2014, 11:37   #4
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,743
Написано 5,461 полезных сообщений
(для 15,676 пользователей)
Ответ: [js] Vec2 (двумерный вектор)

Сообщение от moka Посмотреть сообщение
Да и моя библиотека рвёт glMatrix по производительности в клочья.
Проводились тесты?
__________________
Мои проекты:
Анальное Рабство
Зелёный Слоник
Дмитрий Маслов*
Различие**
Клюква**

* — в стадии разработки
** — в стадии проектирования
Для проектов в стадии проектирования приведены кодовые имена

(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mr_F_ (18.01.2014)
Старый 18.01.2014, 21:39   #5
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: [js] Vec2 (двумерный вектор)

Коментарии излишни...
(больше - лучше)
http://jsperf.com/glmatrix-vec2-vs-vec2


Даже без кеша, выийгрывает почти вдвое, с кешем, выйгрывает в 11+ раз.
Я уже не говорю о разнице того как код выглядит...

glMatrix:
Camera_g.prototype.pick = function(point) {
    
point = vec2.clone(point);
    
vec2.sub(point, point, this.middle);
    
    
// there is no rotate vector methods in glMatrix vec2,
    // alternative would be to use matrix for such operation,
    // but that would be overkill, and would reduce performance even more
    
var rotVec = vec2.clone(this.rotation);
    
vec2.normalize(rotVec, rotVec);
    var 
t = point[0] * rotVec[0] - point[1] * rotVec[1];
    
point[1] = point[1] * rotVec[0] + point[0] * rotVec[1];
    
point[0] = t;

    
vec2.div(point, point, vec2.fromValues(this.zoom, this.zoom));

    
point[1] *= -1;

    
vec2.add(point, point, this.position);

    return 
point;
}; 
Моё решение:
Camera.prototype.pick = function(point) {
    return 
point.clone()
        .
sub(this.middle)
        .
rot(this.rotation)
        .
divS(this.zoom)
        .
mulXY(1, -1)
        .
add(this.position)
}; 
Далее, я использую уже библиотеку не в первом проекте, следственно она доказала свою стабильность и удобство на самом деле реально выше в разы.

Честно сказать это было и до тестов очевидно, если ты заглядывал в то как glMatrix работает и в моё решение, а не задавал бы подобных вопросов.

И ещё факт того что я написал данную либу - позволило мне изучить как на самом деле работает математика каждой функции при работе с 2D векторами, и я считаю это огромный бенефит.
Миниатюры
Нажмите на изображение для увеличения
Название: bench.png
Просмотров: 1875
Размер:	12.1 Кб
ID:	20022  

Последний раз редактировалось moka, 18.01.2014 в 23:56.
(Offline)
 
Ответить с цитированием
Эти 5 пользователя(ей) сказали Спасибо moka за это полезное сообщение:
den (21.01.2014), Harter (18.01.2014), Mr_F_ (18.01.2014), pax (21.01.2014), Жека (28.01.2014)
Старый 28.02.2014, 21:17   #6
johnk
Легенда
 
Регистрация: 01.10.2006
Сообщений: 3,705
Написано 296 полезных сообщений
(для 568 пользователей)
Ответ: [js] Vec2 (двумерный вектор)

что понимается под кэшированием вектора?
(Offline)
 
Ответить с цитированием
Старый 28.02.2014, 23:15   #7
SBJoker
Злобный Админ
 
Аватар для SBJoker
 
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений
(для 9,330 пользователей)
Ответ: [js] Vec2 (двумерный вектор)

не хватает сравнения с кешироваными матрицами.
__________________
(Offline)
 
Ответить с цитированием
Старый 28.02.2014, 23:44   #8
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: [js] Vec2 (двумерный вектор)

Сообщение от johnk Посмотреть сообщение
что понимается под кэшированием вектора?
В JS есть свой сборщик мусора, но стоимость создания Float32Array - обычно более 50% всей стоимости работы с векторами. Следственно заместо отдачи вектора на сборку мусорщиком, мы храним уже не использованный вектор в отдельном массиве (cache), и когда создаём новый вектор, проверяем если в кеше есть не используемый вектор, если есть, переиспользуем.
Тем самым мы экономим огромное количество производительности.

SBJoker, угу, там разница была бы ещё в разы круче. Но данная библиотека имплиментирует только 2ух мерный вектор, и матриц в ней нету.
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 11:20.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com