Estoy buscando un algoritmo simple para trazar puntos distribuidos uniformemente en una elipse, dados los ejes mayor y menor. Esto es realmente fácil de hacer con un círculo así:
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 crea puntos que están a la misma distancia de sus puntos vecinos) pero no puedo encontrar o encontrar una manera de hacer esto en una elipse. (Se prefieren soluciones en AS3, pero no se requieren).
mathematics
actionscript-3
Justin C. Rounds
fuente
fuente
Respuestas:
Vuelva a parametrizarlo por la longitud del arco y muestree uniformemente. Si necesita ayuda para hacer los cálculos, lo pediría aquí:
https://math.stackexchange.com/
también se preguntó aquí: /mathpro/28070/finding-n-points-that-are-equidistant-around-the-circumference-of-an-ellipse
fuente
Aproximación razonable
Como ya se indicó en otras respuestas, no hay una forma exacta de hacer esto. Sin embargo, es posible aproximar eficientemente una solución.
Mi fórmula solo manejará el cuadrante superior derecho . Se deberán aplicar varios cambios de signos para manejar otros cuadrantes.
Deje d ser su distancia de arco deseada entre puntos consecutivos. Supongamos que el último punto trazado está en (x, y) .
Luego, el siguiente punto debe trazarse en las siguientes coordenadas:
Prueba
Deje que el siguiente punto esté en (x + Δx, y + Δy) . Ambos puntos satisfacen la ecuación de elipse:
Deshacerse de y en las ecuaciones da:
Suponemos que Δx es lo suficientemente pequeño, por lo que reemplazamos f (x + Δx) -f (x) con f '(x) Δx usando la aproximación lineal para f' :
Si d es lo suficientemente pequeño, entonces Δx y Δy son lo suficientemente pequeños y la longitud del arco está cerca de la distancia euclidiana entre los puntos. Por lo tanto, la siguiente aproximación es válida:
Reemplazamos Δy en lo anterior y resolvemos para Δx :
¿Qué pasa si d no es lo suficientemente pequeño?
Si d es demasiado grande para las aproximaciones anteriores sean válidas, simplemente reemplazar d con d / N , por ejemplo N = 3 , y sólo trazar un punto de N .
Nota final
Este método tiene problemas en los extremos ( x = 0 o y = 0 ), que pueden abordarse utilizando aproximaciones adicionales ( es decir, omitir el último punto del cuadrante, ya sea que esté trazado o no).
El manejo de toda la elipse probablemente será más robusto al rehacer todo usando coordenadas polares. Sin embargo, es algo de trabajo, y esta es una vieja pregunta, así que solo lo haré si hay algún interés en el póster original :-)
fuente
Depende un poco de lo que quieres decir con "uniformemente". Escribí una publicación sobre el uso de puntos suspensivos en mi juego aquí: http://world-create.blogspot.com/2009/01/ellipse-maths.html
De la publicación:
Puede obtener puntos espaciados uniformemente alrededor de la elipse por ángulo haciendo:
Pero dependiendo de los detalles de su elipse, estos valores podrían agruparse (si hay un final "puntiagudo" para la elipse).
fuente
La respuesta, con el código Java completo, se encuentra en StackOverflow aquí.
Respondido por:
editado el 11 de diciembre de 2013 a las 4:14 John Paul
respondió Dec 11 '13 a las 3:48 Dave
fuente