2011-01-21 9 views
2

私はオーバーレイなしでウィンドウにdivsをランダムに配置したいと考えています。 therfore IM ので、それらのすべてを与えるイムdivsをオーバーレイなしでランダムに配置する

widthArray、heightArray、XP、= xPosition、y・Pと= yPosition、XPRT = rightCornerX(XPOS +幅)、 yPRT = rightCornerYなど

と、いくつかの配列を作成しますランダムな位置と私はすべてのコーナーポイントを計算します。 その後、あるdivの角の1つが div内にある場合、2つのループ内で計算します。これが真の場合は、 が別のdivとオーバーレイしない限り、新しいランダムな位置を与えます。ここ

はコードです:

for(var i = 0; i<xP.length; i++) { 
      for(var k = 0; k<xP.length; k++) { 

       if(i == k) { 
        //alert(Math.random()); 
       } else { 

        while((xP[i]>xP[k] && yP[i]>yP[k] && xP[i]<xPRB[k] && yP[i]<yPRB[k]) || (xPRT[i]<xPRT[k] && yPRT[i]>yPRT[k] && xPRT[i]>xP[k] && yPRT[i]<yPRB[k]) || (xPRB[i]<xPRB[k] && yPRB[i]<yPRB[k] && xPRB[i]>xP[k] && yPRB[i]>yP[i]) || (xPLB[i]>xPLB[k] && yPLB[i]<yPLB[k] && xPLB[i]<xPRB[k] && yPLB[i]>yP[k])) { 
         //alert("i: "+i+" k: "+k+" xP: "+xP[i]+" > xP2: "+xP[k]+" & yP: "+yP[i]+" > yP2: "+yP[k]); 
         xP[i] = GetRandom(0, window.innerWidth - widthArray[i]-2); 
         yP[i] = GetRandom(0, window.innerHeight - heightArray[i]-2); 

         xPRT[i] = xP[i] + widthArray[i]; 
         yPRT[i] = yP[i]; 

         xPRB[i] = xP[i]+ widthArray[i]; 
         yPRB[i] = yP[i]+ heightArray[i]; 

         xPLB[i] = xP[i]; 
         yPLB[i] = yP[i] + heightArray[i]; 
         count++; 

        }; 
       } 
      } 
     } 

そのイムが作成したVARSでdivを位置決めした後。 が存在しますが、まだオーバーレイするdivがあります。私のロジックに何か問題がありますか? 正しく書かれていないのですか?私はあなたがウィンドウに追加されているとして、あなたがDIVの衝突のためにチェックすると、アルゴリズムを高速に実行すると思い助けと悪い英語のため申し訳ありません:)

+0

サンプルページをjsFiddleにドロップできますか? –

答えて

2

ため

感謝。無作為にペーシングし、衝突がないかどうかを確認する代わりに、各DIVの位置をランダムに計算し、その位置が衝突するかどうかを確認して追加してください。存在する場合は、新しい位置を再計算し、再度確認してください。私はこれがN = 2からN * log(N)へのbig-Oを減らすと思う。

編集 - ここではいくつかのサンプルコードです:

function Rect(x, y, w, h) 
{ 
    this.x = x; 
    this.y = y; 
    this.w = w; 
    this.h = h; 

    this.hitTest = function(x, y) 
    { 
    return(x >= this.x && x <= this.x + this.width && 
      y >= this.y && y <= this.t + this.height); 
    } 
} 

var numDivs = 10; 
var divList = new Array(); 

for(var i = 0 ; i < numDivs ; i++) 
{ 
    var doesOverlap = false; 
    do 
    { 
    divList[i] = new Rect(Math.random() * (window.innerWidth - 50), Math.random() * (window.innherHeight - 50), 50, 50); 
    for(var y = 0 ; y < i && !doesOverlap ; y++) 
    { 
     doesOverlap |= divList[y].hitTest(divList[i].x, divList[i].y); 
     doesOverlap |= divList[y].hitTest(divList[i].x + divList[i].width, divList[i].y); 
     doesOverlap |= divList[y].hitTest(divList[i].x, divList[i].y + divList[i].height); 
     doesOverlap |= divList[y].hitTest(divList[i].x + divList[i].width, divList[i].y + divList[i].height); 
    } 
    } 
    while(doesOverlap); 

    // No colision, add div 
} 

は、私はちょうど私の頭の上にそれを書いて、正しさのためにそれをテストしていません。うまくいけば、あなたがどこに間違っていたかをあなたに知らせることができればと思います

+0

ええ、まだパフォーマンスに問題はありません。問題は、まだ重複しているdivがあるということです。私は何千もの計算をチェックしたので、なぜ私は何かを理解することができません。そして何か間違いを見つけることはできません:( – blaufasan

+0

私の提案は、あなたの問題のより単純な解決法です。それをデバッグする必要があります。スピードとシンプルさが増し、それ以上のことを求めることはできません。 – Sparafusile

+0

大丈夫です。私はそれを試みましたが、もしそうなら、まだ重複しているdivがあります。 – blaufasan

関連する問題