2次関数を3次ベジエで近似
2次関数 f(x) = pK ( x - pX ) ^ 2 + pY の定義域 [ pP, pQ ] で描かれる曲線を3次ベジエで近似しようとするとき、
2つのコントロールポイントの座標を以下のプログラムのように求めればよい。 x1, y1 と x2, y2
ruby>>
double wPQ = pP * pQ;
double wPP = pP * pP;
double wQQ = pQ * pQ;
double x1 = ( ( wPQ - 2 * wPP + wQQ ) / 3 ) / ( pQ - pP );
double x2 = ( ( wPQ + wPP - 2 * wQQ ) / 3 ) / ( pP - pQ );
double wA = pK * ( pQ + pP - 2 * pX );
double wB = pY + pK * ( pX * pX - ( wPP + wPQ + wQQ ) / 3 );
double y1 = x1 * wA + wB;
double y2 = x2 * wA + wB;
<<--
考え方
線分 p->q を L とする。( wA は L の傾き)
L に平行な直線で、f(x)に接する直線を M とする。
L からみて M 側にあり、L と M の距離の 4/3 倍の距離にある L に平行な直線を N とする。
( y = wA * x + wB )
この N の上に2つのコントロールポイントをおく。
N と x = pP における接線との交点が1つめのコントロールポイント
N と x = pQ における接線との交点が2つめのコントロールポイント
である。
pP = 0, pQ = 1 のとき、
ruby>>
double x1 = 1. / 3.;
double x2 = 2. / 3.;
double wN = pY + pK * ( pX * pX - 1. / 3. );
double y1 = x1 * pK + wN;
double y2 = x2 * pK + wN;
<<--