So-net無料ブログ作成

太さの変わるBezier曲線の生成 - その8 [考え中 - 太さの変わるBezier曲線]

こないだから集中的に考えている、タブレットでPhotoshopのブラシの線を描いたようなBezier曲線を生成するソフトを作りたいという話。しばらく数学的には簡単な話が続いた。今日はとびとびの点をBezier曲線で内挿することを考える。

Bezier曲線のスムージング

NSEventで得られるタブレットの軌跡はとびとびの位置の情報しかない。このままでは折れ線しか引けない。したがってこれをなめらかにする必要がある。

曲線が「なめらか」とは

なめらかとはどういうことか。数学では「なめらか」=「微分可能」と普通はとらえられる。しかしだた「微分可能」であるだけでは曲線は一つに決まらない。なにかほかに条件が必要で、スプライン曲線では高次の微係数まで考慮してひとつの曲線に決めている。が、同じことをやっていいのか。スプラインについてはあとで考えることにして、どういう曲線が「直感的になめらか」に見えるか、を考える。

例えば以前、四分の一単位円でやったことをもう一度見てみる。 図-12は式-6のkをk0=4/3(-1+√2)から-1/2、0、+1/2、1と変えてプロットしたものである。すべてBezier曲線なので微分可能な曲線である。

1018fig12.png
図の中で赤の線がさっき一番円に近いとした曲線である。このなかで直感的にどれが一番「なめらか」だと思えるだろうか。

Bezier曲線の曲率

ここでちょっと曲率について考えてみる。

1018fig13.png
曲率Cとは、図-13に描いたような
1018eq50.png
である。ここでdsは曲線L上の微小線素で、αはdsが円弧の一部であると見なしたときの中心角である。つまりdsというちょっとだけ曲線に沿って進んだときどのくらい向きが変わるか、という量である。

また、円弧の中心Oからの距離をRとすると

1018eq51.png
であって、従って曲率Cは、曲線の微小部分を円の一部と見なしたときの半径の逆数である。Cが大きいということは線がそこできゅっと曲がっているということで、Cが0なら直線ということになる。

Bezier曲線の曲率の具体的な計算

ここでBezier曲線P(t)のあるtの位置での曲率を計算するために、ここで媒介変数表示された曲線の曲率の式を求めておく。

まず微小線素dsが

1018eq52.png
であることはいいだろう。

Bezier曲線P(t)をtで微分しものをQ(t)とすると

1018eq53.png
となってQ(t)は曲線の接線ベクトルになる。もともとP(t)が2次元ベクトルだったのでQ(t)もそうなる。これ、最初から区別しておいた方(ベクトルのフォントを変えるとか)が良かったなあ。もう遅いけど。

ただし、ここで微分の記号が煩わしいので

1018eq55.png
などとした。

接線ベクトルは曲線を円弧と見なしたときの半径方向といつも垂直になっているので、接線ベクトルの変化分dQ(t)は図-14からわかるように中心角dαとは

1018eq56.png
と書ける。ここで|A|はベクトルAの長さであり、
1018eq59.png
であるとした。ちょっとごまかしがあるけど、まあいいでしょ。

さらに

1018eq60.png
とできる。
1018fig14.png
従って曲率C(t)は
1018eq61.png
となる。わからなくなりそうだけど、
1018eq63.png
を代入すれば、途中を省略するけどちょっと簡単になって
1018eq65.png
となる。これがBezier曲線の曲率の式で、一般に媒介変数表示された2次元曲線の曲率の式となっている。

ここまでは単なる前置きと曲率の式を導いただけなので、本題に入る。

なるべく「なめらか」に見える曲線を選ぶ

図-15に、最初の方で図-12に描いたそれぞれの曲線の曲率を、ログプロットしたものを示す。

1018fig15.png
図-15を見ると、kの値が小さいものは端点の近くで急に曲がって(曲率が大きく)いるし、kの値の大きなものは中央付近で尖って(やはり曲率が大きく)いる。円に近い赤線はほとんど変化がない。

これはあたりまえで、単位円であれば曲率はどこでも1であり、円以外はすべて曲率が1より大きくなるとことろが必ず含まれている。

なぜ、曲率を持ち出したかと言うと、図-12にある4本の曲線のうちどれが「直感的になめらか」と感じるか、ということでやはり赤線の円がもっともなめらかだと感じて、その他の曲線はどこか無理している感じがあると思う。つまり「直感的になめらか」な曲線と言うのは曲率があまり大きくならない曲線のことだとここでは定義しておく。もう少し数学的な定義を与えると、曲線に沿った曲率の大きさの最大値

1018eq66.png
を考える。端点が一致したM本のBezier曲線群Pm(t)のなかでCmmaxが最も小さい
1018eq67.png
となるBezier曲線Pm(t)を「もっとも直感的になめらか」なBezier曲線であるとする。

この定義は一見もっともらしいけれど、これをそのまま実装するには計算量が多すぎる。曲率の計算は面倒だし、その最大値は数値的に計算するしかないし、Cmaxの最小化には繰り返し計算が必要になる。

これではレスポンスのいい実装とはほど遠くなってしまう。

ここでは「なるべく滑らかに見える」曲線を選ぶ基準を作りたかったが、この分野ではいろいろなことが提案されているらしい。曲率が線長に比例する曲線を「美的曲線」と呼ぶ人もいる。

見かけのなめらかさと計算効率のバランスをとることができるようなアルゴリズムを考える必要がある。ここまで考えたけど、別のアプローチを考える。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0