2008-09-24 9 views
5

Estoy trabajando en un problema de geometría que requiere encontrar la intersección de dos arcos parabólicos en cualquier rotación. Pude intersectar una línea y un arco parabólico girando el plano para alinear el arco con un eje, pero dos parábolas no pueden alinearse con un eje. Estoy trabajando para obtener las fórmulas, pero me gustaría saber si hay un recurso disponible para esto.Código o fórmula para la intersección de dos parábolas en cualquier rotación

Respuesta

6

Me defino primero la ecuación para el arco parabólico en 2D sin rotaciones:

x(t) = ax² + bx + c 
    y(t) = t; 

Ahora puede aplicar la rotación mediante la construcción de una matriz de rotación:

s = sin(angle) 
    c = cos(angle) 

    matrix = | c -s | 
      | s c | 

Aplicar esa matriz y obtendrá la ecuación paramétrica girada:

x' (t) = x(t) * c - s*t; 
y' (t) = x(t) * s + c*t; 

Esto le dará dos ecuaciones (para xey) de sus arcos parabólicos.

Haga eso para sus dos arcos girados y restelos. Esto le da una ecuación como esta:

xa'(t) = rotated equation of arc1 in x 
    ya'(t) = rotated equation of arc1 in y. 
    xb'(t) = rotated equation of arc2 in x 
    yb'(t) = rotated equation of arc2 in y. 
    t1 = parametric value of arc1 
    t2 = parametric value of arc2 

    0 = xa'(t1) - xb'(t2) 
    0 = ya'(t1) - yb'(t2) 

Cada una de estas ecuaciones es solo un polinomio de orden 2. Estos son fáciles de resolver.

Para encontrar los puntos de intersección, resuelva la ecuación anterior (por ejemplo, encuentre las raíces).

Obtendrá hasta dos raíces para cada eje. Cualquier raíz que sea igual en xey es un punto de intersección entre las curvas.

Obtener la posición es fácil ahora: Simplemente conecte la raíz en su ecuación paramétrica y puede obtener directamente x e y.

+0

Cómo resolver este sistema de ecuaciones en C++ (por lo tanto, no con las funciones integradas de Matlab) http://math.stackexchange.com/questions/1894043/solve-squared-non-linear-system-with-two -ecuaciones –

+0

@ Mr.Sheep Disculpe, no le explicaré la solución. Tampoco he usado nunca Matlab, así que puedo ayudar aquí. –

+0

Lo averiguaré, sin embargo, realmente aprecio su solución aquí, gracias. –

1

Desafortunadamente, la respuesta general requiere la solución de un polinomio de cuarto orden. Si transformamos coordenadas para que una de las dos parábolas esté en la forma estándar y = x^2, entonces la segunda parábola satisface (ax + by)^2 + cx + dy + e == 0. Para encontrar la intersección, resuelve ambas al mismo tiempo. Sustituyendo en y = x^2 vemos que el resultado es un polinomio de cuarto orden: (ax + bx^2)^2 + cx + dx^2 + e == 0. La solución de Nils por lo tanto no funcionará (su error: cada uno es un polinomio de segundo orden en cada variable por separado, pero juntos no lo están).

1

Es fácil si tiene un CAS a mano.

Ver la solución en Mathematica.

Elija una parábola y cambie las coordenadas para que su ecuación se convierta en y (x) = a x^2 (forma normal).

La otra parábola tendrá la forma general:

A x^2 + B x y + CC y^2 + DD x + EE y + F == 0 

where B^2-4 A C ==0 (so it's a parabola) 

Vamos a resolver un caso numérico:

p = {a -> 1, A -> 1, B -> 2, CC -> 1, DD -> 1, EE -> -1, F -> 1}; 
p1 = {[email protected]@Reduce[ 
     (A x^2 + B x y + CC y^2 + DD x + EE y +F /. {y -> a x^2 } /. p) == 0, x]} 

{{x -> -2.11769}, {x -> -0.641445}, {x -> 0.379567- 0.76948 I}, {x -> 0.379567+ 0.76948 I}} parcela

Hagámosle:

Show[{ 
    Plot[a x^2 /. p, {x, -10, 10}, PlotRange -> {{-10, 10}, {-5, 5}}], 
    ContourPlot[(A x^2 + B x y + CC y^2 + DD x + EE y + F /. p) == 
    0, {x, -10, 10}, {y, -10, 10}], 
    Graphics[{ 
    PointSize[Large], Pink, Point[{x, x^2} /. p /. p1[[1]]], 
    PointSize[Large], Pink, Point[{x, x^2} /. p /. p1[[2]]] 
    }]}] 

enter image description here

La solución general consiste en calcular las raíces de:

4 A F + 4 A DD x + (4 A^2 + 4 a A EE) x^2 + 4 a A B x^3 + a^2 B^2 x^4 == 0 

que se realiza fácilmente en cualquier CAS.

Cuestiones relacionadas