2017-09-28 20 views
0

以下の画像を参照してください。 image below このパスオブジェクトは、各側に4つのベジエ曲線を使用して作成されます。 現在、立方体の曲線を使って作成されたこのパスオブジェクトの境界を取得しようとすると、問題に直面しています。あなたが見ることができるように、上部と下部の側面は、境界を完全に不正確にする曲線から離れた制御点を持っています。カーブ内に制御点を持つベジエ曲線

私の質問は、カーブの上または上にすべてのコントロールポイントを持つイメージのようなジグソーパズルピースを作成することです。 (それは曲線と完全な鏡を作成しており、曲線の境界内のすべての点)

+0

パスのコピーを「平坦化」してその境界を使用することができます。コントロールポイントを動かすと、カーブが大きく変わります! – TaW

+0

問題は境界を計算していません。私はすでにそれを平らにすることでやっている。私はマスクとしてこのパスを使用し、パズルを生成するためにパズルの画像をオーバーレイするためにJava/Androidの機能を使用しています。その機能は、この問題に遭遇する結果、これらの境界を使用します。可能な場合は、境界内でコントロールポイントを移動するのが最も簡単な方法です。回避策はありますか? – pats

答えて

1

制御点を使って境界を計算しないでください。少なくとも、きつい範囲が必要な場合や、指定されたクリッピング矩形内の潜在的な可視性を素早くチェックしたくない場合は、少なくとも。 This素晴らしいサイトは、bounding boxを含む一般的なベジエ曲線計算で多くを助けることができます。

また、コントロールポイントがカーブ上にあるスプラインに切り替えますが、カーブがコントロールポイントによって設定された境界を超えて拡張する場合、反対の効果に終わる可能性があります。

+0

お返事ありがとうございます。私はすでに本当の範囲を推定するためにalgoを実装しました。しかし、私はマスクとしてこのパスを使用し、パズルを生成するためにパズルの画像をオーバーレイするためにjava/android funcitonalityを使用しています。その機能は、この問題に遭遇する結果、これらの境界を使用します。可能な場合は、境界内でコントロールポイントを移動するのが最も簡単な方法です。回避策はありますか? – pats

+0

ポリラインの曲線を近似します。または、各方向の最も外側の点の曲線を分割して、制御点がもはや外側にならないようにします。あなたが曲線を近似することができれば、その点を見つけることは困難ではないはずです。他のすべてについては、リンクは答えを提供する必要があります。 – Joey

0

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を行いますポイント。それははるかに正確ですが粗いのは遅くなります...

0

ベジェ曲線の1つの特性は、それらを分割するにつれて、滑らかな曲線とCVの間の距離が縮小することです。

これらのCVを上下に修正する方法の1つは、関連するベジェをDe Casteljauアルゴリズムを使用して2つのベジェに分割することです。

あなたも、アルゴリズムこれを行うことができます:

  • はタイトなバウンディングボックスとCVベースのバウンディングボックスを検索します。結局2つのベジェ曲線へ
  • 違いは、あなたの許容範囲よりも大きい場合、最大/最小CVSとその関連ベジェ曲線
  • スプリットを見つけ、関連するベジェ曲線の全ては、各
  • 繰り返し

あなたはあなたの耐性に打ち勝つでしょう。非常に厳しい公差やトリッキーなデータがある場合でも、それまでに多くのベジェがあるかもしれません。

関連する問題