3

この質問に対して約 1000 の回答を見つけましたが、曲線で 4 つの制御点を使用しているため、使用できる回答はありません。

そうは言っても、私はここでこの男に出くわしました:

double BezierArcLength(point2d p1, point2d p2, point2d p3, point2d p4)
{
    point2d k1, k2, k3, k4;

    k1 = -p1 + 3*(p2 - p3) + p4;
    k2 = 3*(p1 + p3) - 6*p2;
    k3 = 3*(p2 - p1);
    k4 = p1;

    q1 = 9.0*(sqr(k1.x) + sqr(k1.y));
    q2 = 12.0*(k1.x*k2.x + k1.y*k2.y);
    q3 = 3.0*(k1.x*k3.x + k1.y*k3.y) + 4.0*(sqr(k2.x) + sqr(k2.y));
    q4 = 4.0*(k2.x*k3.x + k2.y*k3.y);
    q5 = sqr(k3.x) + sqr(k3.y);

    double result = Simpson(balf, 0, 1, 1024, 0.001);
    return result;
}

それは完璧な解決策のように見えますが、その最初の部分は私を完全に混乱させます:

k1 = -p1 + 3*(p2 - p3) + p4;
k2 = 3*(p1 + p3) - 6*p2;
k3 = 3*(p2 - p1);
k4 = p1;

2 次元オブジェクトに対して加算、減算、乗算などの操作を行うにはどうすればよいでしょうか (point2d は のようなオブジェクト構造であると思います{x: 0, y: 0})。私はばかげているように感じますが、これが私がこの怪物を実際に実装するのを妨げている唯一の理由です.

FWIW、私はこの方程式を使用して、ゲームでカーブを通過するときのエンティティの速度を正規化しています。これを完全に行うためのより良い方法を知っているなら、私はすべて耳にします。

4

2 に答える 2

1

2 次元オブジェクト、つまり Point2D は単なるベクトルであり、ベクトル演算は数学で明確に定義されています。例えば:

          k*(x,y) = (k*x, k*y)
           -(x,y) = (-1)*(x,y)
(x1,y1) + (x2,y2) = (x1+x2, y1+y2)

k1これらは、 、k2k3、およびを計算するために必要なすべての式です。k4

于 2013-06-14T02:59:38.783 に答える