4

ボールが壁に当たるたびに跳ねる角度を変えたいです。

どれだけ壁の真ん中あたりに当たるかで変わる…

現在、サーフェスに当たったときの X と Y の変化をハードコーディングしています...私の目標は、現在の X と Y から度数を取得し、度数に変更を適用することです (現在、ランダムな次に、X と Y の新しい増分値を計算します。newX と newY を取得する方法は知っていますが、増分値を取得する方法はわかりません。

緑色は の開始x yです(5,5)。青色は の次のフレームです(4,4)

ここに画像の説明を入力

  • それで、それに基づいて度数を計算し45ました。
  • 次に、度数に乱数を追加しました。
  • 次に、新しい x 座標と y 座標を取得します。だから私はこの方法に従った...

currX(5) - wallX(0) = distX(5)

currY(5) - wallY(0) = distY(5)

角度 + ランダム増分のコサインを取ると、55 度となります。* distX

cos(55 degrees) = .5735....5735 x distX (5) = 2.86

そして私の角度の罪 * distY

sin(55 degrees) = .8191....8191 x distY (5) = 4.09

newX = cos result (2.86) + originX (5) = 7.86

newY = sin result (4.09) + originY (5) = 9.09

newX, newY = (7.86, 9.09)

よし…新しい座標ができた…

しかし、それらは私の新しい増分値と同じではなくxy入射角に基づいている必要があります。

コード スニペット:インクリメントをハード コーディングしていることがわかりx,yます (dragger.x += 2; )

        function tick() {
            var rand = Math.floor((Math.random()*10)+1);

            console.log("ticking..." + rand);
            if (dragger.x >= 400-20) {
                dragger.xDir = "right";         
            }
            if (dragger.x < 20) {
                dragger.xDir = "left";      
            }       
            if (dragger.y >= 150-20) {
                dragger.yDir = "up";
            }
            if (dragger.y < 20) {
                dragger.yDir = "down";
            }

            var oldX = dragger.y;
            var oldY = dragger.x;

            if (dragger.xDir == "left") {
                dragger.x += 2; 
            }
            else {
                dragger.x -= 2;
            }
            if (dragger.yDir == "up") {
                dragger.y -= 2;
            }
            else {
                dragger.y += 2;
            }
            //post update...
            var newX = dragger.y;
            var newY = dragger.x;                   

            var angle = getAngle(newX, oldX, newY, oldY)
            angle+=rand;

            $('#getAngle').empty();
            $('#getAngle').append("bounce angle (degrees): " + angle);


            //console.log(xDir);
            // update the stage:
            stage.update();
        }

        function getAngle(x2, x1, y2, y1) {             
            var deltaX = Math.abs(x2-x1);
            var deltaY = Math.abs(y2-y1);
            var radians = Math.atan2(deltaX, deltaY);
            var degrees = radians * (180/Math.PI);
            return degrees;
        }
4

3 に答える 3

1

私達はことを知っています

distance = average velocity x time //if acceleration is constant

したがって

time = distance / average velocity

この知識を 2 次元フィールド (距離) に適用するには、次の 2 つのことを行う必要があります。

  • ピタゴラスの定理を適用して新しい座標までの距離を見つける
  • 「新しい」速度を計算する

ピタゴラスの定理を適用する前に、移動の方向を知る必要があります。

ここに画像の説明を入力

新しい座標までの距離を見つけるために、ピタゴラスの定理を適用します。

疑似コード

//Change in coordinates
dx = Math.abs(newX - oldX);
dy = Math.abs(newY - oldY);

//Distance to travel
distance = Math.sqrt( Math.pow(dx, 2) + Math.pow(dy,2) );

//Units per increase
// time = distance / average velocity

velocity = ?;
time = distance / velocity;

//Now to find x+= .. and y+= .. we apply our knowledge of direction
//Together with our knowledge of the time it takes

case north east:        x += (dx / time);           y += (dy / time);

case south east:        x += (dx / time);           y -= (dy / time);

case north west:        x -= (dx / time);           y -= (dy / time);

case south west:        x -= (dx / time);           y += (dy / time);

xここで、 と が移動するボールの座標をy表していることに注意してください。これは、新しい座標に到達するために必要な回数をx += ..繰り返さy += ..なければならないことを意味します。time

したがって、次のようなことができます。

for (int i = 0; i < time; i ++)
{
    switch (direction)
    {
           case "north east":  x += (dx / time);  y += (dy / time); break;

           case "south east":  x += (dx / time);  y -= (dy / time); break;

           case "north west":  x -= (dx / time);  y -= (dy / time); break;

           case "south west":  x -= (dx / time);  y += (dy / time); break;
    }
}

また、velocity = ?まだ指定されていないことに注意してください。速度を一定 (摩擦 = 0) にするか、何らかのモデルを実装して摩擦を模倣することができます。

これがあなたの質問に答えることを願っています。

PS。この回答は、実際には他の回答の派生物であり、他の回答で方向とピクセル距離を既に指定しているため、実際x += ..y += ..は非常に小さく/簡単です。

于 2013-07-29T15:26:44.770 に答える