長方形の周りをどのように補間しますか?


11

点が長方形の周りを移動するような豪華なアニメーションを作りたいのですが。一度にポイントの位置を見つけたいt

長方形は次式で与えられXYWidthおよびHeight

周りに時計回りのパスがある長方形

これのアルゴリズムはありますか?

sin/ cosをサークルに使用しました。長方形の同等のアプローチは何ですか?


1
完全な答えではないため、コメント。四角形ではなく四角形がない場合、この買いを1/4に分割できるとは思いません。しかし、あなたが行うことができます、あなたが知っていれば、それは周りに行くために取るべき最大時間は次のとおりです。計算円周Sと、あなたの速度vを計算する式S / V =を使用しています。
M0rgenstern

回答:


15

私はあなたのt0から1に行くと仮定します。(そうでない場合は、乗算して適切にスケーリングします。)

長方形補間

それぞれの辺が外周のどの割合(01)であるかを調べます。(一辺の長さ/全周

時間tですべての辺がどの程度「満たされている」かを見つけるには、辺を繰り返し、tが負の値になるまでそれらの比率を減算します。最後のエッジ(tが負になる)は、(サイドの長さ+残り)/サイドの長さの比率で埋められます。残りは埋められません。

tでの正確なベクトル位置を取得するには、各辺のベクトルに、塗りつぶされているその辺の比率を掛けて、それらを追加します。

これは実際にはどのポリゴンでも機能します!

任意のポリゴン補間


2

tのサインとコサインはそれぞれ、x軸と角度tを形成する円上の点のy座標とx座標です。長方形でそれをする必要はありません!長方形は4本の線でできています。tから0に行く場合、次の行で1ポイント(px,py)at t==0およびtoに到達します。(qx,qy)t==1

(l(x),l(y)) = (t*qx + (1-t)*px, t*qy + (1-t)*py)

0andの代わりに、1時間がからt0に変わった場合は、t1最初に時間を正規化してから、上記の式を適用できます。

(l(x),l(y)) = (  ((t-t0)/(t1-t0))*qx + ((t1-t)/(t1-t0))*px, ((t-t0)/(t1-t0))*qy + ((t1-t)/(t1-t0))*py  )

ここで、四角形の場合、4つのケースで分割しif、各エッジのforが1つの期間をカバーし、線の動きを適用します。

長方形が軸に揃っている場合は、常に一定のx値またはy値のいずれかになることに注意してください。例えば、間のtについて0、およびa/4、(および想定(X、Y)が左下です)

(l(x),l(y)) = ((4*t/a)*(X+Width) + (1-4*t/a)*(X), Y+Height)

これは次と同じです:

(l(x),l(y)) = (X + (1-4*t/a)*(Width), Y+Height)

1

これの実際のアルゴリズムがあるかどうかはわかりませんが、自分で作成しました(Java)。

int points = 4; // for a rectangle
double progress = 0.0; // 0.0 -> 1.0 (with 1.0 being 100%)
double pp = points * progress; // This calculation would otherwise be done multiple times

int p1 = Math.floor(pp);
int p2 = Math.ceil(pp);

while (p1 >= points) p1 -= points;
while (p2 >= points) p2 -= points;

double tmp = 2 * Math.PI / points;

int p1x = Math.cos(tmp * p1);
int p1y = Math.sin(tmp * p1);
int p2x = Math.cos(tmp * p2);
int p2y = Math.sin(tmp * p2);

double p = pp - Math.floor(pp);

int x = (1.0 - p) * p1x + p * p2x; // between -1.0 and 1.0
int y = (1.0 - p) * p2x + p * p2y; // between -1.0 and 1.0

if (p == 0.0) { // prevent a weird glitch when p = 0.0 (I think this is a glitch)
    x = p1x;
    y = p1y;
}

xy変数を変換して、アニメーションを必要な大きさ(乗算)と必要な場所(xとyに加算/減算)で大きくまたは小さくします。

私はこのコードをテストしていませんが、動作するはずです。これは、任意の数のポイントを持つ任意のポリゴンでも機能するはずです(コードのビットを使用してポリゴンを生成することもできます)。


1

与えられた:

a=total time

perimeter = WIDTH *2 + HEIGTH * 2;

周囲T1に乗る方法を与えられた時間を考えてくださいP(0,0の位置が正しいと仮定)?

T1=T1%a; //use mod to have T1<a

distT1 = (T1*Perimeter)/a; //distance traveled in time T1

今(あなたが私を惜しまを願って)いくつかの簡単な主要scool幾何学と数学を取得するP.xP.ydistT1

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.