2

これが私が解決しようとしているものです。3 つのポイント (x1、y1)、(x2、y2)、(x3、y3) (2 次元平面内) を含むベジェ曲線があります。私が把握しようとしているのは、クリックポイントがポイント1と2の間にあるか、ポイント2と3の間にあるかに関係なく、ベジェ曲線で4番目のポイントがユーザーによってクリックされたかどうかです。クリックポイントは、線がポイント 1 と 2 またはポイント 2 と 3 の間にある必要があります。

行はコンパイル時にランダムに作成され、任意の (x, y) 位置から開始および終了できます。 曲線の例

線を構成する 3 組の点は、始点、曲線点、および終点です。この 3 点が線の制御点です。次に、制御点から線オブジェクトが作成されます。コントロール ポイントは、プログラムの実行ごとにランダムに作成されるため、スプラインは毎回異なります。

この問題のために従うべき特定のアルゴリズムはありますか。これを JavaScript でコーディングしていますが、C++ や Java のような疑似コードは問題ありません。助けてくれてありがとう。

4

1 に答える 1

1

曲線の LUT (ルックアップ テーブル) を作成して、ユーザーがクリックしたときに、クリックした (x,y) 座標を曲線のt値 (または、もちろん制御変数と呼んだもの) に解決できるようにします。(x,y) 座標に基づいて評価するのではなく (事実上不可能)、4 つの座標すべてをt値に解決すると、非常に簡単になります。

(x1,y1) が t=0、(x2,y2) が何らかの t=T、(x3,y3) が t=1 の場合、ユーザーが曲線のどこかをクリックすると、新しいt値が得られます。その値が T より小さい場合、ポイントはポイント 1 と 2 の間にあり、T より大きい場合、ポイントはポイント 2 と 3 の間にあります。

ルックアップ テーブルの作成は、曲線ごとに 1 回限りの操作である必要があります。最初に曲線を描画するときに実行します。これは、既にt値を (x,y) 座標にマッピングしているためです。そのため、逆のマッピングを作成できます。自由"。描画コードを制御しない場合は、曲線を作成するときに独自に実行する必要があります。

これには 1 つの問題があります。ここで指定した 3 つの曲線上の点で定義された曲線は、ベジエ曲線を定義する通常の方法ではありません。ベジエ曲線の場合、制御点は曲線の「外皮」を定義します。二次曲線 (3 つの点がある) の場合、点 1 と 3 は曲線上にありますが、点 2 はそうではありません。これらの 3 点に基づく真のベジエ曲線 (つまり、これらの 3 点を通る曲線) を見つけるには、3 点を真の曲線に変換するアルゴリズムを実行する必要があります。

(その方法を説明する完全なコードは、この回答の範囲をはるかに超えていますが、ベジエ曲線に関する長い記事で説明し、http://pomax.github.io/bezierinfo/#pointcurvesを形成する3 点に基づく真の曲線)

于 2013-06-09T14:32:50.527 に答える