Физика снукерной игры

Я могу только надеяться, что ребята Mathworks не подадут в суд на вас или меня или Stackoverflow в этом отношении, пытаясь создать векторизованные реализации своих функций IP-панели инструментов, поскольку они поставили цену на этот инструментарий. Но в любом случае, забывая о тех проблемах, вот реализации.

Замена для im2col с опцией 'sliding'

Мне не удалось векторизовать это, пока я не сел написать решение другой задачи на Stackoverflow . Итак, я бы настоятельно рекомендовал заглянуть в нее.

function out = im2col_sliding(A,blocksize)

nrows = blocksize(1);
ncols = blocksize(2);

%// Get sizes for later usages
[m,n] = size(A);

%// Start indices for each block
start_ind = reshape(bsxfun(@plus,[1:m-nrows+1]',[0:n-ncols]*m),[],1); %//'

%// Row indices
lin_row = permute(bsxfun(@plus,start_ind,[0:nrows-1])',[1 3 2]);  %//'

%// Get linear indices based on row and col indices and get desired output
out = A(reshape(bsxfun(@plus,lin_row,[0:ncols-1]*m),nrows*ncols,[]));

return;

Замена для im2col с опцией 'distinct'

function out = im2col_distinct(A,blocksize)

nrows = blocksize(1);
ncols = blocksize(2);
nele = nrows*ncols;

row_ext = mod(size(A,1),nrows);
col_ext = mod(size(A,2),ncols);

padrowlen = (row_ext~=0)*(nrows - row_ext);
padcollen = (col_ext~=0)*(ncols - col_ext);

A1 = zeros(size(A,1)+padrowlen,size(A,2)+padcollen);
A1(1:size(A,1),1:size(A,2)) = A;

t1 = reshape(A1,nrows,size(A1,1)/nrows,[]);
t2 = reshape(permute(t1,[1 3 2]),size(t1,1)*size(t1,3),[]);
t3 =  permute(reshape(t2,nele,size(t2,1)/nele,[]),[1 3 2]);
out = reshape(t3,nele,[]);

return;

Некоторые быстрые тесты показывают, что обе эти реализации, особенно sliding, для входных данных с малым и приличным размером и distinct для всех данных, работают намного лучше, чем встроенные реализации функций MATLAB с точки зрения производительности во время выполнения.

Как использовать

With in-built MATLAB function - 
B = im2col(A,[nrows ncols],'sliding')

With our custom function - 
B = im2col_sliding(A,[nrows ncols])

%// ------------------------------------

With in-built MATLAB function - 
B = im2col(A,[nrows ncols],'distinct')

With our custom function - 
B = im2col_distinct(A,[nrows ncols])

6
задан vaxquis 29 October 2014 в 17:34
поделиться

2 ответа

Существует книга онлайн об этом,

"Любительская физика для игрока в пул-любителя" Ron Shepard (ссылка PDF)

Я не считал его, но я услышал, что это хорошо для разработчиков игр.

9
ответ дан 10 December 2019 в 00:46
поделиться

Carom3D является большим, они, кажется, освоили физику. См. эти ссылки для большего количества информации:

http://www.jimloy.com/billiard/phys.htm http://archive.ncsa.uiuc.edu/Classes/MATH198/townsend/math.html http://www2.swgc.mun.ca/physics/physlets/billiards.html http://www.regispetit.com/bil_praa.htm

Удачи!

1
ответ дан 10 December 2019 в 00:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: