0

ボールの速度が一定で、4 つの垂直な壁の間でボールが跳ねるアニメーションを実装しようとしています。問題は、私が使用しているフレームワークでは、ボールが壁に衝突するたびにボールの出発地と目的地を伝える必要があることです。

衝突の瞬間、ボールが壁に接触した現在および以前の位置の両方にアクセスできます。壁の座標 x_min、x_max、y_min、y_max、およびボールのこれら 2 つの位置が与えられた場合、ボールの次の位置を計算する最も簡単な方法は何ですか?

私が考えたすべてのアルゴリズムは、多くの if-else ステートメントを使用した、一種のブルート フォース アプローチに従いました...これを処理するエレガントな方法があるかどうか疑問に思います。

4

3 に答える 3

1

これがあなたの考えに似ているかどうかはわかりませんが、私の考えは、基本的に壁がないかのように位置を計算し、壁を中心点として該当する座標を反転させることです。

したがって、最初に次のように計算します。

new
 \
  \
   \
---------
     \
      \
      old

次に、次のように翻訳します。

---------
   / \
  /   \
 /    old
new

擬似コード:

newX = oldX + xInc
newY = oldY + yInc

if newX < 0
  newX = -newX

if newY < 0
  newY = -newY

if newX > maxX
  newX = maxX - (newX - maxX)
  // or 2*maxX - newX

if newY > maxY
  newY = maxY - (newY - maxY)
  // or 2*maxY - newY
于 2013-10-20T02:26:27.017 に答える
1

前の跳ね返りが位置 (x_min, y_prev) で左の壁から外れ、現在の跳ね返りが (x_curr, y_max) で上の壁から外れたとします。次の跳ね返りは、(x_max, y_next) で右の壁から離れている必要があります。

y_next = y_max - (y_max - y_prev) * (x_max - x_curr) / (x_curr - x_min)

(前のバウンス、左上隅、現在のバウンス) によって定義される三角形が三角形 (現在のバウンス、右上隅、次のバウンス) に似ている (形状は同じだがサイズが異なる) という単純なジオメトリです。このような:

+--*----+
| / \   |
|/   \  |
*     \ |
|      \|
|       *
|       |
+-------+

y_next が y_min より小さい場合、ボールは右の壁より先に下の壁に当たることを意味します。これは (x_next, y_min) で発生します。

x_next = x_curr + (x_curr - x_min) * (y_max - y_min) / (y_max - y_prev)

このようなもの:

+--*------+
| / \     |
|/   \    |
*     \   |
|      \  |
+-------*-+
于 2013-10-20T00:13:33.383 に答える