2016-09-02 9 views
0

ランダムCGRectを生成し、以前の配列の他の矩形と交差しているかどうかをチェックし、そうでない場合は新しい矩形を配列に追加するコードがあります。これは完璧に機能しますが、ランダムCGRectも画面中央の画像と重ならないようにしたいと考えています。私は余分なスペースを余分にして画像を輪郭を描く矩形を作成しましたが、ランダムなCGRectはまだ交差しませんが、時には中央のイメージrectと交差することがあります。追記としてCGRectIntersectsRectが一貫していない

CGRect aRandomFrame = CGRectMake((aRandomX - 50), (aRandomY - 50), 100, 100); 
CGRect imageRect = CGRectMake((self.fixation.center.x - 50), (self.fixation.center.y - 50), 100, 100); 

if (CGRectContainsRect(BOUNDARY, aRandomFrame)) { 
    BOOL isValidFrame = YES; 
    for (NSValue *aFrameValue in [self points]) { 
     CGRect aFrame = [aFrameValue CGRectValue]; 
     if (CGRectIntersectsRect(aFrame, aRandomFrame) || CGRectIntersectsRect(imageRect, aRandomFrame)) { 
      isValidFrame = NO; 
      break; 
     } 
    } 

    if (isValidFrame) { 
     [[self points] addObject:[NSValue valueWithCGRect:aRandomFrame]]; 
    } 
} 

、境界がランダムrectsのどれもが、あまりにも遠く中心部からではないことを確認する大きな矩形です。

答えて

1

CGRectIntersectsRectが機能していないことを読者に納得させるには、失敗したことを示すNSLogの証拠を提示する必要があります。

  1. aRandomXaRandomYの計算:疑いは、我々はOPで見ることができないものを落ちるよう

    コードは、大丈夫に見えます。

    CGFloat aRandomX = arc4random_uniform(someView.bounds.size.width); 
    CGFloat aRandomY = arc4random_uniform(someView.bounds.size.height); 
    

someViewがここでは重要である:それはイメージ図及びこれらのrectsのすべての座標系、我々は内なら、おそらくself.viewを含むUIViewである私は、このようになります推測しますビューコントローラ

  • BOUNDARYの値が、私はそれがゼロ又は小さな起源と等しい又はより少し小さいサイズを有する単純な一定の矩形の賭け210

  • おそらく最も邪悪な原因は、imageRectの座標系です。矩形と境界がの座標系にある場合、一部のビューの場合は、self.fixationのcenterプロパティである必要があります。つまり、self.fixationは、直接サブビューである必要があります。

  • どんなにそれがビュー階層にsomeViewにどのように関連するか、あなたはimageRectが少しより洗練されたアプローチ使用して正しいことを保証することはできません:サイドノートとして

    CGRect imageRect = [self.fixation convertRect:self.fixation.bounds toView:someView]; 
    // remember someView might be self.view in a view controller 
    // what to do here depends on how your view hierarchy relates to the rects 
    

    を、あなたのループがあります保存された矩形に対して計算された矩形をチェックするたびにimageRectのチェックを行うため、無駄がほとんどありません。

    if (CGRectContainsRect(BOUNDARY, aRandomFrame)) { 
        if (!CGRectIntersectsRect(imageRect, aRandomFrame)) { 
         BOOL isDisjoint = YES; 
         for (NSValue *frameValue in self.points) { 
          CGRect aFrame = [frameValue CGRectValue]; 
          if (CGRectIntersectsRect(aFrame, aRandomFrame)) { 
           isDisjoint = NO; 
           break; 
          } 
         } 
         if (isDisjoint) { 
          [self.points addObject:[NSValue valueWithCGRect:aRandomFrame]]; 
         } 
        } 
    } 
    

    本のもう一つの利点は、デバッグ用です:あなたはこのようなものを修正することができ、第2の条件内で破り、aRandomFrameimageRectと交差するかどうかを確認します。もしそうなら、NSLogに四角形を置き、ここに投稿してください。 CGRectContainsRectには、のバグがありますが、それはありません。私は特定のです。

    代わりに、その点で四角形が交差していないことがわかり、何か問題がある場合はimageRectとなります。がんばろう!

    +0

    申し訳ありませんが、この応答は非常に遅いです、他のものが私の注意を要求し、これはバックバーナーに置かれました。しかし、私はあなたが置いたものを実装したので、いくつかの問題のトラブルシューティングに役立ちました。ありがとうございます! – lunadiviner

    関連する問題