2016-08-07 12 views
0

私はSAT(分離軸定理)を小さなプログラムに実装しようとしています。私はforループを3回繰り返すことになっていますが、コードの次の部分に分割して続ける前に、一度だけ実行しています。これを行う必要があるという明白な理由はありません... forループがあります。私は以下のループからも呼び出される関数も含めています。 (なぜこのp5js forループは全部反復しないのですか

this.getAxes = function() { 
    axes = [] 
    for (i = 0; i < this.vertices.length; i++) { 
     p1 = this.vertices[i] 
     if (i === this.vertices.length - 1) { 
      p2 = this.vertices[0] 
     } else { 
      p2 = this.vertices[i + 1] 
     } 
     edge = createVector(p1.x - p2.x, p1.y - p2.y) 
     normal = createVector(-edge.y, edge.x) 
     // the perp method is just (x, y) => (-y, x) or (y, -x) 
     axes[i] = normal 
    } 

    return axes; 
} 

「projectShape:

this.collides = function(shape) { 
    axes1 = this.getAxes(); 
    axes2 = shape.getAxes(); 

    for (i = 0; i < 3; i++) { 
     console.log(i + 1) 
     axis = axes1[i]; 
     pr1 = this.projectShape(axis) 
     pr2 = shape.projectShape(axis) 

     if (!this.overlaps(pr1, pr2)) { 
      console.log("no collision") 
       return false; 
      } 
     } 
    } 
} 

コンソールに1,2,3をログに記録する必要があり、コードを見ることができるようにしかし、それは唯一の機能1.

"getAxes()" ログに記録します)」関数:

this.projectShape = function(axisToProj) { 
    minV = axisToProj.dot(this.vertices[0]); 
    maxV = minV; 
    for (i = 1; i < this.vertices.length; i++) { 
     // NOTE: the axis must be normalized to get accurate projections 
     p = axisToProj.dot(this.vertices[i]); 
     if (p < minV) { 
      minV = p; 
     } else if (p > maxV) { 
      maxV = p; 
     } 
    } 
    minMax = createVector(minV, maxV); 
    return minMax; 
} 

"重複()" 関数:

this.overlaps = function(a, b) { 
    if (a.y > b.x && b.y > a.x) { 
     return true 
    } 

    return false 
} 
+0

@KevinWorkmanはい私はそれを修正することができました。私は曖昧に言えば、問題はforループ内の変数が互いに矛盾していることと関係していたことを覚えています。私は他のforループで "i"を使う代わりに "j"を使ったと信じています。私はまた、あなたが興味を持っている場合は、プログラムの全体と[ここ](https://github.com/MaxBryarsMansell/Velavity/blob/collision/Velavity/collide.js)を書き直しました。 – Max

+0

よかった。私が尋ねた理由は、この質問がまだ答えが必要なものとしてマークされているからです。私はちょうどフォローアップしたいと思います。あなたはそれを把握してうれしい! –

答えて

0

今後、切断されたスニペットの代わりにMCVEをご提供ください。

しかし、あなたのforループは、このif文はtrueに評価されなければならない、終了している場合:

if (!this.overlaps(pr1, pr2)) { 

このif文はまたtrueに評価していることを意味している:

if (a.y > b.x && b.y > a.x) { 

私は」このコードが何をすべきかは正確にはわかりませんが、コードをデバッグするプロセスを開始する必要があります。 abの値がこの行に何であるかを正確に調べる必要があります。私に飛び出し

ことの一つは次のとおりです。あなたが形状の側面をループして衝突ではないことをあなたが側を見つけるとすぐにfalseを返しているように見えます。 であることがわかるとすぐにtrueを返すことを望んでいませんか?

関連する問題