点が長方形の周りを移動するような豪華なアニメーションを作りたいのですが。一度にポイントの位置を見つけたいt
。
長方形は次式で与えられX
、Y
、Width
およびHeight
。
これのアルゴリズムはありますか?
sin
/ cos
をサークルに使用しました。長方形の同等のアプローチは何ですか?
点が長方形の周りを移動するような豪華なアニメーションを作りたいのですが。一度にポイントの位置を見つけたいt
。
長方形は次式で与えられX
、Y
、Width
およびHeight
。
これのアルゴリズムはありますか?
sin
/ cos
をサークルに使用しました。長方形の同等のアプローチは何ですか?
回答:
私はあなたのtが0から1に行くと仮定します。(そうでない場合は、乗算して適切にスケーリングします。)
それぞれの辺が外周のどの割合(0 – 1)であるかを調べます。(一辺の長さ/全周)
時間tですべての辺がどの程度「満たされている」かを見つけるには、辺を繰り返し、tが負の値になるまでそれらの比率を減算します。最後のエッジ(tが負になる)は、(サイドの長さ+残り)/サイドの長さの比率で埋められます。残りは埋められません。
tでの正確なベクトル位置を取得するには、各辺のベクトルに、塗りつぶされているその辺の比率を掛けて、それらを追加します。
これは実際にはどのポリゴンでも機能します!
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)
0
andの代わりに、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)
これの実際のアルゴリズムがあるかどうかはわかりませんが、自分で作成しました(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;
}
x
とy
変数を変換して、アニメーションを必要な大きさ(乗算)と必要な場所(xとyに加算/減算)で大きくまたは小さくします。
私はこのコードをテストしていませんが、動作するはずです。これは、任意の数のポイントを持つ任意のポリゴンでも機能するはずです(コードのビットを使用してポリゴンを生成することもできます)。
与えられた:
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.x
とP.y
のdistT1