Curva Curvatura en Python

Manav Narula 15 febrero 2024
Curva Curvatura en Python

La curvatura es una medida de la desviación de una curva respecto a una línea recta. Por ejemplo, un círculo tendrá su curvatura como el recíproco de su radio, mientras que las líneas rectas tienen una curvatura de 0.

En este tutorial, aprenderemos cómo calcular la curvatura de una curva en Python usando el módulo numpy. Calcularemos otras cantidades también como velocidades, aceleración y más. Puede encontrar las fórmulas necesarias para ellos en la imagen a continuación.

fórmula de curvatura

Trabajaremos con la siguiente curva.

import numpy as np
import matplotlib.pyplot as plt

coordinates = np.array(
    [[1, 1], [1.5, 2], [2, 3], [2.5, 3.5], [3, 4], [3.5, 4.25], [4, 4.5]]
)

plt.plot(coordinates[:, 0], coordinates[:, 1])

Producción:

curvatura de la curva

Para tales problemas relacionados con curvas, necesitamos calcular las derivadas de la curva dada en cada punto. El método numpy.gradient() se utiliza para tales casos, que devuelve el gradiente de un array N-dimensional.

En el siguiente código, calculamos la velocidad de la curva en todos los puntos.

x_t = np.gradient(coordinates[:, 0])
y_t = np.gradient(coordinates[:, 1])

vel = np.array([[x_t[i], y_t[i]] for i in range(x_t.size)])

print(vel)

Producción :

[[0.5   1.   ]
 [0.5   1.   ]
 [0.5   0.75 ]
 [0.5   0.5  ]
 [0.5   0.375]
 [0.5   0.25 ]
 [0.5   0.25 ]]

Después de calcular la velocidad, procedemos a la velocidad. Ahora la rapidez es el módulo de la velocidad. Sin embargo, conviene saber que hasta ahora todo es función de t (t representa el intervalo de tiempo). Por lo tanto, representaremos la velocidad como una serie de valores en cada uno de los intervalos de tiempo de un segundo.

Vea el código a continuación.

speed = np.sqrt(x_t * x_t + y_t * y_t)

print(speed)

Producción :

[1.11803399 1.11803399 0.90138782 0.70710678 0.625      0.55901699
 0.55901699]

Ahora para calcular la tangente, realizaremos una transformación que asegurará que el tamaño de la rapidez y la velocidad sea el mismo. Además, necesitamos poder dividir la función de velocidad con valores vectoriales en el array de velocidad escalar.

tangent = np.array([1 / speed] * 2).transpose() * vel

print(tangent)

Producción :

[[0.4472136  0.89442719]
 [0.4472136  0.89442719]
 [0.5547002  0.83205029]
 [0.70710678 0.70710678]
 [0.8        0.6       ]
 [0.89442719 0.4472136 ]
 [0.89442719 0.4472136 ]]

De manera similar, ahora podemos aislar los componentes de la tangente y calcular su gradiente para encontrar también el vector normal.

Ahora implementaremos la fórmula de curvatura proporcionada en el siguiente código.

ss_t = np.gradient(speed)
xx_t = np.gradient(x_t)
yy_t = np.gradient(y_t)

curvature_val = np.abs(xx_t * y_t - x_t * yy_t) / (x_t * x_t + y_t * y_t) ** 1.5

print(curvature_val)

Producción :

[0.         0.04472136 0.17067698 0.26516504 0.256      0.17888544
 0.        ]
Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn