2014-01-13 5 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 POS를 받고있는 중이 야.

다음 두 값을 다시 전달하고 위치 배열 ($ posStore)을 검사하여 위치 집합이 아직 할당되지 않았는지 확인한 다음 위치 배열 ($ posStore)에 새 위치 배열을 추가합니다.

하지만 내가 위의 난 아직 내 주요 1000x600 블록 내에서 공백이 최대에 총을 설정 좋아하는 것처럼 작동하지 않는 것 등

덮어 쓰기 위치의 일부 인스턴스가있는 것이 더 나은가요 나는 뭔가를 놓치고있는이 (쓸데없는) 글을 쓰는 길. 셔플 대답 (들) 전체 문제가 해결되지 않았지만

UPDATE

그것은 내가 그것을 해결하는 데 좋은 요인이었다.

내 배열을 완전히 채울 수 없기 때문에 셔플 링이 여전히 선형 효과를 표시하므로 배열 전체를 0,0에서 채우기 만하면됩니다.

나는 다음 루프하고 그들에게 결과의 혼합 가방을 준 단행들이 배열 합계로했다 그럼 간단한 요청에 필요한 총을 복용

:-) 셔플하기 위해 PHP 셔플을 사용했다. 당신은 행과 열에서 그들을 배치 할 수 있습니다 도움

+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

소스