2011-10-25 19 views
1

私はNSViewに多種の異なるNSTextViewがあり、互いに交差しないようにしようとしています。最初に、私は次の操作を行うためのアイデアを持っていた:CGRectが四角形の配列と交差しているかどうか確認してください。

ここ
for (NSString *str in frames) { 

     while (CGRectIntersectsRect(NSRectToCGRect(field.frame), NSRectToCGRect(NSRectFromString(str)))) { 

      CGPoint origin = [self randomPoint]; 

      field.frame = CGRectMake(origin.x, origin.y, sizeOfButton.width, sizeOfButton.height); 


     } 

    } 
     NSString *string = NSStringFromRect(field.frame); 

     [frames addObject:string]; 

、「フレーム」は、それらをクリアし、おそらく交差していないされたら、私は、NSTextViewsの座標を追加するための配列です。 'field'はNSTextFieldであり、 'randomPoint'はNSPointをランダムに見つけるメソッドであるため、NSTextFieldの配置はランダムです。

どのようなことが起こるかは、矩形の配列を反復し、各矩形が新しい矩形と交差していないかどうかを確認することです。

この方法の問題点は、NSTextFieldが一度に1つの矩形に対してチェックされることです。実際には、1つの矩形と交差することはできませんが、次のものと交差する可能性があります。残念ながら、座標が変更されると、最初の矩形と交差してテストに合格する可能性があります。

簡単にするために、誰かがメソッドを知っていますか、またはコードを変更して、オブジェクトが他の多くのオブジェクトと交差しているかどうかを同時にチェックできますか? 2つ以上のCGRectの交差点を確認することは可能ですか?

+1

なぜ文字列としてrectを格納していますか? '+ [NSValue valueWithRect:]'を使って 'NSRect'を' NSValue'に変換し、 ' - [NSValue rectValue]'を使って 'NSRect'を取得することができます。 –

+0

新しいフレームに合う可能性のある場所がない場合はどうなりますか?永遠にランダムな点を試してみると、決して終わらないでしょう。 –

+1

あなたはNSValueのアプローチについては正しいですが、文字列にrectを格納するのと同じくらいです。主な問題を最初に修正することに優先順位をつけるつもりです。 – elliottbolzan

答えて

2

ここで巧みに説明されているように:http://static.mrfeinberg.com/bv_ch03.pdf、私が使っていた方法で複数の矩形の交差をチェックしようとするのは愚かで、著しく遅いようです。

もっと複雑で精巧な答えがそのPDFに描かれていますが、それは私にとっては過度のものですが、長期的には唯一の解決策かもしれません。

関連する問題