Curvatura da curva em Python

Manav Narula 15 fevereiro 2024
Curvatura da curva em Python

Curvatura é uma medida de desvio de uma curva de ser uma linha reta. Por exemplo, um círculo terá sua curvatura como o recíproco de seu raio, enquanto as linhas retas têm uma curvatura de 0.

Neste tutorial, aprenderemos como calcular a curvatura de uma curva em Python usando o módulo numpy. Iremos calcular outras quantidades também como velocidades, aceleração e muito mais. Você pode encontrar as fórmulas necessárias para eles na imagem abaixo.

fórmula de curvatura

Vamos trabalhar com a seguinte 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])

Resultado:

curvatura da curva

Para tais problemas relacionados a curvas, precisamos calcular as derivadas da curva dada em cada ponto. O método numpy.gradient() é usado para tais casos, que retorna o gradiente de um array N-Dimensional.

No código a seguir, calculamos a velocidade da curva em todos os pontos.

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)

Resultado:

[[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 ]]

Depois de calcular a velocidade, passamos para a velocidade. Agora, a velocidade é o módulo da velocidade. No entanto, deve-se saber que até agora tudo é função de t (t representa o intervalo de tempo). Portanto, representaremos a velocidade como um array numpy de valores em cada um dos intervalos de tempo de um segundo.

Veja o código abaixo.

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

print(speed)

Resultado:

[1.11803399 1.11803399 0.90138782 0.70710678 0.625      0.55901699
 0.55901699]

Agora, para calcular a tangente, faremos algumas transformações que garantirão que o tamanho da velocidade e da velocidade seja o mesmo. Além disso, precisamos ser capazes de dividir a função de velocidade com valor vetorial para a matriz de velocidade escalar.

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

print(tangent)

Resultado:

[[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 ]]

Da mesma forma, agora podemos isolar os componentes da tangente e calcular seu gradiente para encontrar também o vetor normal.

Agora implementaremos a fórmula de curvatura fornecida no código a seguir.

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)

Resultado:

[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