6

Gimp や Photoshop などのグラフィック編集プログラムを使用すれば、私の言いたいことが理解できるでしょう。これらのプログラムで曲線 (おそらくベジエ曲線) を編集するには、曲線をクリックしてマウスをドラッグすると、それに応じて曲線が変更されます。このメカニズムの背後にあるすべてのものはベクトルに関係していると思われますが、その方法について言及しているドキュメントは見つかりませんでした。どうすればそれができるか教えてもらえますか?どうもありがとうございました。

[編集] 私が意味したのは、曲線自体を選択して変更 (編集) することでした (曲線をクリックし、曲線をドラッグして編集します)。通常の方法で、制御点を選択して曲線を変更します。曲線を変更する必要があることはわかっています。制御点を編集する必要がありますが、曲線上の変更を制御点の変更に変換するにはどうすればよいですか?

4

6 に答える 6

3

どのように動作させたいかによって、表示されているものを実現する方法はいくつかあります。ポイント オン カーブ操作を介してベジエ カーブを変更する簡単な方法をいくつか説明します。

最初に行うことは、ユーザーが曲線上でクリックしたパラメーター値 (t) を把握することです。これは概して概算になります。ベジエのピクセルまたはサブピクセル レンダリングを行っている場合は、ピクセルごとに t 値を記録し、それを使用します。線分にテッセレーションしている場合は、どの線分が最も近いかを確認し、2 つの端点の t 値を見つけて、線に沿った距離に従って t 値を lerp します。

t 値を取得したら、それをベジエ曲線の方程式に差し込むことができます。最終的には次のような形式になります。

P = k0*P0 + k1*P1 + k2*P2 + k3*P3

ここで、P は曲線上の点、P0、P1、P2、および P3 は入力制御点、k0、k1、k2、および k3 は特定の t に対する定数です。k 値を「寄与」と呼びます。より具体的には、曲線 P(t) 上の点に対する制御点の寄与と呼びます。覚えておくと便利なプロパティは、k0+k1+k2+k3 = 1 です。

したがって、ベクトル V = P' - P があるとします。ここで、P' は新しい位置で、P は元の位置です。P' を必要な場所に移動するには、いくつかのコントロール ポイントを移動する必要がありますが、どのコントロール ポイントを移動するかについてはある程度の柔軟性があります。寄与度がゼロでない任意のポイント、またはいくつかの組み合わせを使用できます。

ユーザーが t=0 で曲線をクリックしたとします。この場合、k0 だけが非ゼロなので、

P0 := P0 + V

正しい結果が得られます。これは、次のようにも記述できます。

P0 := P0 + k0 * V

すべての寄与が非ゼロである一般的なケースでは、同じ変換を各ポイントに適用できます。これにより、非常に滑らかで広がりのある変形の効果が得られます。

もう 1 つのオプションは、距離全体で最大の貢献度を持つコントロール ポイントを単純に移動することです。使用する方程式は次のようなものになると思います

Pmax := Pmax + 1/kmax * V

いずれにせよ、特定の t 値での寄与を調べ、コントロール ポイントを移動して、新しいポイントが目的の場所に配置されるように要約します。

このアプローチはかなり一般的で、NURBS やその他のほとんどのスプライン、さらにはサーフェスで機能します。Greville Abscissae を使用するかなり一般的な別の方法があります。これは、できるだけ多くのポイントを固定しますが、私の経験では、振動が発生しやすいです。

于 2010-02-24T21:08:53.080 に答える
1

編集 - あなたの質問の編集に応じて

曲線自体を選択して制御点を移動できるようにするために、ベジエ曲線は絶対に先に進むべきではないことをお勧めします。正しい制御点の位置を見つけるには、方程式を逆に解く必要があります。また、場合によっては、コントロール ポイントを移動して曲線を目的の場所に移動することが実際には不可能であることがわかります。

B スプラインを使用している場合は、ユーザーがクリックした場所に最も近いカーブ上のポイントに新しいコントロール ポイントを挿入し、新しいコントロール ポイントを移動するだけです。したがって、事実上、新しいコントロール ポイントを追加することになります。

原文

一連の制御点 (通常はベジェの場合は 3 つですが、必要なだけ多くすることができます) を指定すると、ディスプレイ デバイス (通常は0 >= u <= 1パラメトリック方程式を使用)、これは簡単です。

制御点は曲線の行き先を決定するため、選択フィードバックを実装し、それらの制御点にドラッグ アンド ドロップするだけで済みます。

ただし、正確なポイント マッチングを探している場合、ベジェ カーブは最初と最後のコントロール ポイントのみを通過するため、理想的ではありません。また、曲線にポイントを追加するほど、精度が低下します。

B-スプラインの方が良いでしょう。これらのバリエーションは、Photoshop などで実際に見られるものです。

于 2010-02-23T09:09:10.550 に答える
0

では、プリミティブとして含まれるレンダリング ライブラリを使用しているため、ベジエ曲線を使用する必要があると仮定しましょう。曲線自体に制御点を使用するという考えに完全に同意している場合は、ここで概説されている方法を使用して制御点を補間することができます: How to find control points for a BezierSegment given Start, End, and 2 Intersection Pts in C# -別名 3 次ベジエ 4 ポイント補間

つまり、曲線上の 4 つのポイントのセットごとに上記のアルゴリズムを実行し、3 次ベジエを描画するために必要な 4 つのコントロール ポイントを取得します。

于 2010-02-23T09:39:07.377 に答える
0

オブジェクト モデルについては、github.com/bootchk/freehandTool を参照してください。

ユーザーがドラッグします。最も近いコントロール ポイントまたはコントロール ポイント間のアームにドラッグを投影します。ドラッグを、最も近い制御点の回転または平行移動 (変換) として解釈します。複数形に注意: 最も近いのは、2 つのセグメントの一致する制御点 (端) であるか、ベジエ セグメントの腕の制御点である可能性があります。

于 2012-05-25T09:00:17.683 に答える
0

ドラッグすると、ベジエ曲線の制御点が変更されるだけで、それに応じて曲線が再計算されます。それらがどのように機能するかについての適切な説明については、ウィキペディアを参照してください。

于 2010-02-23T09:08:11.830 に答える
0

やりたいことを明確にしてください。アプリケーションでベジエ曲線を編集しますか? その背後にある一般的な数学に興味がありますか?

通常は、ベジェ カーブの生成に使用されるコントロール ポイントを操作します。

于 2010-02-23T09:08:19.513 に答える