SSブログ

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

もらった宿題

  1. ベジェ曲線同士の交点の取得方法
  2. ベジェ曲線内のX、Y座標の最大値の取得方法
  3. ベジェの(単純な)オフセットの方法
のうち、最初の二つは解決した。実際のコードに落とすにはもう少し検討が必要だけど。

宿題の最後、Bezier曲線のオフセットについて。これは難しい問題が含まれていることがわかった。

曲線のオフセットというのは元の曲線から一定の距離にある点を結んだ曲線を作ることで、ある大きさの円の中心を曲線に沿って動かしたときの、円が塗りつぶした領域の外形線になる。

だから曲線のオフセットというのは、はじめにやったカリグラフィの扱いと同じで、今回カリグラフィのペン(ブラシ)の形を楕円にしたけど、その特殊な場合として円を使った場合と同じになる。オフセットの問題を、最初に考えていた楕円のペン先によるカリグラフィの問題として一般化することにする。

カリグラフィには楕円だけでなく長方形などの凸多角形やさらに任意の閉曲線が使われることがある。Bezier曲線で表そうとしたとき、長方形のような微分不可能な曲線を持ったペンを使うのは場合分けが増えて面倒になる。ということで今回は楕円に限定した。

ちょっと前に回転した楕円に外接する四角形の大きさを計算した。これでカリグラフィの線幅の値がわかると思っていた。オフセットの問題を宿題にもらって考えているうちにそれはちょっと甘くてもう少し計算する必要があることがわかった。

もう一度図を描き直してみると

1115fig31.png
楕円によるカリグラフィを図-31のように考える。つまり曲線Lの、ある点O上に楕円の中心(対称軸の交点)を置く。楕円の長軸とx軸のなす角度をφe、曲線Lのx軸との角度をφbとする。この楕円をLに沿って動かしたときに塗りつぶされる領域を線の幅とする。 このときの外形線LuとLdは傾きが楕円の中心位置でのLの傾きに一致して、楕円に接する線となっている。

簡単のため、x軸をLの向きに取り直す。つまり楕円の長軸の方向を

1115eq94.png
とする。こうするとLuとLdはx軸に平行になる。 この楕円の媒介変数θによる式は、前書いたように
1115eq95.png
となる。ここで
1115eq97.png
である。

この曲線がx軸に平行になる場所はy方向に極大(あるいは極小)のところなので、あきらかに

1115eq98.png
のときである。

式-96に代入すると

1115eq99.png
となる。二つの符号のそれぞれをとって
1115eq101.png
としておく。

つまり、この二つの位置が楕円上で点Oから曲線Lに沿ったもっとも遠い位置になる。従ってこの点を追っていけば線の外形が得られる。

これを使ってBezier曲線に線幅を与える。

楕円の長軸と短軸の長さa、b、および長軸とx軸のなす角度φeは与えられているとする。

Bezier曲線をP(t)とする。あるtでの接線方向とx軸とのなす角φb(t)は

1115eq102.png
である。

あるtでの外形となる点Pu(t)、Pd(t)は

1115eq104.png
として
1115eq105.png
となる。このR(φ)は式-40の回転のマトリクスである。もう一度書いておくか。
1115eq105a.png
で、座標を縦書きするのが面倒なので後からかけてる。これはマトリクスAとベクトルv(縦ベクトル)の積を数学で普通に書くと
1115eq105b.png
だけど、これを転置して
1115eq105c.png
と書いたもの。DirectXという3Dライブラリではこっちの書き方が使われているらしい。どっちでも同じだけど、実際にCの関数として実装するときは混乱する。

横道にそれたけど、つまり、楕円をBezier曲線の接線の方向に向けて外形となる点を計算した後、結果をまた回転させて元に戻すということをやっている。平面幾何学のちまちました問題ばかりで面倒だけどゆっくり考えれば難しくはない。

つぎはちょっと具体的な例で答え合わせをして、そのあとオフセットにまつわる問題を指摘する。


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

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

献立11/13PowerBook G4の故障とその原因.. ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。