● 制御点が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点の場合の曲線上の点を求める式を求めてみましょう。
図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 =
整理すると次のようになります。
P(u) = Q0112 =
Pは、u が変化する度に求まる点なので、u はPのパラメータと呼ばれます。(※ u は内分比なので、0.0≦ u ≦1.0)
次に、制御点が4点の場合の曲線上の点を求める式を求めてみましょう。
図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
= --------------------(2')
Q1223 = (Q1(1.0 - u) + Q2u)(1.0 - u) + (Q2(1.0 - u) + Q3u)u
= --------------------(3')
さらに(2')と(3')を(1)へ代入すると次のようになります。
Q01121223 =
これを展開すると
Q01121223 =
整理すると次のようになります。
P(u) = Q01121223 =
Pは、u が変化する度に求まる点なので、u はPのパラメータと呼ばれます。(※ u は内分比なので、0.0≦ u ≦1.0)
これで、制御点が3点の場合と、制御点が4点の場合の式が出来上がりました。
● 曲線(ベジェ曲線)の一般式を作ってみる。
次に、制御点が何点の場合でも対応できる、さらなる一般式を求めてみたいと思います。
制御点が3点の場合の式:P(u) =
--------------------(7)
制御点が4点の場合の式: P(u) =
--------------------(8)
を次のように書き換えてみます。
制御点が3点の場合の式:P(u) =
--------------------(9)
制御点が4点の場合の式:P(u) =
--------------------(10)
ここで u の0乗は1です、ちなみにどのような値も0乗すると1になります。
通常1のかけ算では1は書かないので、(9)と(7)、(10)と(8)は同じ式です。
ここで(10)式を見てみましょう。
P(u) =
各項は、内分比に対する制御点の混合割合の値を示しています。
ここで各項の係数は見てみましょう。
(9)と(10)の式の係数を並べて書いてみます、さらに制御点が5点の場合も書いてみると下記のようになります。
これは有名なパスカルの三角形と言われる物で、高校1年のときにお目にかかった人も多いのではと思います。
このパスカルの三角形には多くの数列が含まれています、また最短経路問題とも関連しています。
パスカルの三角形は、二項展開における係数を三角形状に並べた物です。この係数を二項係数といいます。
この二項係数は、次式により求められます。
c( n, i ) = nCi = ※ただし、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) = -------------------(11)
※ただし、0.0 ≦ u ≦ 1.0
● 級数(数列の和)について
これは数列の和で、この場合には i が変わる度に加算して行く事を意味しています。
例)
S =
上記の式は、 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
● そして、曲面へ
これを平面に拡張すると、ベジェ曲面になり、次式で表します。
S(u, v) = --------------------(12)
※ただし、0.0 ≦ u, v ≦ 1.0
(12)式は、一般に次のように表現されています。
S(u, v) =
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(表面)の
頭文字です。