3

私の iOS アプリでは、連続する 2 つの点を結ぶベジェ曲線ごとに 1 番目と 2 番目の制御点のセットを計算するアルゴリズムを使用して、一連の 2D ポイントを通るベジェ スプラインを描画します。アルゴリズムは見事に機能しますが、私の問題は、この曲線を X 軸と Y 軸のグラフに表示していることです。

点または軸上にいくつかの点があり、残りの点が内側にある場合は常に、曲線が U ターンして軸を超え、点と内側の点の両方を通過して 2 つに戻っているように見えます。

アルゴリズムの観点からは、何も問題はありません。このような場合の制御点は、座標軸の外側に生成されます。

ポイントを通過して、それらのいくつかが軸上にあるかどうかを確認し、曲線が曲線の外側に出るのではなく、軸上の両方の点を直線として通過するように制御点を変更する方法はありますか?座標軸。

4

1 に答える 1

5

画面外に出る曲線を検出する

ベジェ曲線は、実際には単なる多項式です。曲線のさまざまな次数に対応して、複数のタイプのベジェ曲線があります。

したがって、生成された方程式(1つは、、xもう1つはyを取り、根(0を通過する点)を見つけます。根が存在する場合、曲線は軸を通過します。

たとえば、2次(次数= 2)ベジェ曲線の場合、3つの点(x 0、y 0)、(x 1、y 1)、(x 2、y 2)が与えられると、方程式は次のようになります。

x(t)=(x 0-2x 1 + x 2)t 2-2(x 0 + x 1)t + x 0 y 
(t)=(y 0-2y 1 + y 2)t 2-2( y 0 + y 1)t + y 0
0 <= t <= 1

この時点で、2次方程式を使用してを解きt、解が存在しないか、[0,1]forのドメイン外にあることを確認できますtただし、複雑な3次方程式に触れることなく、3次ベジェ曲線を一般化する別の方法があります。極値点を確認するだけです。これらは、導関数=0のポイントです。導関数は

x'(t)= 2(x 0-2x 1 + x 2)t-2(x 0 + x 1
y'(t)= 2(y 0-2y 1 + y 2)t-2(y 0 + y 1

これは、極値が

t極値-x =(x 0 + x 1)/(x 0-2x 1 + x 2)
t極値-y =(y 0 + y 1)/(y 0-2y 1 + y 2

したがって、x(t extrema-x)> 0およびy(t extrema-y)> 0 あることを確認してください(端点x0およびx2画面上にあることがわかっていることを前提としています) 。三次ベジェ曲線の場合も同じことを行いますが、二次方程式を使用して極値を解きます(それぞれに2つの極値がxありy、その場合)


カーブが画面外に出るのを防ぎます

上記の方程式をtextrema-xについて取り、それをx(t)に差し込むことによって、x(t extrema-x)> 0を解くと、少し代数の後で、x軸と交差しないようにすることがわかります。必要

-4x 0 x 1 + x 0 x 2 -x 1 2 > 0 if(x 0 + x 2)> 2x 1 
-4x 0 x 1 + x 0 x 2 -x 1 2 <0 if(x 0 + x 2)<2x 1

((x 0 + x 2 = 2x 1の場合、 x0からx2まで直線的に移動しているため、両方が正であると仮定すると、x軸を横切ることはできません)

これらの方程式を少し見つめると、(x 0 + x 2)> 2x 1の場合、左側の条件が満たされるまでx1を単純に減らすことができることがわかります。(x 0 + x 2)<2x 1の場合、条件が満たされるまでx1を増やすことができますの方程式yは類似しています。


これは、曲線が画面の左(x=0と上y=0の部分から外れるのを防ぐ方法を示しています-右x=screen_widthと下y=screen_heightはどうですか?

これは、画面を鏡像に反転していることを想像することで簡単に行うことができます。つまり、右側がx=0で、左側がですx=screen_width。これは、上記のすべての方程式でのすべてのインスタンスをに置き換え、条件を確認するxことで実行できます。(screen_width-x)次に、たとえば、前に最初のケースでx 1を減らした場合、この場合は(screen_width-x 1)を減らしますこれは、x1を増やすのと同じです。同じロジックが。に置き換える場合にも当てはまります。y(screen_height-y)

于 2012-04-03T12:32:32.323 に答える