さつまろぐ

CAEとかプログラムとか、出来たことの記録など、誰かのお役に立てれば幸い。

Gmshの使い方 Spline, Bezier, B-Spline

何となく使える気になっているGmsh。細かい機能を確認する自分用メモ。

Spline, Bezier, B-Spline

点を指定して曲線を作る、ってのは分かるがどれがどのような曲線を作るのかよく分かっていないので確認。

f:id:satsuma4801:20201022020643p:plain
Spline, Bezier, B-Spline

一般的な話

それぞれの曲線は次の特徴があるらしい。

  • Spline曲線:N個の制御点があるとき、その全てを通るN-1次多項式による多項式補間を行う。*1
  • Bezier曲線:N 個の制御点から得られるN-1次曲線。一般には両端以外の制御点は通らない。*2
  • B-Spline曲線:与えられた複数の制御点とノットベクトルから定義される滑らかな曲線。区分多項式により表現されているため、一部を変更しても曲線全体に影響は及ばない等の性質がある。B-splineはBasis spline(Basis=基底)の省略形。曲線は必ずしも制御点を通らない。*3

理論的な部分は他に詳しいサイトがたくさんあるのでそちらを参照。説明だけでは分からないので、Gmshで実際に線を引いてみる。

実際に描いてみる

[Modules]-[Geometry]-[Elementary entities]-[Add]-[Spline] ( [Bezier], [B-Spline] )を選択。オプション画面は無し。曲線の制御点となる点を順番に選択し、キーボード「e」で決定。

制御点3つの場合

3つの制御点で曲線を描いた結果。

f:id:satsuma4801:20201022020942p:plain
3点をつないだ曲線。BezierとB-Splineは重なっている。

赤丸が制御点、横の番号は選択した順番。Splineは3点を通過している。この例ではBezierとB-Splineは重なっており、始点と終点のみ制御点を通過する。

制御点が増えた場合

f:id:satsuma4801:20201022021044p:plain
制御点が増えた場合

制御点を8点に増やしてみた。赤丸の番号順に選択。Splineは全点通過、BezierとB-Splineは始点と終点のみ通過の特徴はそのまま。

  • Spline : 滑らかに全点を通過するために大回りな軌跡。
  • Bezier : 各制御点の中央付近を通る軌跡
  • B-Spline : SplineとBezierの中間くらいを通る軌跡。

制御点をループさせた場合

制御点をループさせてみる。制御点(赤丸)を1~8の順で選択し、最後にまた1を選択する。

f:id:satsuma4801:20201022021128p:plain
曲線をループさせた場合

  • Spline : 線がつながり1つのループとなった。頑張って滑らかにしようとしているが、ループになる点1付近は厳しいか。
  • Bezier : ループさせるとエラーとなった。なので点1~8までを選択した結果。
  • B-Spline : 新たな点9が現れ、点9を通過するループができた。これは意外。

なお、SplineとB-Splineは表面が設定できたので、ちゃんとループとして認識されているもよう。

.geoファイル

.geoファイルを覗いてみる(制御点8の場合)。

Spline(1) = {1, 2, 3, 4, 5, 6, 7, 8};
Bezier(2) = {1, 2, 3, 4, 5, 6, 7, 8};
BSpline(3) = {1, 2, 3, 4, 5, 6, 7, 8};

各コマンドは上記の通り。制御点以外の引数はないもよう。

マニュアル

マニュアル*4の各項は以下の通り。

Spline

Spline ( expression ) = { expression-list };

Creates a spline going through the points in expression-list. With the built-in geometry kernel this constructs a Catmull-Rom spline. With the OpenCASCADE kernel, this constructs a C2 BSpline. Creates a periodic curve if the first and last points are identical.

Bezier

Bezier ( expression ) = { expression-list };

Creates a Bezier curve. The expression-list contains the tags of the control points.

B-Spline

BSpline ( expression ) = { expression-list };

Creates a cubic BSpline. The expression-list contains the tags of the control points. Creates a periodic curve if the first and last points are identical.

やはり制御点以外の項目はなさそう。


以上、Gmshで描くSpline, Bezier, B-Splineでした。用途に合わせて使い分けができるようになりたいですね。理論についてもいつか触れたいと思います。

上記は、私がネットの情報やマニュアルを調べたり試行錯誤した上で、「こうやったらできた」というものであり、スマートな方法ではないかも知れません。内容に誤りや、「もっとこうしたほうがいい」という点がありましたら、コメントにて指摘いただければ幸いです。

広告