2017-07-20 8 views
2

私は長方形の点をチェックしています。私は(以下のコードでif番号2のif文をチェックする)コードを追加することによって、コードがそれがない場合よりも多くの誤った返品をもたらすことを理解できません。誰かがこのコードの動作を理解するのを手伝ってもらえますか?結果が誤っているかどうかを再度確認すると、より誤った結果につながることはありますか?

私は、このif文をfalse returnの数と同じかそれより少ない数にすることを期待していました。代わりに、イプシロンの

if (p.x <= center.x + halfWidth && p.x >= center.x - halfWidth 
     && p.y <= center.y + halfHeight && p.y >= center.y - halfHeight) 
    { 
     return true; 
    } 
    else 
    { 


     //Check number # 2 
     if (((p.x <= center.x + halfWidth && p.x >= center.x - halfWidth) 
      || (p.x - center.x + halfWidth < 0.0001)||(p.x - center.x - halfWidth) < 0.0001) 

      && ((p.y <= center.y + halfHeight && p.y >= center.y - halfHeight) 
      || p.y - center.y + halfHeight < 0.0001 || p.y - center.y - halfHeight < 0.0001)) 
     { 

      return true; 
     } 


     return false; 
    } 

私は(0.0001)を使用していますことを無視してください

+0

変更が – Fureeish

+0

どこから来るのか確認するために、あなたのデバッガを使用して、あなたの「真」を返すの数は、万が一、チェック機能が呼び出された回数に影響機能していますか? –

+0

テストに使用するデータを含めることができますか?この関数は再帰的に使用され、出力はp値を変更しますか?チェック#1は冗長であるため、チェック#2ではA && Bの場合をカバーするので、チェック#1では冗長であるため、チェック#2では偽を返すのが奇妙です。 –

答えて

1

ではなく中心点のエッジで動作するように簡単ではないでしょうか?

float left = center.x - halfWidth; // halfWidth?? 
float right = center.x + halfWith; // having rect defined this way 
float top = center.y + halfHeight; // adds 1 * FLT_EPSILOM error 
float bottom = center.y - halfHeight; // to all calculus ops. 

float error_x = fabs(p.x * 2 * FLT_EPSILOM); 
float error_y = fabs(p.y * 2 * FLT_EPSILOM); 

return (left <= (p.x + error_x) && (p.x - error_x) <= right) 
    && (bottom <= (p.y + error_y) && (p.y - error_y) <= top); 
+0

ありがとう!それははるかにクリーンです、私はそれを使用します。 – Coder

関連する問題