図形処理

曲線(ベジェ曲線)の作り方(図式)  曲線(ベジェ曲線)の作り方(計算式)

  ● 制御点が3点と4点の時の計算式を作ってみる。
   曲線(ベジェ曲線)の作り方(図式)では、図を使って曲線(ベジェ曲線)上の点を求めてみました。
   しかしコンピュータでは図からではなく計算式から、求めなくてはなりません。
   それでは、計算式を、図を基に作って見ます。
   その前に、次の事柄を頭に入れておいてください。
    1. 各点は、x、y、z座標からなっています、従って求めた式からx、y、z座標を求めるためには、同じ式を使ってそれ
      ぞれの座標を求めます。
    2. 内分比から点を求める方法は次のようになります。
      P(u) = Q0(1.0 - u) + Q1u
      例)始点Q0が3で、終点Q1が5で、uが0.4(10等分の4等分目)の値を求める
      ┣━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫
     Q0=3←────────→P(u)←──────────────→Q1=5
      ┗━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━┛
        u = 4/10 = 0.4←────────→( 1.0 - u ) = 0.6


      P(u) = Q0(1.0 - u) + Q1u = 3 X 0.6 + 5 X 0.4 = 3.8となります。
      ※小学校高学年レベルの算数なので思い出しておいてください。

    それでは、制御点が3点の場合の曲線上の点を求める式を求めてみましょう。

image003

図1


    Q0112を求める。
     内分比を使って求めると、次のようになります。
     Q0112 = Q01(1.0 - u) + Q12u -----(1)
     Q01 = Q0(1.0 - u) + Q1u -----(2)
     Q12 = Q1(1.0 - u) + Q2u -----(3)
     (2)と(3)を(1)へ代入すると次のようになります。


     Q0112 = (Q0(1.0 - u) + Q1u)(1.0 - u) + (Q1(1.0 - u) + Q2u )u
     これを展開すると
     Q0112 = image008
     整理すると次のようになります。
     P(u) = Q0112 = image009
     Pは、u が変化する度に求まる点なので、u はPのパラメータと呼ばれます。(※ u は内分比なので、0.0≦ u ≦1.0)


    次に、制御点が4点の場合の曲線上の点を求める式を求めてみましょう。

image006

図2

    Q01121223を求める。
     内分比を使って求めると、次のようになります。
     Q01121223 = Q0112(1.0 - u) + Q1223u --------------------(1)
     Q0112 = Q01(1.0 - u) + Q12u --------------------(2)
     Q1223 = Q12(1.0 - u) + Q23u --------------------(3)
     Q01 = Q0(1.0 - u) + Q1u --------------------(4)
     Q12 = Q1(1.0 - u) + Q2u --------------------(5)
     Q23 = Q2(1.0 - u) + Q3u --------------------(6)
     (4)と(5)と(6)を(2)と(3)へ代入すると次のようになります。
     Q0112 = (Q0(1.0 - u) + Q1u)(1.0 - u) + (Q1(1.0 - u) + Q2u)u
         = image009 --------------------(2')
     Q1223 = (Q1(1.0 - u) + Q2u)(1.0 - u) + (Q2(1.0 - u) + Q3u)u
         = image010 --------------------(3')
     さらに(2')と(3')を(1)へ代入すると次のようになります。


     Q01121223 = image011
     これを展開すると
     Q01121223 = image012
     整理すると次のようになります。
     P(u) = Q01121223 = image013
     Pは、u が変化する度に求まる点なので、u はPのパラメータと呼ばれます。(※ u は内分比なので、0.0≦ u ≦1.0)


   これで、制御点が3点の場合と、制御点が4点の場合の式が出来上がりました。


  ● 曲線(ベジェ曲線)の一般式を作ってみる。
   次に、制御点が何点の場合でも対応できる、さらなる一般式を求めてみたいと思います。


    制御点が3点の場合の式:P(u) = image009 --------------------(7)
    制御点が4点の場合の式: P(u) = image013 --------------------(8)
    を次のように書き換えてみます。
    制御点が3点の場合の式:P(u) = image014 --------------------(9)
    制御点が4点の場合の式:P(u) = image015 --------------------(10)
    ここで u の0乗は1です、ちなみにどのような値も0乗すると1になります。
    通常1のかけ算では1は書かないので、(9)と(7)、(10)と(8)は同じ式です。


    ここで(10)式を見てみましょう。
     P(u) = image022


    各項は、内分比に対する制御点の混合割合の値を示しています。
    ここで各項の係数は見てみましょう。


     (9)と(10)の式の係数を並べて書いてみます、さらに制御点が5点の場合も書いてみると下記のようになります。
    image023


    これは有名なパスカルの三角形と言われる物で、高校1年のときにお目にかかった人も多いのではと思います。
    このパスカルの三角形には多くの数列が含まれています、また最短経路問題とも関連しています。
    パスカルの三角形は、二項展開における係数を三角形状に並べた物です。この係数を二項係数といいます。
    image024


    この二項係数は、次式により求められます。


    c( n, i ) = nCi = image016     ※ただし、n! = n・(n - 1)・(n - 2)...3・2・1 (nの階乗)
    例) 3! = 3・2・1 = 6 で、また 0! = 1であり、1! = 1 です。
    c( n, i ) では、制御点が4点(n = 3)の場合、 i = 0で第1項の係数, i = 1で第2項の係数, i = 2で第3項の係数, i = 3で第4項の係数です。
    したがって、(10)式を一般式で書くと次式になります。


    P(u) =image017 -------------------(11)
    ※ただし、0.0 ≦ u ≦ 1.0


   ● 級数(数列の和)について
    これは数列の和で、この場合には i が変わる度に加算して行く事を意味しています。
     例)
      S = image018
      上記の式は、 S = 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 と同じ意味です。


    よって、(11)式では、制御点が4点( n = 3 )の場合、i = 0 のとき第1項、i = 1 のとき第2項、i = 2 のとき第3項、i = 3 のとき第4項、
    が求まり、加算すると 内分比 u に対する曲線(ベジェ曲線)上の点が求まる事になります。

   ● 計算例
    制御点が、Q0(x = 10.0, y = 20.0, z = 50.0) Q1(x = 20.0, y = 50.0, z = 30.0) Q2(x = 30.0, y = 10.0, z = 10.0) の時の
    ベジェ曲線上の点を求める。( n = 2 )
    u = 0.0、u = 0.2、u = 0.4、u = 0.6、u = 0.8、u = 1.0の時の Px, Py, Pz を求めてみます。
    (※ u = 0.1、u = 0.3、u = 0.5、u = 0.7、u = 0.9 の時の Px, Py, Pz は、計算してみてください。)
    Px(0.0) = 1・(1.0 - 0.0)(2 - 0)・0.00・10.0 + 2・(1.0 - 0.0)(2 - 1)・0.01・20.0 + 1・(1.0 - 0.0)(2 - 2)・0.02・30.0 = 10.0
    Py(0.0) = 1・(1.0 - 0.0)(2 - 0)・0.00・20.0 + 2・(1.0 - 0.0)(2 - 1)・0.01・50.0 + 1・(1.0 - 0.0)(2 - 2)・0.02・10.0 = 20.0
    Pz(0.0) = 1・(1.0 - 0.0)(2 - 0)・0.00・50.0 + 2・(1.0 - 0.0)(2 - 1)・0.01・30.0 + 1・(1.0 - 0.0)(2 - 2)・0.02・10.0 = 50.0

    Px(0.2) = 1・(1.0 - 0.2)(2 - 0)・0.20・10.0 + 2・(1.0 - 0.2)(2 - 1)・0.21・20.0 + 1・(1.0 - 0.2)(2 - 2)・0.22・30.0 = 14.0
    Py(0.2) = 1・(1.0 - 0.2)(2 - 0)・0.20・20.0 + 2・(1.0 - 0.2)(2 - 1)・0.21・50.0 + 1・(1.0 - 0.2)(2 - 2)・0.22・10.0 = 28.4
    Pz(0.2) = 1・(1.0 - 0.2)(2 - 0)・0.20・50.0 + 2・(1.0 - 0.2)(2 - 1)・0.21・30.0 + 1・(1.0 - 0.2)(2 - 2)・0.22・10.0 = 42.0

    Px(0.4) = 1・(1.0 - 0.4)(2 - 0)・0.40・10.0 + 2・(1.0 - 0.4)(2 - 1)・0.41・20.0 + 1・(1.0 - 0.4)(2 - 2)・0.42・30.0 = 18.0
    Py(0.4) = 1・(1.0 - 0.4)(2 - 0)・0.40・20.0 + 2・(1.0 - 0.4)(2 - 1)・0.41・50.0 + 1・(1.0 - 0.4)(2 - 2)・0.42・10.0 = 32.8
    Pz(0.4) = 1・(1.0 - 0.4)(2 - 0)・0.40・50.0 + 2・(1.0 - 0.4)(2 - 1)・0.41・30.0 + 1・(1.0 - 0.4)(2 - 2)・0.42・10.0 = 34.0

    Px(0.6) = 1・(1.0 - 0.6)(2 - 0)・0.60・10.0 + 2・(1.0 - 0.6)(2 - 1)・0.61・20.0 + 1・(1.0 - 0.6)(2 - 2)・0.62・30.0 = 22.0
    Py(0.6) = 1・(1.0 - 0.6)(2 - 0)・0.60・20.0 + 2・(1.0 - 0.6)(2 - 1)・0.61・50.0 + 1・(1.0 - 0.6)(2 - 2)・0.62・10.0 = 30.8
    Pz(0.6) = 1・(1.0 - 0.6)(2 - 0)・0.60・50.0 + 2・(1.0 - 0.6)(2 - 1)・0.61・30.0 + 1・(1.0 - 0.6)(2 - 2)・0.62・10.0 = 26.0

    Px(0.8) = 1・(1.0 - 0.8)(2 - 0)・0.80・10.0 + 2・(1.0 - 0.8)(2 - 1)・0.81・20.0 + 1・(1.0 - 0.8)(2 - 2)・0.82・30.0 = 26.0
    Py(0.8) = 1・(1.0 - 0.8)(2 - 0)・0.80・20.0 + 2・(1.0 - 0.8)(2 - 1)・0.81・50.0 + 1・(1.0 - 0.8)(2 - 2)・0.82・10.0 = 23.2
    Pz(0.8) = 1・(1.0 - 0.8)(2 - 0)・0.80・50.0 + 2・(1.0 - 0.8)(2 - 1)・0.81・30.0 + 1・(1.0 - 0.8)(2 - 2)・0.82・10.0 = 18.0

    Px(1.0) = 1・(1.0 - 1.0)(2 - 0)・1.00・10.0 + 2・(1.0 - 1.0)(2 - 1)・1.01・20.0 + 1・(1.0 - 1.0)(2 - 2)・1.02・30.0 = 30.0
    Py(1.0) = 1・(1.0 - 1.0)(2 - 0)・1.00・20.0 + 2・(1.0 - 1.0)(2 - 1)・1.01・50.0 + 1・(1.0 - 1.0)(2 - 2)・1.02・10.0 = 10.0
    Pz(1.0) = 1・(1.0 - 1.0)(2 - 0)・1.00・50.0 + 2・(1.0 - 1.0)(2 - 1)・1.01・30.0 + 1・(1.0 - 1.0)(2 - 2)・1.02・10.0 = 10.0


   ● そして、曲面へ
    これを平面に拡張すると、ベジェ曲面になり、次式で表します。
    image019


    S(u, v) =image020 --------------------(12)
    ※ただし、0.0 ≦ u, v ≦ 1.0
    (12)式は、一般に次のように表現されています。
    S(u, v) =image021
    Bjm(v) = C( j, m )・( 1.0 - v )m-j・vj
    Bin(u) = C( i, n )・( 1.0 - u )n-i・ui
    これは、バーンスタインの基底関数と呼ばれるもので、B はその頭文字です。またS(u, v)の S は Surface(表面)の
    頭文字です。

Copyright ©2011 Uncletel's パソコン備忘録 All Rights Reserved.
正当なCSSです!
このページは正当なCSSです。