Eu estou procurando um algoritmo simples para plotar pontos uniformemente distribuídos em uma elipse, dados os eixos maiores e menores. Isso é realmente fácil de fazer com um círculo como este:
var numberOfPoints = 8;
var angleIncrement = 360 / numberOfPoints;
var circleRadius = 100;
for (var i = 0; i < numberOfPoints; i++) {
var p = new Point();
p.x = (circleRadius * Math.cos((angleIncrement * i) * (Math.PI / 180)));
p.y = (circleRadius * Math.sin((angleIncrement * i) * (Math.PI / 180)));
}
(que cria pontos à mesma distância dos pontos vizinhos), mas não consigo encontrar ou descobrir uma maneira de fazer isso em uma elipse. (As soluções no AS3 são preferidas, mas não necessárias.)
mathematics
actionscript-3
Justin C. Rounds
fonte
fonte
Respostas:
Re-parametrize-o pelo comprimento do arco e faça a amostra uniformemente. Se você precisar de ajuda para fazer as contas, eu pediria aqui:
https://math.stackexchange.com/
também foi solicitado aqui: /mathpro/28070/finding-n-points-that-are-equidistant-around-the-circumference-of-an-ellipse
fonte
Aproximação razoável
Como já foi dito em outras respostas, não há maneira exata de fazer isso. No entanto, é possível aproximar eficientemente uma solução.
Minha fórmula manipulará apenas o quadrante superior direito . Várias alterações de sinal precisarão ser aplicadas para lidar com outros quadrantes.
Seja d a distância desejada do arco entre pontos consecutivos. Suponha que o último ponto plotado esteja em (x, y) .
Em seguida, o próximo ponto deve ser plotado nas seguintes coordenadas:
Prova
Seja o próximo ponto em (x + Δx, y + Δy) . Ambos os pontos satisfazem a equação da elipse:
Livrar-se de y nas equações fornece:
Assumimos que Δx é pequeno o suficiente, então substituímos f (x + Δx) -f (x) por f '(x) Δx usando a aproximação linear para f' :
Se d é pequeno o suficiente, então Δx e Δy são pequenos o suficiente e o comprimento do arco está próximo da distância euclidiana entre os pontos. A seguinte aproximação é, portanto, válida:
Substituimos Δy acima e resolvemos para Δx :
E se d não for pequeno o suficiente?
Se d for muito grande para as aproximações anteriores para ser válida, simplesmente substituir d com d / N , por exemplo, N = 3 , e só traçar um ponto de N .
Nota final
Este método tem problemas em extremos ( x = 0 ou y = 0 ), que podem ser tratados usando aproximações adicionais ( ou seja, pular o último ponto do quadrante, seja ele realmente plotado ou não).
O manuseio de toda a elipse provavelmente será mais robusto refazendo tudo usando coordenadas polares. No entanto, é um pouco de trabalho, e essa é uma pergunta antiga, então só o farei se houver algum interesse no pôster original :-)
fonte
Eu meio que depende exatamente o que você quer dizer com "uniformemente". Eu escrevi um post sobre o uso de elipses no meu jogo aqui: http://world-create.blogspot.com/2009/01/ellipse-maths.html
Da postagem:
Você pode obter pontos espaçados uniformemente ao redor da elipse por ângulo , fazendo:
Mas, dependendo das especificidades da sua elipse, esses valores podem ser agrupados (se houver um final "pontudo" na elipse).
fonte
A resposta, com código Java completo, está localizada no StackOverflow aqui
Respondida por:
editou Dec 11 '13 às 4:14 John Paul
respondeu Dec 11 '13 às 3:48 Dave
fonte