PHP:随机位置功能无重叠

时间:2014-01-13 12:07:30

标签: php

我有一个块说1000x600,并且在这个块中我必须用20x20的块随机填充它,所以总共给我1500个。

但是当我将这些置于随机的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 pos,它会增加框的大小,以防止重叠。

然后我通过检查定位数组($ posStore)检查位置集是否已经分配,​​检查位置集是否已经分配,​​如果没有,则将新位置数组添加到定位数组($ posStore)。 / p>

但这似乎不起作用,好像我喜欢上面设置总数达到最大我仍然在我的主要1000x600块中有空格,似乎有一些位置被覆盖的实例等

有没有更好的方式来写这个(毫无疑问)我错过了什么。

更新

虽然洗牌的答案并没有解决整个问题,但这是帮助我解决问题的一个很好的因素。

由于我可能无法完全填充我的阵列,即使改组仍然会显示线性效果,所以我所做的就是将我的数组从0,0填充到总数中。

然后我使用php shuffle来随机播放: - )

然后采取所需的总数要求我简单做了一个for循环,因为他们排列整齐的地方,它给了他们一堆混合的结果。

感谢您的帮助

2 个答案:

答案 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

答案 1 :(得分:1)

生成序列空间(数组中的[x,y]对),然后生成shuffle