Python での曲線の曲率

Manav Narula 2021年8月10日
Python での曲線の曲率

曲率は、曲線が直線であることからの逸脱度の尺度です。たとえば、円の曲率は半径の逆数になりますが、直線の曲率は 0 になります。

このチュートリアルでは、numpy モジュールを使用して Python で曲線の曲率を計算する方法を学習します。速度、加速度などの他の量も計算します。下の写真でそれらに必要な式を見つけることができます。

曲率式

次の曲線で作業します。

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

出力:

曲線の曲率

曲線に関連するこのような問題については、各点で与えられた曲線の導関数を計算する必要があります。numpy.gradient() メソッドは、このような場合に使用され、N 次元配列の勾配を返します。

次のコードでは、すべてのポイントでの曲線の速度を計算します。

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)

出力:

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

速度を計算した後、速度に進みます。ここで、速度は速度のモジュラスです。ただし、これまではすべてが t の関数であることに注意してください(t は時間間隔を表します)。したがって、速度は、1 秒の各時間間隔での値の多数の配列として表されます。

以下のコードを参照してください。

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

print(speed)

出力:

[1.11803399 1.11803399 0.90138782 0.70710678 0.625      0.55901699
 0.55901699]

次に、接線を計算するために、速度と速度のサイズが同じになるように変換を実行します。また、ベクトル値の速度関数をスカラー速度配列に分割できる必要があります。

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

print(tangent)

出力:

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

同様に、接線の成分を分離し、その勾配を計算して、法線ベクトルも見つけることができます。

以下のコードで、提供されている曲率の式を実装します。

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)

出力:

[0.         0.04472136 0.17067698 0.26516504 0.256      0.17888544
 0.        ]
著者: Manav Narula
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