Intento averiguar si una línea interseca una elipse.
Al principio intenté hacerlo sin encontrar los puntos de intersección, pero no funcionó bien. Así que ahora estoy tratando de encontrar los dos puntos de intersección y luego comprobar si están en el segmento de línea.
Primero intenté implementar un algoritmo para encontrar una línea, perpendicular al segmento de línea, desde el centro de la elipse hasta el segmento de línea. Si cualquiera de los dos puntos finales estaba en la elipse o el punto de intersección estaba tanto en el segmento de línea como en la elipse, entonces se intersectaban. Sin embargo, en algunas situaciones, esto fallaba alrededor del perímetro de la elipse.
Así que a continuación traté de implementar un algoritmo discutido en: Coordenadas de los puntos de intersección entre una elipse y una línea de cuerda
He utilizado la respuesta de Hamed. Sin embargo, parece que no me funciona. Esperaba que alguien pudiera decirme qué estoy haciendo mal. El $x$ Los valores salen mucho más altos de lo que deberían, y a menudo determina que no hay raíces reales cuando sí las hay. No veo la diferencia entre mi implementación y la solución. Tengo curiosidad por saber si lo he implementado mal, si la ecuación está mal o si hay algo más que se me escapa.
Gracias de antemano, agradezco cualquier ayuda que pueda recibir ya que me he encontrado con un bloqueo en este punto.
Editar : $a$ y $b$ son de tamaño arbitrario, $a$ puede ser mayor que $b$ y viceversa. la elipse está en el origen $(0,0)$ y la línea es un segmento de línea que se define por los puntos finales. también te darás cuenta de que he multiplicado las cosas por sí mismas en lugar de utilizar la función incorporada para elevar algo al cuadrado, ya que he leído que es caro en términos de potencia de cálculo.
Editar Aquí hay un ejemplo
public function lineTest( test_ellipse:Geometry_Ellipse, test_line:Geometry_Line ):Object {
// get the variables that define the line and ellipse
var m:Number = test_line.getSlope();
var c:Number = test_line.getY_Intercept();
var a:Number = test_ellipse.getRadius_X();
var b:Number = test_ellipse.getRadius_Y();
// check for division by 0 and sqrt of negative values
if( (b*b)+(m*a)*(m*a)-(c*c) >= 0 && (b*b)+(m*a)*(m*a) != 0 ) {
// get intersection points
var point_1:Geometry_Coordinate = new Geometry_Coordinate(
( (m*c*a)*(m*c*a) + (a*b)*Math.sqrt((b*b)+(m*a)*(m*a)-(c*c)) ) / ( (b*b)+(m*a)*(m*a) ),
( (c*b)*(c*b) - ((m*a)*b)*Math.sqrt((b*b)+(m*a)*(m*a)-(c*c)) ) / ( (b*b)+(m*a)*(m*a) ),
0
);
var point_2:Geometry_Coordinate = new Geometry_Coordinate(
( (m*c*a)*(m*c*a) - (a*b)*Math.sqrt((b*b)+(m*a)*(m*a)-(c*c)) ) / ( (b*b)+(m*a)*(m*a) ),
( (c*b)*(c*b) + ((m*a)*b)*Math.sqrt((b*b)+(m*a)*(m*a)-(c*c)) ) / ( (b*b)+(m*a)*(m*a) ),
0
);
// check if points are on line segment
// ...
return { "result":true, "points":new Array(point_1, point_2) };
} else {
trace("no real values");
}
return { "result":false, "points":new Array() };
}
0 votos
"para encontrar el punto perpendicular a ..". ¿Qué quiere decir con punto ¿que sea perpendicular a otra cosa?
1 votos
Esa solución no funcionó, así que no es tan importante... pero lo que quiero decir es que hay que dibujar una línea desde el centro de la elipse hasta la línea que se está probando, siendo la línea del centro perpendicular a la línea dada. Esto funcionó bien para todo, excepto para algunas situaciones en las que la línea apenas entra en contacto con el perímetro de la elipse.