2017-11-04 5 views
1

UIView의 너비와 높이를 기반으로 밤하늘 배경을 나타내는 별을 균일하게 분산시키고 싶습니다. 각 별은 적어도 20 픽셀 떨어져 있어야합니다.어떻게 서로 겹치지 않고 점들을 균등하게 분산시킬 수 있습니까?

나는 X와 Y 포인트를 생성하기 위해 다음을 시도했지만 매우 비효율적이며 무작위로 생성 된 숫자가 기존 배열의 숫자와 너무 비슷하기 때문에 응용 프로그램이 멈추는 결과를 낳습니다. .

func generateRandomNumber(maxValue: UInt32, uniquePoints: Set<Int>) -> Int { 
    let randomNumber = Int(arc4random_uniform(maxValue)) 

    for point in uniquePoints { 
     if(abs(randomNumber - point) < 20) { 
      return generateRandomNumber(maxValue, uniquePoints) 
     } 
    } 

    return randomNumber 
} 

더 효율적인 방법이 있습니까?

+0

[최소 및 최대 거리가 정의 된 임의 지점 생성] (https://stackoverflow.com/questions/8930796/generating-random-points-with-defined-minimum-and-maximum-distance) | [그리드 회의 최소/최대 거리 요구 사항 내 임의의 지점 선택] (https://gamedev.stackexchange.com/questions/96586/how-to-select-random-points-within-grid-meeting-min-max-distance- requirements-fr) –

답변

3

20 픽셀 떨어져 있어야하는 경우 가장 쉬운 방법은 20 × 20 사각형으로 영역을 나누는 것입니다. 무작위로 각 20 x 20 셀에 1 개의 별을 배치하지만, 다른 모든 열과 행을 건너 뜁니다. 그래서 그 결과는 다음과 같습니다

*-*-*-*-* 
|-|-|-|-| 
*-*-*-*-* 
|-|-|-|-| 

등 위의 그림에서 그들에 *와 세포가 하나의 별을 가질 것이다. - 또는 |이있는 셀은 비어 있습니다.

좀 더 복잡하게하려면 Poisson Disc을 찾아보십시오. 이것은 당신이 더 우아하게 원하는 것을 달성하는 더 복잡한 방법입니다. 그것은 이해하기가 약간 더 어렵지만 종종 계산 집약적 일 수 있습니다.