x 軸に 0 から 1 の間、y 軸に 0 から 1 の間の正規化された値を持つ単純な 2D 行列があり、この行列に 3 つの点があるとします。たとえば、P1 (x=0.2,y=0.9)、P2 (x=0.5,y=0.1) と P3 (x=0.9,y=0.4)。
このポイントを通る曲線を簡単に計算するにはどうすればよいですか。つまり、任意の x の y を与える関数を持つことを意味します。
3 点を通る曲線はいくつでも可能です。しかし、私の言いたいことはわかります。オーディオ サンプルの補間に使用でき、ボリューム フェード カーブの計算に使用でき、ゲームでのモンスターの歩行経路の計算に使用できる滑らかな曲線が必要です。
今、私はこの質問を約3日間ネットで検索しましたが、このタスクに使用できる解決策がないとは信じられません. Catmull-rom-Splines、ベジエ曲線、およびそのすべての理論的なものを扱っているすべてのテキストには、少なくとも 1 つのポイントがあり、それが私にとっては使用できないものになっています。たとえば、Catmull-Rom-splines では、コントロール ポイント間に一定の距離が必要です (このコードを使用して、4. ポイント y を 3. ポイント y に設定します)。
void CatmullRomSpline(float *x,float *y,float x1,float y1,float x2,float y2,float x3,float y3,float x4,float y4,float u)
{
//x,y are calculated for x1,y1,x2,y2,x3,y3 and x4,y4 if u is the normalized distance (0-1) in relation to the distance between x2 and x3 for my whiched point
float u3,u2,f1,f2,f3,f4;
u3=u*u*u;
u2=u*u;
f1=-0.5f * u3 + u2 -0.5f *u;
f2= 1.5f * u3 -2.5f * u2+1.0f;
f3=-1.5f * u3 +2.0f * u2+0.5f*u;
f4=0.5f*u3-0.5f*u2;
*x=x1*f1+x2*f2+x3*f3+x4*f4;
*y=y1*f1+y2*f2+y3*f3+y4*f4;
}
しかし、x1 から x4 が y の計算に影響を与えているとは思えないので、x1 から x4 までの距離は同じでなければならないと思いますか?
...
または、ベジエコードはポイントを通る曲線を計算しません。ポイント (少なくとも 2. ポイント) は、線に力の効果しかないように見えます。
typedef struct Point2D
{
double x;
double y;
} Point2D;
class bezier
{
std::vector<Point2D> points;
bezier();
void PushPoint2D( Point2D point );
Point2D GetPoint( double time );
~bezier();
};
void bezier::PushPoint2D(Point2D point)
{
points.push_back(point);
}
Point2D bezier::GetPoint( double x )
{
int i;
Point2D p;
p.x=0;
p.y=0;
if( points.size() == 1 ) return points[0];
if( points.size() == 0 ) return p;
bezier b;
for (i=0;i<(int)points.size()-1;i++)
{
p.x = ( points[i+1].x - points[i].x ) * x + points[i].x;
p.y = ( points[i+1].y - points[i].y ) * x + points[i].y;
if (points.size()<=2) return p;
b.PushPoint2D(p);
}
return b.GetPoint(x);
}
double GetLogicalYAtX(double x)
{
bezier bz;
Point2D p;
p.x=0.2;
p.y=0.9;
bz.PushPoint2D(p);
p.x=0.5;
p.y=0.1;
bz.PushPoint2D(p);
p.x=0.9;
p.y=0.4;
bz.PushPoint2D(p);
p=bz.GetPoint(x);
return p.y;
}
これは何もないよりはましですが、1. 非常に遅く (再帰的)、2. 前述のように 2. ポイントを通る線を実際には計算しません。
私を助けることができる数学的頭脳は外にありますか?