2009-03-17 2 views
1

私はボールのようにお互いに跳ね返ろうとしている風船のセットを持っています。私がそれらを動かし始めて衝突を検出すると、衝突のルーチンは最終的に風船の速度のNANを返します。私は、x = 270、y = -nan(0x400000)のようなものの位置に終わる。私は一日中コードを見てきましたが、私はまだエラーを見つけることができません、どんな助けも高く評価されるでしょう。コードは次のとおりです。iphoneアプリで衝突検出を行っている数値エラー(NAN)がありません

- (void)MoveBalloons { 

    for (CurBalloon=1; CurBalloon <= NumBalloons; ++CurBalloon) { 

    //check for edge hCurBalloont 
    if (uBalloon[CurBalloon].pos.y > 456) { 
     uBalloon[CurBalloon].pos.y = 456; 
     uBalloon[CurBalloon].Vel_y = -uBalloon[CurBalloon].Vel_y; 
    } 
    if (uBalloon[CurBalloon].pos.y < 24) { 
     uBalloon[CurBalloon].pos.y = 24; 
     uBalloon[CurBalloon].Vel_y = -uBalloon[CurBalloon].Vel_y; 
    } 
    if (uBalloon[CurBalloon].pos.x > 289) { 
     uBalloon[CurBalloon].pos.x = 289; 
     uBalloon[CurBalloon].Vel_x = -uBalloon[CurBalloon].Vel_x; 
    } 
    if (uBalloon[CurBalloon].pos.x < 31) { 
     uBalloon[CurBalloon].pos.x = 31; 
     uBalloon[CurBalloon].Vel_x = -uBalloon[CurBalloon].Vel_x; 
    } 

    //call loop to go through the balloons for each touch. 
    //[self CollisionCheck]; 

     NSUInteger h; 
     float dist, tempvelx, tempvely, temp2velx, temp2vely;; 

     for (h=1; h <= NumBalloons; ++h) { 
      //check if balloon is too close 
      if (CurBalloon == h) { //skip the check ifit's the same balloon 
      } else { 
       dist = distanceBetweenPoints(uBalloon[CurBalloon].pos, uBalloon[h].pos); 
       if (dist <= (kBalloonNear)) { //balloon's touching 

        tempvelx = uBalloon[CurBalloon].Vel_x; 
        tempvely = uBalloon[CurBalloon].Vel_y; 
        temp2velx = uBalloon[h].Vel_x; 
        temp2vely = uBalloon[h].Vel_y; 

        tempvelx = (uBalloon[CurBalloon].Vel_x - uBalloon[h].Vel_x) * (sinf(angleBetweenPoints(uBalloon[CurBalloon].pos,uBalloon[h].pos)))*(uBalloon[CurBalloon].Vel_x - uBalloon[h].Vel_x) * (sinf(angleBetweenPoints(uBalloon[CurBalloon].pos,uBalloon[h].pos))) - (uBalloon[CurBalloon].Vel_y - uBalloon[h].Vel_y) * sinf(angleBetweenPoints(uBalloon[CurBalloon].pos, uBalloon[h].pos)) * cosf(angleBetweenPoints(uBalloon[CurBalloon].pos, uBalloon[h].pos)) + uBalloon[h].Vel_x; 

        tempvely = (uBalloon[CurBalloon].Vel_y - uBalloon[h].Vel_y) * (cosf(angleBetweenPoints(uBalloon[CurBalloon].pos,uBalloon[h].pos))) * (uBalloon[CurBalloon].Vel_y - uBalloon[h].Vel_y) * (cosf(angleBetweenPoints(uBalloon[CurBalloon].pos,uBalloon[h].pos))) - (uBalloon[CurBalloon].Vel_x - uBalloon[h].Vel_x) * sinf(angleBetweenPoints(uBalloon[CurBalloon].pos, uBalloon[h].pos)) * cosf(angleBetweenPoints(uBalloon[CurBalloon].pos, uBalloon[h].pos)) + uBalloon[h].Vel_y; 

        temp2velx = (uBalloon[CurBalloon].Vel_x - uBalloon[h].Vel_x) * (cosf(angleBetweenPoints(uBalloon[CurBalloon].pos,uBalloon[h].pos))) * (uBalloon[CurBalloon].Vel_x - uBalloon[h].Vel_x) * (cosf(angleBetweenPoints(uBalloon[CurBalloon].pos,uBalloon[h].pos))) + (uBalloon[CurBalloon].Vel_y - uBalloon[h].Vel_y) * sinf(angleBetweenPoints(uBalloon[CurBalloon].pos, uBalloon[h].pos)) * cosf(angleBetweenPoints(uBalloon[CurBalloon].pos, uBalloon[h].pos)) + uBalloon[h].Vel_x; 

        temp2vely = (uBalloon[CurBalloon].Vel_y - uBalloon[h].Vel_y) * (sinf(angleBetweenPoints(uBalloon[CurBalloon].pos,uBalloon[h].pos)))*(uBalloon[CurBalloon].Vel_y - uBalloon[h].Vel_y) * (sinf(angleBetweenPoints(uBalloon[CurBalloon].pos,uBalloon[h].pos))) - (uBalloon[CurBalloon].Vel_x - uBalloon[h].Vel_x) * sinf(angleBetweenPoints(uBalloon[CurBalloon].pos, uBalloon[h].pos)) * cosf(angleBetweenPoints(uBalloon[CurBalloon].pos, uBalloon[h].pos)) + uBalloon[h].Vel_y; 

        uBalloon[CurBalloon].Vel_x = tempvelx; 
        uBalloon[CurBalloon].Vel_y = tempvely; 
        uBalloon[h].Vel_x = temp2velx; //set to old value of CurBalloon balloon. 
        uBalloon[h].Vel_y = temp2vely; 

       } 
      } 
     } 


    if (fabsf(uBalloon[CurBalloon].Vel_x) >= kBalloonMaxSpeed) uBalloon[CurBalloon].Vel_x = kBalloonMaxSpeed; 
    if (fabsf(uBalloon[CurBalloon].Vel_y) >= kBalloonMaxSpeed) uBalloon[CurBalloon].Vel_y = kBalloonMaxSpeed; 
    if (fabsf(uBalloon[CurBalloon].Vel_x) <= -kBalloonMaxSpeed) uBalloon[CurBalloon].Vel_x = -kBalloonMaxSpeed; 
    if (fabsf(uBalloon[CurBalloon].Vel_y) <= -kBalloonMaxSpeed) uBalloon[CurBalloon].Vel_y = -kBalloonMaxSpeed; 



    if (uBalloon[CurBalloon].Vel_y > KBalloonSpeed) { //if travellCurBalloonng fast, slow CurBalloont up fast to normal speed 
     uBalloon[CurBalloon].Vel_y = uBalloon[CurBalloon].Vel_y - kBalloonSlowRate; 
    } 
    if (uBalloon[CurBalloon].Vel_x > KBalloonSpeed) { //if travellCurBalloonng fast, slow CurBalloont up fast to normal speed 
     uBalloon[CurBalloon].Vel_x = uBalloon[CurBalloon].Vel_x - kBalloonSlowRate; 
    } 
    if (uBalloon[CurBalloon].Vel_y < KBalloonSpeed) { //if travellCurBalloonng fast, slow CurBalloont up fast to normal speed 
     uBalloon[CurBalloon].Vel_y = uBalloon[CurBalloon].Vel_y + kBalloonSlowRate; 
    } 
    if (uBalloon[CurBalloon].Vel_x < KBalloonSpeed) { //if travellCurBalloonng fast, slow CurBalloont up fast to normal speed 
     uBalloon[CurBalloon].Vel_x = uBalloon[CurBalloon].Vel_x + kBalloonSlowRate; 
    } 


    //slow to 0 if velocCurBalloonty CurBalloons CurBalloonnsCurBalloonde the slow rate 
    if (fabsf(uBalloon[CurBalloon].Vel_x) <= kBalloonSlowRate) uBalloon[CurBalloon].Vel_x = 0; 
    if (fabsf(uBalloon[CurBalloon].Vel_y) <= kBalloonSlowRate) uBalloon[CurBalloon].Vel_y = 0; 

    uBalloon[CurBalloon].Vel_x = uBalloon[CurBalloon].Vel_x - kBalloonFallRate; //keep movCurBalloonng down  

    //add velocCurBalloonty to poCurBalloonnts 
    uBalloon[CurBalloon].pos.y= uBalloon[CurBalloon].pos.y + uBalloon[CurBalloon].Vel_y;  
    uBalloon[CurBalloon].pos.x = uBalloon[CurBalloon].pos.x + uBalloon[CurBalloon].Vel_x; 

    } 
} 

距離と角度に使用される関数です。私も0ではsqrt(-1)と部門を持たないように確認しています:(N-1):

CGFloat distanceBetweenPoints (CGPoint first, CGPoint second) { 
    CGFloat deltaX = second.x - first.x; 
    CGFloat deltaY = second.y - first.y; 
    if ((deltaX*deltaX + deltaY*deltaY) == -1) { 
     return sqrtf(-.99); 
    } else { 
    return sqrtf(deltaX*deltaX + deltaY*deltaY); 
    } 
} 

    CGFloat angleBetweenPoints(CGPoint first, CGPoint second) { 

    if (first.x - second.x == 0) { 
     return (pi/2); 
    } else { 
     return atanf((first.y-second.y)/(first.x - second.x)); 
    } 

} 

答えて

2

uBalloonは、あなたの反復が0の間でなければなりません配列である場合。

など。

for (CurBalloon=0; CurBalloon < NumBalloons; ++CurBalloon) 
{ 
    uBalloon[curBalloon] // blah 
} 
+0

これをCurBalloon schnaader

+0

もう1つ、ありがとう。 –

2
[...] 
if ((deltaX*deltaX + deltaY*deltaY) == -1) { 
    return sqrtf(-.99); 
} else { 
[...] 

私はこれがあなたの問題(またはそれらの1つ)だと思います。負の数の平方根をとることはできません(-1でも-99でも問題ありません)。

+1

また、2つの四角形の合計は決して負であってはなりません。とにかく、==を使って平等を確実に確認できるわけではありません。 – aib

+0

これは不要ですが、問題はありません。 – schnaader

+0

私はそれが否定的ではないかもしれないと思った...その部分を削除する。ありがとうございました。 –

1

おそらくこれはあなたのエラーの原因ではありませんが、この機能は非常に適切ではありません。

CGFloat angleBetweenPoints(CGPoint first, CGPoint second) { 

if (first.x - second.x == 0) { 
     return (pi/2); 
} else { 
     return atanf((first.y-second.y)/(first.x - second.x)); 
} 

これは常に-pi/2と+ PI/2、およびそれの間の角度を返します。 first.x - second.xは非常に小さく、0に近い場合、誤った結果を返すではなく、正確に0の代わりに、ちょうどatan2使用できます

CGFloat angleBetweenPoints(CGPoint first, CGPoint second) { 
    return atan2f(first.y - second.y, first.x - second.x); 
} 

atan2()は+ Piに-piから角度の全範囲を返し、ハンドルエッジケースを適切に処理します。これはおそらく結果角度のsin/cosを取っているので、あなたには影響しません。しかし、非常に非効率な方法でそうしています - あなたはangleBetweenPoints()を8(!)回呼び出して、結果が同じ非常時で、4 sin()と4 cos()をとっています。三角法のすべてをスキップし、同様の三角形のジオメトリを使用して同じ結果を得ることができます。

+0

ありがとう、私はobjective-Cで働いていません。私はそれをatan2fに変更しました。また、繰り返しの呼び出しを指摘していただきありがとうございます。 –