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

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

Вернуться   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
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)
Старый 17.01.2014, 06:28   #2
ABTOMAT
Ференька
 
Аватар для ABTOMAT
 
Регистрация: 26.01.2007
Адрес: улица Пушкина дом Колотушкина
Сообщений: 10,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: [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,741
Написано 5,461 полезных сообщений
(для 15,675 пользователей)
Ответ: [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(pointpointthis.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(rotVecrotVec);
    var 
point[0] * rotVec[0] - point[1] * rotVec[1];
    
point[1] = point[1] * rotVec[0] + point[0] * rotVec[1];
    
point[0] = t;

    
vec2.div(pointpointvec2.fromValues(this.zoomthis.zoom));

    
point[1] *= -1;

    
vec2.add(pointpointthis.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
Просмотров: 1439
Размер:	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, время: 18:45.


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