2014-01-13 63 views
0

我有一塊說1000x600,並在此塊我必須隨機填充20x20塊,所以總共給我1500。PHP:隨機位置功能沒有重疊

但是,因爲我把它們放在一個隨機的x,y位置,我想確保我不會寫過已經分配的塊。所以我的問題可能有更好的方式來描述我爲完成這項任務所做的/所做的事情。

CODE:

$Ypos = 0; 
    $Xpos = 0; 
    $posStore = []; 
    $box_size =20; 
    //-- this will be set by another mehtod and will be a rand ome nuber between 5 and 1500 
    //-- but set to the mx for now. 
    $number_of_blocks = rand(5, 1500); 

    //-- loop through the total number of blocks set 
    for ($i=1; $i <=$number_of_blocks; $i++) { 
     //-- set the x,y position for th eblock 
     self::SetPosition(); 

     //-- add the block code here 
     //......... 
    } 


    //-- Set th ex,y position of the block 
    private function SetPosition(){ 
     //-- get the positions 
     $this->Ypos = self::randYPos(); 
     $this->Xpos = self::randXPos(); 
     //-- check that we do not already have that position within the array else re-run this function 
     if(in_array([$this->Ypos,$this->Xpos], $this->posStore)) {self::SetPosition();} 
     //-- if ok then lets add this position to the array 
     array_push($this->posStore,[$this->Ypos,$this->Xpos]); 
     //-- return true 
     return true; 
    } 


    //-- set the ypos 
    private function randYPos(){ 
     $yPos = rand(0 , self::IMAGE_WIDTH); 
     //-- as the boxes need to be positioned relative to their size (20)/incremented by their size so no 
     //-- overlapping is occured 
     return ($yPos % $this->box_size == 0) ? $yPos :self::randYPos(); 
    } 
    //-- set the xpos 
    private function randXPos(){ 
     $xPos = rand(0 , self::IMAGE_HEIGHT); 
     //-- see ypos explaination 
     return ($xPos % $this->box_size == 0) ? $xPos :self::randXPos(); 
    } 

基本上我在做什麼是得到一個隨機的x,由內箱尺寸增加,以致它可以防止重疊的Y位置。

然後我將這兩個值傳回來,通過檢查一個定位數組($ posStore)來檢查位置集尚未分配,如果沒有,則將該新位置數組添加到定位數組($ posStore)。

但這似乎並沒有工作,如果我總喜歡到最大,我仍然有我的主要爲1000x600塊內的空間上方設置,似乎有被覆蓋等

位置的某些情況下有沒有更好的寫這種方式(無疑)我是否缺少一些東西。

UPDATE

雖然洗牌的答案(S)並沒有解決整個問題是在幫助我解決一個好因素。

因爲我可能不會完全填充我的數組,所以甚至洗牌仍然會顯示線性效果,所以我所做的就是將我的數組從0,0填充到總數。

然後我用php的洗牌洗牌:-)

然後以所需的總要求我做了簡單的for循環,併爲他們陣總數地方洗牌它給了EM的結果好壞參半。

感謝您的幫助

+0

你在處理「DOM」或你在服務器端用php創建的圖像? –

+0

看起來對我來說是功課。爲什麼隨機化呢?從邏輯上認爲它類似於鋪設鋪路磚,您從左上角開始您知道固定的邊界框尺寸,您知道板坯尺寸,可以計算每個板坯左上方的x和y位置。 – Dave

+0

是啊!不是真的我有一個線性或隨機的函數調用,線性的工作正常沒有probs它的隨機一個 –

回答

1

生成順序空間(在陣列[X,Y]對),然後shuffle它。

+0

感謝提及洗牌,它並沒有完全解決我的問題,但是是結局的一部分,並用於解決我的問題,索普謝謝。 –

1

您可以按行和列鋪陳他們,這將讓你輕鬆地安裝盒的最高金額。

然後只是洗牌他們。一個接一個地瀏覽所有內容,然後用隨機選擇的塊切換位置。僞代碼:

for i from n − 1 downto 1 do 
     j ← random integer with 0 ≤ j ≤ i 
     exchange a[j] and a[i] 

Fisher-Yates Shuffle, Wikipedia