我有一塊說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的結果好壞參半。
感謝您的幫助
你在處理「DOM」或你在服務器端用php創建的圖像? –
看起來對我來說是功課。爲什麼隨機化呢?從邏輯上認爲它類似於鋪設鋪路磚,您從左上角開始您知道固定的邊界框尺寸,您知道板坯尺寸,可以計算每個板坯左上方的x和y位置。 – Dave
是啊!不是真的我有一個線性或隨機的函數調用,線性的工作正常沒有probs它的隨機一個 –