2011-01-29 35 views
2

私は解決策を見つけるために似たような話題を読んだが、成功しなかった。 私がやっていることは、 "ペンツール"という名前のCorelDrawで見つけられるものと同じツールを作ることです。私はベジェ曲線を接続することでそれを行いましたが、その形状を編集するためにカーブ(コントロールポイントではない)をドラッグするという1つの機能がまだありません。3点を通るベジェ曲線

私は、ドラッグを開始する必要があるカーブの "t"パラメータを正しく決定できますが、そのカーブのコントロールポイントを再計算する方法はわかりません。

ここでは、制約として使用できるCorelDrawのPenToolの動作に関連するいくつかの項目を強調したいと思います。カーブを厳密に垂直または水平にドラッグすると、そのベジェ曲線の制御点がそれに応じて動作する、すなわち、それらが垂直または水平にそれぞれ移動することに気づいた。

カーブのドラッグ中にコントロールポイントの位置を再計算するにはどうすればよいですか?

+0

CorelDrawの動作について誰もが知らされていることを前提としています。 –

+0

質問に関連するCorelDrawのPenToolの動作の説明でかなり明確になっていると思いました。ただし、PenToolがCorelDrawに属していることは無視できます。言及された動作に焦点を合わせるだけ – Rasa

+0

私にとっては十分に明確ではありません。ベジェがそのコントロールポイントを介して定義されている場合、コントロールポイントを変更することでベジェを操作する必要があります。別の種類のドラッグを説明していますが、ドラッグしているものが明確ではありません。曲線は方程式であり、そのparmsのみがtであり、ctrlは点である。 –

答えて

2

アイブ氏のため申し訳ありませんが、単にInkspace源に見て、このようなコードを発見し、それはあなたを助けることがあります

// Magic Bezier Drag Equations follow! 
// "weight" describes how the influence of the drag should be distributed 
// among the handles; 0 = front handle only, 1 = back handle only. 
double weight, t = _t; 
if (t <= 1.0/6.0) weight = 0; 
else if (t <= 0.5) weight = (pow((6 * t - 1)/2.0, 3))/2; 
else if (t <= 5.0/6.0) weight = (1 - pow((6 * (1-t) - 1)/2.0, 3))/2 + 0.5; 
else weight = 1; 

Geom::Point delta = new_pos - position(); 
Geom::Point offset0 = ((1-weight)/(3*t*(1-t)*(1-t))) * delta; 
Geom::Point offset1 = (weight/(3*t*t*(1-t))) * delta; 

first->front()->move(first->front()->position() + offset0); 
second->back()->move(second->back()->position() + offset1); 

あなたの場合には、「初段>フロント()」および「第2 - > back() "は2つのコントロールポイントを意味します

+0

ありがとうございました!私はこの手順をJavaで実装していましたが、すぐに機能しました。 CorelDrawで動作しているかどうかは分かりませんが、現時点では似ています。後でそのテストをテストします。あなたの助けをもう一度ありがとう。 – Rasa

0

カーブをクリックすると、現在のコントロールポイントの位置がわかります。したがって、その点からマウスの位置までのオフセットXとオフセットYを計算することができます。マウスを動かすと、X/Yオフセットの助けを借りて新しいコントロールポイントを再計算することができます。

私の英語

+0

コントロールポイントの位置を再計算すると、マウスポインタが曲線上に残りません。マウスポインタはドラッグしながら曲線から離れることはできません。 – Rasa

+0

私はそれが正しいと思います。私のシナリオでは、あなたはカーブではなくコントロールポイント(オフセットの助けを借りて)を動かすでしょう、そして、二重処方の使用の場合、それはexellentの結果を与えるでしょう。もちろん、マウスポインタを治療法に直接置くことは非常に難しいです(私はあなたが1px幅の曲線を持っていると考えています)。そしてほとんどの場合、マウスは治癒には直接ならないので、すべてOKです! :-) –

+0

2つのコントロールポイントがあります。あなたのアドバイスは、t = 0.5の場合にのみOKですが、他の値についてはOKではありません。 – Rasa

2

ベジェ曲線は2つ以上の多項式、つまりX(t), Y(t)です。

立方1

:あなたは曲線を持っている場合

x = ax*t^3 + bx*t^2 + cx*t + dx 
           0 <= t <= 1 
y = ay*t^3 + by*t^2 + cy*t + dy 

だから - あなたはポリ係数を有します。あなたがポイントを移動し、それがtパラメータであることを知っていれば、ポリの係数を単純に再計算することができます。係数のための6つの線形方程式のシステムになります(それぞれの点について)。システムは2つのシステム(xとy)ごとに細分され、正確に、またはいくつかの数値的方法を使って解決することができます。

あなたの仕事は、あなたの曲線の明示的な方程式を知っているときに、あなたの曲線のコントロールポイントを計算することです。

また、線形システムにすることもできます。私は一般化されたベジェ曲線のためにそれを行う方法はわかりませんが、3次曲線または2次曲線には難しくありません。コントロールポイントを経由して

三次曲線:あなたがしなければならない

B(t) = (1-t)^3*P0 + 3(1-t)^2*t*P1 + 3(1-t)*t^2*P2 + t^3*P3 

すべてが標準多項式の形を生成するために(ちょうど括弧を開く)との係数を同一視することです。それはコントロールポイントのための最終的なシステムを提供するでしょう!

+0

あなたが正しいかどうかはわかりません。あなたは、私はP0、P3、tとP(tに対応する三次曲線上の点)を持っていることが分かります。これらのデータは私に三次曲線のファミリーを与えます。余分な制約が含まれていない限り、単一の解決策はありません。 – Rasa

+0

はい、あなたは正しいです。余分な条件として、このようなものを使うことができます。カーブ上で余分なポイントを取ると、それも移動されます。例えば、ユーザが撮影した時点でt <0.5であれば、t1 = t/2でポイントを取得し、ユーザのポイントの半分の速度でポイントを移動することができます。 t> 0.5の場合、t1 = t + 0.5 *(1-t)。 – Andrew

+0

私はそれを念頭に置いていましたが、別のポイントの正確な位置を決定する必要があるため、問題は解決しません。そのt位だけでは不十分です。ですから、Inkscapeの提案された解決策は十分です。私はそれを試した。 – Rasa

関連する問題