Eu quero mover uma partícula em espiral a uma velocidade constante. Observe que essa não é uma velocidade angular constante. Isso está se mostrando um pouco difícil, e vou seguir meu método até agora.
A espiral em questão é uma espiral arquimediana clássica com a equação polar r = ϑ
e as equações paramétricas x = t*cos(t), y = t*sin(t)
. É assim:
Eu quero mover uma partícula ao redor da espiral, de forma tão ingênua, que eu possa apenas dar a posição da partícula como o valor de t, e a velocidade como o aumento em t. Dessa forma, a partícula se move em volta da espiral a uma velocidade angular constante. No entanto, isso significa que, quanto mais distante fica do centro, mais rápida se torna sua velocidade (não angular).
Então, em vez de ter minha velocidade no aumento em t, quero minha velocidade como o aumento no comprimento do arco. Conseguir o comprimento do arco de uma espiral é o primeiro desafio, mas devido ao fato de que a espiral arquimediana que estou usando não é muito insana, a função de comprimento do arco é onde a = 1
. Isso me permite converter valores teta no comprimento do arco, mas esse é exatamente o oposto do que eu preciso. Então, preciso encontrar a inversa da função de comprimento do arco e, nesse obstáculo, o Wolfram-Alpha falhou comigo.
Então, é possível encontrar o inverso da função de comprimento do arco? A função é um mapeamento individual, se você excluir valores negativos de teta.
Obrigado,
Laurie
fonte
Respostas:
Vamos complicar sua espiral:
estar
no seu caso f (t): = t, no meu f (t): = 1 (então eu pago minhas complicações com simplificações :)
Se você deseja ir a uma certa velocidade nesta espiral degenerada (um círculo), você precisa saber quanto tempo dura sua espiral em uma rodada, para poder dizer quantas rodadas por segundo fazem para ter certeza de que seu ponto viaja com a velocidade desejada .
Agora sabemos que cada rodada completa em um círculo tem 2 · π · r long: 2 · π · 1 no nosso caso; se ω é a velocidade de rotação (em rodadas por segundo), a velocidade V será V = 2 · π · 1 · ω ou de uma maneira mais geral:
se r é o raio geral; isso nos diz que:
se r é uma função de t, podemos dizer:
no meu caso "complicado", isso pode ser reescrito da seguinte maneira:
no seu caso "simplificado", a resposta é:
Você sabe que sua velocidade constante desidered V, você sabe: 2, π e t é a variável: você sabe tudo e você está pronto para ir!
a aproximação do círculo para a vizinhança infinitesimal da espiral em t
[AVISO LEGAL]
Não se pretende que este seja um tratamento matemático rigoroso: não leva em consideração a contribuição do diferencial de f nem diz que tipos de função não podem ser utilizados.
fonte
Se você não se importa com uma suposição que é bastante precisa rapidamente, esta solução simples funciona muito bem:
Isso é paramétrico no tempo, o que é bastante útil. No entanto, para conseguir isso, eu precisava assumir que o movimento é aproximadamente circular - ie. a velocidade linear instantânea é proporcional ao raio vezes a velocidade angular:
Para mostrar que a solução funciona, conecte-o a
d{theta} / d{time}
:Em
{time}=1
, isso coloca um ponto à distânciasqrt(2)
da origem. Depois disso, a aproximação melhora significativamente: a separação (linear, não ao longo do caminho) entre os pontos subsequentes é 1,13, 1,08, 1,06. Após 100 pontos, a separação é menor que 1,0023.fonte
Enquanto procurava uma solução para calcular o ângulo que corresponde a um determinado comprimento de arco, deparei-me com esta pergunta e a resposta atual. Infelizmente, nem essa resposta nem qualquer outro recurso que eu encontrei na Web podem ser usados diretamente para uma implementação.
Obviamente, calcular a inversa da função de comprimento do arco (que também foi fornecida na pergunta) é muito difícil. Mas uma aproximação deste inverso usando o Método Iterativo de Newton é possível. A seguir, é uma classe que oferece principalmente dois métodos:
computeArcLength(double alpha, double angleRad)
: Calcula o comprimento do arco de um ponto na Espiral Arquimediana, ondealpha
está a distância entre rotações sucessivas eangleRad
é o ângulo em radianoscomputeAngle(double alpha, double arcLength, double epsilon)
: Calcula o ângulo no qual o ponto para o comprimento de arco especificado está localizado na Espiral Arquimediana, ondealpha
está a distância entre as rotações sucessivas eepsilon
é o limiar de aproximação para a Iteração de NewtonO código é implementado aqui em Java, mas esses métodos principais devem ser bastante independentes da linguagem:
Um exemplo de como usar isso para o objetivo descrito na pergunta é dado neste trecho: ele gera um certo número de pontos na espiral, com uma distância desejada (comprimento do arco!) Entre os pontos:
A distância real do comprimento do arco dos pontos computados é impressa e pode-se ver que eles são de fato equidistantes, com a distância desejada do comprimento do arco.
fonte
Também estou lutando com isso.
O que estou fazendo é manter a velocidade constante e mudar a direção do objeto.
Se eu fizer assim o ângulo (em graus) é igual à distância da origem, vezes uma constante, recebo uma espiral arquimediana perfeita e agradável. constantes maiores obtêm menos espaço entre as linhas. O único problema é que, se a velocidade for muito alta, ela pula a pista e atrapalha. espirais mais apertadas requerem uma velocidade mais lenta para serem rastreadas com segurança.
direction = ((spiral_factor*(current_distance) mod 360);
Onde current_distance é o raio traçado do local para o ponto de desova em pixels, agarrado por uma função de mecanismo que me fornece isso.
O que está me levando até a parede é o inverso. colocando o objeto no lado de fora e traçando a espiral arquimediana para dentro. Mover a partícula para o lado oposto não funciona. que apenas gira a espiral em 180 graus. inverter a direção dá uma no sentido horário.
fonte