1

次のようなポリゴンがある場合、衝突検出機能の領域を定義する方法がわかりません。

    ______
   / _____|
  / /
 / /
---

塗りつぶし/ストローク呼び出しの前に lineTo() を使用してポリゴンを数回描画するので、すべてのポイントの x、y 座標がわかります。

現在、ボールがポイントの特定の領域を超えているかどうかを確認するだけです:

    if(tmpParticle.y <= platformBottom) {
        if(tmpParticle.x < leftPipe_middleX || tmpParticle.x > rightPipe_middleX) {
            tmpParticle = particleCollision(tmpParticle, platformBottom);
        }
    }

    if(tmpParticle.y <= pipeBottom && tmpParticle.y >= pipeBottom - 30) {
        if(tmpParticle.x < leftPipe_bottomRightX && tmpParticle.x > leftPipe_bottomLeftX) {
            tmpParticle = particleCollision(tmpParticle, pipeBottom);
        } else if (tmpParticle.x < rightPipe_bottomRightX && tmpParticle.x > rightPipe_bottomLeftX) {
            tmpParticle = particleCollision(tmpParticle, pipeBottom);
        }
    }

platformHeight は「上部の水平線」の Y 値です platformBottom は「platformHeight のすぐ下の水平線」の Y 値です rightPipe* は示されている例です。leftPipe* は、他の方向を除いて同じポリゴン用です (パイプを形成するため、衝突せずにボールを発射する必要があります)。

私のparticleCollision()関数はtmpParticleを取り、Y値(2番目のパラメータ、すなわちpipeBottom)に基づいて方向を反転します。これは今のところ問題なく動作しますが、後で改善する必要があるかもしれません。

衝突の領域を定義するためのより良い方法を見つけ出す必要があります。

4

1 に答える 1

0

パイプを三角形に分割してから、triangle - circle交差領域を見つけることを検討してください。それらが交差する場合、交差点は常に a convex polygon(面積は三角形に再度分割することで簡単に計算できます) と a segment(面積も簡単に計算できます - http://en.wikipedia.org/wiki/Circular_segment ) になります。もう 1 つのケースは三角形自体で、完全に円の内側にある場合です (これも単純なケースです)。

于 2013-05-08T12:33:53.457 に答える