スプライン曲線をベジェ曲線に変換

[戻る]
あお 2004/04/27(火) 11:57:54
いつもお世話になっております。
こちらで質問していいのかわからないのですが、
質問させていただきます。

(DXFファイルから取得した)3次のスプライン曲線のデータ
(制御点などのデータ)があります。
これを描画しようとしています。
関数としてPolyBezier又はPolyBezierToを使用して描画するのは
わかるのですが、スプライン曲線をどうやってベジェ曲線に変換する
のかがわかりません。
そのような関数があるのでしょうか?
自力で変換しないといけない場合、その変換式とはどのような物なのでしょうか。
おわかりになる方がいらっしゃいましたら教えてください。
お願いいたします

開発環境
Win2000・VS6SP5・MFCではありません

PATIO 2004/04/27(火) 13:18:14
関数に関しては良く分かりませんが、
スプライン曲線とベジェ曲線の解説がここにありました。

http://musashi.or.tv/doc/fontguide.htm

ベジェに変換して描画するのではなくて
ここの解説から自前でスプライン曲線を引くというアプローチは駄目なんでしょうか。
変換するにしてもかなりめんどくさそうな感じですし、
同じめんどうなら直接書いではどうかと思ったんですが。

あお 2004/04/27(火) 15:29:17
PATIO様 返信ありがとうございます。

できれば、点や線の羅列ではない形で描画したいと思っています。
メタファイルに描画しているのでアウトライン化(?)を実行した場合
スプラインで描画している曲線を選択できなくなりますよね。
自前で書くと。

変換の方法を知っていらっしゃる方がいらっしゃいましたら
教えてください。

たいちう 2004/04/27(火) 16:48:10
> できれば、点や線の羅列ではない形で描画したいと思っています。
> メタファイルに描画しているのでアウトライン化(?)を実行した場合
> スプラインで描画している曲線を選択できなくなりますよね。
> 自前で書くと。

私自身あまり明るくないし、この辺り、何をお求めなのか判らないのですが、
ベジェ曲線とスプライン曲線は別物ですので、変換不能かと。同じ3次の場合でも。

円を直線に変換したい場合はどうします?
円周を細かく分割して直線に近似しますよね?
これが「点や線の羅列」であるなら、点や線の羅列ではない形では
円を描画できません。

# というふうに私は理解したのですが、
# もしも違っていたらごめんなさい。

PATIO 2004/04/27(火) 17:08:30
変換するためにはスプライン曲線とベジェ曲線を同じ土俵に引き上げないと
いけないと思うのですが、私が紹介したリンク先ではこの二つは全く別のものとして
紹介されているのでかなり複雑怪奇な事をしないと無理ではないかと思います。

感覚的に言える事は、スプライン曲線を近似した点列を計算し、
その点列から対応するベジェ曲線のパラメータを求めるという方法ぐらいしか
考えつかないです。
多分、かなり面倒な計算になると思います。
しかも、近似値しか出せないと思うのでベジェ曲線上で移動やら変形を行った場合、
スプライン曲線に戻した場合に期待した値が得られるのかかなり微妙な気もします。

良く分からないんですが、一般的に言ってスプライン曲線とベジェ曲線間で変換を
行うような状況というのはよくあるんでしょうか。
あるのであれば、一般的な変換方法が既にあってもおかしくないと思うのですが。

PATIO 2004/04/27(火) 17:32:52
ちょいと調べてみましたが、
スプライン曲線とベジェ曲線というのは数学的に相互変換が可能なんですね。
ただ、その変換方法に関する情報までは行き着けませんでした。

数学的に変換可能であるなら、数学系の書物をあさってみたら何か出てくるかも
しれませんね。
あとはアルゴリズム辞典とかそんな本かな。

相互変換可能とは知らなかった。
調べてみるもんですねぇ。

たいちう 2004/04/27(火) 17:57:38
> ちょいと調べてみましたが、
> スプライン曲線とベジェ曲線というのは数学的に相互変換が可能なんですね。
> ただ、その変換方法に関する情報までは行き着けませんでした。

http://itp.ne.jp/topics/btob/print/yougo/list_sa.html
http://homepage3.nifty.com/silo/T1/mono9710.html
http://www1.kcn.ne.jp/~iba/font/f_tips.htm

こんなところですか?
どれも可能と書いてありますが本当かな?
まあ多分本当なんでしょうね。

どうやら私が間違っていたようでした。
もう一度ごめんなさい。

あお 2004/04/27(火) 18:18:22
[[解決]]
PATIO様 たいちう様 返信ありがとうございます。

何らかの方法があるようですが、簡単に変更できるようでも
ないですね。
自前で書くことにしました。

ありがとうございました。

2004/04/27(火) 20:53:56
終わった後からこんなことを書くのはなんだか気が引けますが、
(私なりの解釈なのでこれが正しいと主張するものではありません)
気が向いたら読んでみてください
スプラインというのは、幾つかの曲線の断片をつなげて連続な曲線を
描画(生成)する場合を指すと思います
例1)雲形定規を使って連続な曲線を描く
例2)自在定規を使って連続した曲線を作成したり、描いたりする
  ただ、計算機で曲線を扱う場合、曲線の生成方式が、各要素毎に違うのは
  面倒なのと、理論的に取り扱う場合にも不便なので、普通は要素となる曲線は
  特定の生成方式のものを扱うことが多いと思います

ベジエ曲線というのはベジエという人が発表した曲線の生成方式で
数式で表すことも出来ますが、制御点を利用して表現できることと、
簡単に小さな区間に分割できる(各区間もベジエ曲線になっている)という特性
とから計算機で曲線を扱う場合に便利な様です
  一般的なベジエ曲線は n+1点の制御点からなるn次のベジエ曲線として説明
  することが多いと思います

ですから、ベジエ曲線を用いたスプラインというものもあっていいわけです
この場合、扱いが簡単になるように2次のベジエ曲線か、3次のベジエ曲線か
を用いることが多いと思います

とおりすがり 2004/04/28(水) 04:48:06
普通の3次のスプライン曲線は、ベジェ曲線に変換できるよ。
直接、計算することもできるけど、
(制御点を通る)スプライン曲線を3次Bスプラインに変換して、
Bスプラインをベジェに変換するのが楽かと。

スプライン曲線→Bスプラインは、
スプライン曲線の端点でない制御点が、Bスプラインのオフ制御点を結ぶ線分の中点になるよう
に(Bスプラインのオフ制御点を)計算する。

Bスプライン→ベジェは、つまり、曲線を変更しないで保ちながら制御点を追加していくという
処理です。
http://www.infogoaround.org/JBook/bstobez.html

計算自体はそんなに大変ではないと思う。

あお 2004/04/28(水) 11:12:41
島様 
とおりすがり様 返信ありがとうございます。

変換は可能なのですね。
もう少し考えてみます。

あ!英語のHPだ・・・
が、頑張って読みます。

なんだかBスプラインとスプラインの関係も
2次スプラインと3次スプラインの違いも
あやふやなことが判明しましたのでもう少し勉強します。
解決済みにも関わらず返信いただきありがとうございます。

古いスレッドには追加発言できません。