Eu estava pensando em plataformas e inimigos se movendo em círculos nos antigos jogos 2D, e fiquei imaginando como isso foi feito. Entendo equações paramétricas, e é trivial usar sin e cos para fazer isso, mas um NES ou SNES poderia fazer chamadas em tempo real? Eu admito muita ignorância, mas achei que eram operações caras. Existe alguma maneira inteligente de calcular esse movimento mais barato?
Eu tenho trabalhado em derivar um algoritmo de identidades de soma trigonométrica que usariam somente trig pré-calculado, mas isso parece complicado.
Respostas:
Em hardware como o que você está descrevendo, uma solução comum para o caso geral é simplesmente produzir uma tabela de consulta para as funções trigonométricas em que estava interessado, às vezes em conjunto com representações de ponto fixo para valores.
O possível problema com essa técnica é que ela consome espaço na memória, embora você possa minimizá-la, definindo uma resolução mais baixa dos dados em sua tabela ou aproveitando a natureza periódica de algumas funções para armazenar menos dados e espelhá-los em tempo de execução.
No entanto, para atravessar círculos especificamente - seja para rasterizá-los ou para mover algo ao longo de um, uma variação do algoritmo de linha de Bresenham pode ser empregada . O algoritmo real de Bresenham , é claro, também é útil para atravessar linhas que não estão nas oito direções "primárias" com um preço bastante baixo.
fonte
Há uma variação de algoritmo Bresenham por James Frith , que deve ser ainda mais rápido, pois elimina completamente a multiplicação. Não é necessária nenhuma tabela de pesquisa para conseguir isso, embora seja possível armazenar os resultados em uma tabela se o raio permanecer constante. Como o algoritmo de Bresenham e Frith usa simetria 8 vezes, essa tabela de pesquisa seria relativamente curta.
fonte
xoff++ + xoff
e--yoff + yoff
. Sua lista de alterações corrigirá isso, considere consertá-la no lugar, e não como uma tacha na nota. (Ver a secção 5 parágrafo 4 do padrão C ++ para os exemplos e a standardese que chama isto explicitamente)balance += xoff++ + xoff
ebalance -= --yoff + yoff
. Deixei isso inalterado, pois era assim que o algoritmo de Frith era originalmente escrito, com a correção posteriormente adicionada por ele (veja aqui ). Corrigido agora.Você também pode usar uma versão aproximada das funções trigonométricas usando o Taylor Expansions http://en.wikipedia.org/wiki/Taylor_series
Por exemplo, você pode ter uma aproximação razoável do seno usando seus primeiros quatro termos da série taylor
fonte
Um algoritmo impressionante para viajar uniformemente sobre um círculo é o algoritmo de Goertzel . Requer apenas 2 multiplicações e 2 adições por etapa, nenhuma tabela de pesquisa e um estado muito mínimo (4 números).
Primeiro, defina algumas constantes, possivelmente codificadas, com base no tamanho da etapa necessária (neste caso, 2π / 64):
O algoritmo usa 4 números como seu estado, inicializado assim:
E finalmente o loop principal:
Pode então ir para sempre. Aqui estão os primeiros 50 pontos:
Obviamente, o algoritmo pode funcionar em hardware de ponto fixo. A vitória clara contra o Bresenham é a velocidade constante sobre o círculo.
fonte