2

入力として、一連の「ベース」ポイント (たとえば 9 ポイント) があり、出力として、曲線を表す別のポイント セットを返す必要があります。

A1-A9 は入力です。これらは「ベース」ポイントです。私の仕事は、ユーザーが描かれた曲線、A1-A9 からの黒い線を作成できる点のセットを返すことです。

パズルピース

私の数学のスキルは低く、グーグルはあまり役に立ちません。私が理解しているように、これは 3 次スプラインにすることができます。C ベースのソース コードをいくつか見つけましたが、スプライン パーツを作成しようとすると、このコードが無限にループしますnextPoint.x < currentPoint.x

説明してください、どのような種類のスプライン、ベジエ パス、またはその他の構成要素を自分のタスクに使用する必要があるか教えてください。コード、アルゴリズム、またはダミー用の優れたマニュアルを教えていただければ幸いです。

4

3 に答える 3

1

補間方法を使用して、曲線上の中間点を生成します。

たとえば、次の CubicInterpolate 関数があるとします。

double CubicInterpolate(
   double y0,double y1,
   double y2,double y3,
   double mu)
{
   double a0,a1,a2,a3,mu2;

   mu2 = mu*mu;
   a0 = y3 - y2 - y0 + y1;
   a1 = y0 - y1 - a0;
   a2 = y2 - y0;
   a3 = y1;

   return(a0*mu*mu2+a1*mu2+a2*mu+a3);
}

3 次スプラインと 3 次スプラインの中間にある点を見つけるにはpoint[1]point[2]次のようにします。

newPoint.X = CubicInterpolate(point[0].X, point[1].X, point[2].X, point[3].X, 0.5);
newPoint.Y = CubicInterpolate(point[0].Y, point[1].Y, point[2].Y, point[3].Y, 0.5);

point[0]とは、とpoint[3]の間の曲線のセクションに影響を与えます。曲線のいずれかの端で、単純に終点を再度使用します。point[1]point[2]

ポイント間の距離をほぼ等しくするために、入力ポイント間の距離を計算して、mu生成する中間ポイント (および値) の数を決定できます。したがって、さらに離れた点については、 と の間でより多くのmu値を使用します。逆に、互いに非常に接近しているポイントについては、中間ポイントをまったく追加する必要がない場合があります。01

于 2013-05-16T08:56:28.670 に答える
0

MATLAB ライセンスをお持ちの場合は、

x = -4:4;
y = [0 .15 1.12 2.36 2.36 1.46 .49 .06 0];
cs = spline(x,[0 y 0]);
xx = linspace(-4,4,101);
y=ppval(cs,xx);
于 2014-01-23T10:04:04.357 に答える
0

皆さん、ありがとうございました。解決策を見つけました。基本的なポイントで 2D 曲線を作成するために、次のことを行います。C++ および C# の例を含む 3 次スプラインに関するこの
記事 を見つけました。この例では、基点による「1 次元」3 次スプラインの補間値を見つけることができます。2 次元の 3 次スプラインが必要なので、'x' 軸と 'y' 軸に対して 2 つの 1 次元スプラインを作成します。次に、次に、最初のポイントから終点までのサイクルをいくつかのステップで実行し、サイクルの各反復で補間値を見つけました。補間値から、私は指摘しました。そのため、サイクルが終了すると曲線が得られます。

疑似コード (上記の記事のスプライン クラスを使用):

- (array*)splineByBasePoints:(array*)basePoints
{
    int n = basePoints.count;
    cubic_spline xSpline, ySpline;
    xSpline.build_spline(basePoints.pointNumbers, basePoints.XValuesOfPoints, n);
    ySpline.build_spline(basePoints.pointNumbers, basePoints.YValuesOfPoints, n);
    array curve;
    int t = 1; //t - intermediate point. '1' because number of point, not index

    for (; t <= n; t += step)
    {
        [curve addToArray:PontWithXY([xSpline f:t], [ySpline f:t])];
    }
    return array;
}
于 2013-05-19T07:58:15.840 に答える