目次
- 目次
- はじめに
- Pythonコード
- 1. 円フィッティングにより、曲率を計算する方法
- 2. 方位差分による曲率計算
- 3. 点列の二次微分を近似して計算する方法
- 4. 4次のルンゲクッタで二次微分を近似する方法
- 上記の方法の比較
- 参考資料
- MyEnigma Supporters
はじめに
たまに点列データから、
その点列の滑らかさを評価するために、
近似的に曲率を計算したくなる時があります。
今回は、
いくつかの点群データから曲率を計算する方法の紹介と、
それらをPythonで実装したコードを公開したいと思います。
Pythonコード
今回紹介する曲率の計算方法のPythonコードは、
下記で公開しています。
1. 円フィッティングにより、曲率を計算する方法
点群から曲率を計算する方法は色々とありますが、
ある点の前後1点づつを使って、曲率を計算するのではなく、
曲率の計算結果を安定化するために、
より多くの点を使って曲率を計算したい場合は、
シンプルにそれらの点を円フィッティングし、
その半径の逆数を取ったほうが便利な場合があります。
そこで、点群のx-y座標と、曲率を計算する点数を与えると、
先日紹介した最小二乗法による円フィッティングを使って、
数値的に計算されたそれぞれの点の曲率のリストを返す関数を作りました。
円フィッティングですと、曲率の方向がわからないので、
点列のベクトルの角度を別途計算し、曲率の符号を決めています。
また、入力点列が直線ですと、半径の計算が不安定になるので、
その部分にエラー処理を入れています。
2. 方位差分による曲率計算
2つ目の手法は、点列データの方位情報がある場合に、
前後の曲率の差を二点の距離で割ることにより、
曲率を計算する方法です。
こちらの計算は、下記の関数で計算しています。
3. 点列の二次微分を近似して計算する方法
3つ目の方法は、点列のデータから二次微分まで近似し、
曲率を計算する方法です。
こちらの計算は、下記の関数で計算しています。
4. 4次のルンゲクッタで二次微分を近似する方法
最後の方法は、3つ目の方法と曲率の計算方法は同じですが、
二次微分を4次のルンゲクッタ法(下記の記事参照)
で微分する方法です。
下記で、4次のルンゲクッタで二次微分を近似します。
こちらの計算は、下記の関数で計算しています。
上記の方法の比較
上記の手法の計算結果を評価するために、
先日紹介した3次スプラインのコードを使っています。
この記事で説明しているとおり、
3次スプラインは解析的に曲率を計算することができるので、
それを使って、答え合わせをしています。
下記が比較結果です。
4つの手法とも、ほぼ同じように解析的に求めた曲率と同じような
計算結果になっています。
下記の図は、曲率の比較のための
ズームアップしたものです。
ルンゲクッタと二次微分が若干異なる振る舞いをしていますが,
(バグかもしれません)
ほぼ同じようなカーブを描いています。
参考資料
MyEnigma Supporters
もしこの記事が参考になり、
ブログをサポートしたいと思われた方は、
こちらからよろしくお願いします。