canvas学習ノート-ベッセル曲線
1965 ワード
3.4ベッセル曲線
canvasでは、ベッセルカーブを描くapiが2つ用意されています. ctx.quadraticCurveTo(cpx, cpy, x, y);
二次ベッセル曲線、(cpx,cpy)制御点(x,y)終点 ctx.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y);
三次ベッセル曲線,(cp 1 x,cp 1 y)制御点一,(cp 2 x,cp 2 y)制御点二,(x,y)終点
余談:
ベッセル曲線の数学的基礎は1912年に広く知られたバーンスタイン多項式である.自動車の車体を補助するための工業設計が最初に使われた.
CSS 3のtransition-timing-function属性は、値をとると三次ベッセル曲線方程式に設定できます
canvas図面の例:
青はコントロールポイント
問題1:canvasはどのように点を制御して曲線を描くのか、あるいはこれを使わない場合は、自分で曲線を描くのはどのように操作すればいいのか.
これはn次Bessel曲線の方程式です.
二(三)次方程式を重点的に見ます.
B(t)は曲線上の点、tは0~1の間で値をとり、P 0始点、P 2終点、P 1制御点
tは0~1の間から値を大きくし、B(t)は曲線上の点を取り出し、P 0からP 1に移動する
問題2:私はどのように制御点がどのように選ぶべきなことを知っていて、特に終点の動態のデータを始める時(つまり、私達が使う時、よく起点P 0終点P 1だけを知っています):
これは曲線の傾きによって、可視化のニーズが選択される可能性のある方法が一致しないが、ほぼ原理が似ている.
始点と終点の
余談:
cp点の解について:
セグメントの中点:
const mid = [ ( start.x + end.x)/2, ( start.y + end.y )/2 ];
始点と終点によってベクトルvを得ることもできる.
const v = [ end.x - start.x, end.y- start.y ];
このベクトルを時計回りに90度回転させ、それに垂直なベクトルv 2を得る.
const v2 = [ v.y, -v.x ];
中間制御点の座標は(ベクトルv 2にcurvenessを乗じて中間点座標を加算)
const cp = { x: mid.x + v2.x curveness, y: mid.y + v2.y curveness} = { x:( start.x + end.x )/2 - ( start.y - end.y ) * curveness, y:( start.y + end.y )/2 - ( end.x - start.x ) * curveness}
canvasでは、ベッセルカーブを描くapiが2つ用意されています.
二次ベッセル曲線、(cpx,cpy)制御点(x,y)終点
三次ベッセル曲線,(cp 1 x,cp 1 y)制御点一,(cp 2 x,cp 2 y)制御点二,(x,y)終点
余談:
ベッセル曲線の数学的基礎は1912年に広く知られたバーンスタイン多項式である.自動車の車体を補助するための工業設計が最初に使われた.
CSS 3のtransition-timing-function属性は、値をとると三次ベッセル曲線方程式に設定できます
transition-timing-function: cubic-bezier(0.1, 0.7, 1.0, 0.1)
. canvas図面の例:
//
ctx.moveTo(200, 100);
ctx.quadraticCurveTo(230, 250, 350, 200);
//
ctx.moveTo(450, 250);
ctx.bezierCurveTo(530, 150, 650, 300, 700, 200);
青はコントロールポイント
問題1:canvasはどのように点を制御して曲線を描くのか、あるいはこれを使わない場合は、自分で曲線を描くのはどのように操作すればいいのか.
これはn次Bessel曲線の方程式です.
二(三)次方程式を重点的に見ます.
B(t)は曲線上の点、tは0~1の間で値をとり、P 0始点、P 2終点、P 1制御点
tは0~1の間から値を大きくし、B(t)は曲線上の点を取り出し、P 0からP 1に移動する
const bx = (1-t)*(1-t)*start.x + 2*t*(1-t)*control.x + t*t*end.x;
const by = (1-t)*(1-t)*start.y + 2*t*(1-t)*control.y + t*t*end.y;
問題2:私はどのように制御点がどのように選ぶべきなことを知っていて、特に終点の動態のデータを始める時(つまり、私達が使う時、よく起点P 0終点P 1だけを知っています):
これは曲線の傾きによって、可視化のニーズが選択される可能性のある方法が一致しないが、ほぼ原理が似ている.
始点と終点の
上から選択して
、次に曲線の
// curveness (0-1)
const cp = {
x: ( start.x + end.x ) / 2 - ( start.y - end.y ) * curveness,
y: ( start.y + end.y ) / 2 - ( end.x - start.x ) * curveness
};
余談:
cp点の解について:
セグメントの中点:
const mid = [ ( start.x + end.x)/2, ( start.y + end.y )/2 ];
始点と終点によってベクトルvを得ることもできる.
const v = [ end.x - start.x, end.y- start.y ];
このベクトルを時計回りに90度回転させ、それに垂直なベクトルv 2を得る.
const v2 = [ v.y, -v.x ];
中間制御点の座標は(ベクトルv 2にcurvenessを乗じて中間点座標を加算)
const cp = { x: mid.x + v2.x curveness, y: mid.y + v2.y curveness} = { x:( start.x + end.x )/2 - ( start.y - end.y ) * curveness, y:( start.y + end.y )/2 - ( end.x - start.x ) * curveness}