0

質問

さて、基本的に私がやろうとしていることは、X位置が与えられたときに3次曲線/ベジエ曲線/スプラインのY位置を計算することです.

Stack Overflow と Google であらゆる場所を検索したところ、実際に機能するものはすべて見つかりました。

カーブポイント

x1 = 50d;
y1 = 400d / 2d + 100d;

x2 = 400d;
y2 = 400d / 2d + 100d;

x3 = 600d - 400d;
y3 = 400d / 2d - 100d;

x4 = 600d - 50d;
y4 = 400d / 2d - 100d;

「600 - 400」を計算し、「200」とだけ書かない理由は、私のコードでは「600」が実際には 3 次曲線がレンダリングされるウィンドウの幅だからです。 -私のコードでは400 "。

したがって、次のコードは、T が指定されたときに 3 次曲線の X と Y を計算できます。

t = 0.5d;

cx = 3d * (x2 - x1);
cy = 3d * (y2 - y1);

bx = 3d * (x3 - x2) - cx;
by = 3d * (y3 - y2) - cy;

ax = x4 - x1 - cx - bx;
ay = y4 - y1 - cy - by;

point_x = ax * (t * t * t) + bx * (t * t) + cx * t + x1;
point_y = ay * (t * t * t) + by * (t * t) + cy * t + y1;

繰り返しますが、私が計算しようとしているのは、X 位置がわかっている場合の曲線の Y 位置です。しかし、私が計算できるのは、T が指定されたときの曲線上の X と Y の位置だけです。

これは私の最初の投稿なので、何かが 100% 正しく書かれていない場合は、申し訳ありません!

4

2 に答える 2

1

3 次曲線は 'x' 値に対して複数の 'y' 値を持つことができるため、3 次曲線を回転させて x/y 軸に整列させた後、ルート検索を実行する必要があります。http://pomax.github.io/bezierinfo/#intersectionsはこの概念をカバーしていますが、アイデアは次のとおりです。

  1. 点 {p1,p2,p3,p4} で定義された曲線を取り、点 {p​​5,p6} で定義された x=X で線を取ります (ここで、p5 は何らかの座標 (x,...) であり、p6 は別の座標(x,...). 重要な部分は、それが垂直線であるため、両方の点が同じx値を持つことです)。

  2. 3 次曲線と線を一緒に移動および回転して、線が新しい高さy = 0 で水平になるようにします。

  3. 曲線のy関数で立方根検索を実行できるようになりました。これにより、0、1、2、または 3 つの異なるt値が生成される場合があります。

  4. これらのt値のそれぞれについて: 通常の回転していない曲線で、そのt値を指定して (x,y) 座標を計算します。これで、指定されたxのすべてのy値が得られます(すべてのポイントも同じx値になります)。

リンクされた記事で、3 次曲線/直線の例のソースを見てください。また、回転/根探索がどのように機能するかを確認するには、BezierCurve align(Point start, Point end) {...およびfloat[] findAllRoots(int derivative, float[] values) {...関数を参照してください。(特に、回転後は y 関数の根を見つけるだけであることに注意してください! x 関数は、私たちがやりたいこととは無関係になっています)

于 2013-06-10T22:42:36.280 に答える