BEZIER 3次制御点を[3次の補間]に簡単に変換できます。ただ、これを逆にすることによって:そう
:
/* bezier = interpol
1 | ( x0)=X1;
t | (3.0*x1)-(3.0*x0)=(0.5*(X2-X0));
tt | (3.0*x2)-(6.0*x1)+(3.0*x0)=(3.0*(X2-X1))-(X2-X0)-(0.5*(X3-X1));
ttt|( x3)-(3.0*x2)+(3.0*x1)-( x0)=(0.5*(X2-X0))+(0.5*(X3-X1))+(2.0*(-X2+X1));
1 | ( y0)=Y1;
t | (3.0*y1)-(3.0*y0)=(0.5*(Y2-Y0));
tt | (3.0*y2)-(6.0*y1)+(3.0*y0)=(3.0*(Y2-Y1))-(Y2-Y0)-(0.5*(Y3-Y1));
ttt|( y3)-(3.0*y2)+(3.0*y1)-( y0)=(0.5*(Y2-Y0))+(0.5*(Y3-Y1))+(2.0*(-Y2+Y1));
*/
// input: x0,y0,..x3,y3 ... Bezier control points
// output: X0,Y0,..X3,Y3 ... interpolation control points
double x0,y0,x1,y1,x2,y2,x3,y3,m=1.0/9.0;
X0=x0-(x1-x0)/m; Y0=y0-(y1-y0)/m;
X1=x0; Y1=y0;
X2=x3; Y2=y3;
X3=x3+(x3-x2)/m; Y3=y3+(y3-y2)/m;
希望は私がすべての代数的ミスをしませんでした。シェイプは変更されずに、すべてのコントロールポイントを直接カーブに移動します。 BBOXの計算では、使用されるパラメータt=<0,1>
がそれらの間を補間しているので、(X1,Y1)
と(X2,Y2)
を使用するだけでよいことに注意してください。
でも、コントロールポイントなしで極端な値を設定することができますが、これによっても不正確さが生じる可能性があります。その場合でも問題があります(BBOXは必要以上に小さいです)。あるステップ(0.1
)で曲線上の点の集合(例えば1立方体あたり)にあなたの形状を再サンプリングし、それらからBBOXを行いますポイント。それははるかに正確ですが粗いのは遅くなります...
パスのコピーを「平坦化」してその境界を使用することができます。コントロールポイントを動かすと、カーブが大きく変わります! – TaW
問題は境界を計算していません。私はすでにそれを平らにすることでやっている。私はマスクとしてこのパスを使用し、パズルを生成するためにパズルの画像をオーバーレイするためにJava/Androidの機能を使用しています。その機能は、この問題に遭遇する結果、これらの境界を使用します。可能な場合は、境界内でコントロールポイントを移動するのが最も簡単な方法です。回避策はありますか? – pats