무작위로 균일 한 간격을두고 있지만 서로 너무 가깝지는 않은 2D 공간에서 점 집합의 좌표를 생성하려고합니다.
으로 시작 np.random.uniform
하여 nx 2 값 (x 및 y 좌표)을 생성 한 다음 모든 좌표에 대해 두 개의 중첩 된 for 루프를 사용하여 좌표 목록을 선별하여 너무 가까운 점을 제거하고 임의로 다른 곳에 배치했습니다.
# Generate xy coordinates for the grafting points
rng = np.random.RandomState(seed=self.rng_seed)
coordinates = rng.uniform(high=(self.box_size[0], self.box_size[1]), size=(n_chains, 2))
for count in range(0, self.max_overlap_iter):
moved_bead = False
# Search for overlapping beads by looping over the list doubly
for id_i, coord_i in enumerate(coordinates):
for id_j, coord_j in enumerate(coordinates):
if not id_i == id_j and np.sqrt(sum((coord_i - coord_j)**2)) < self.bead_size:
# Move the second point
coordinates[id_j] = rng.uniform(high=(self.box_size[0], self.box_size[1]), size=2)
moved_bead = True
if not moved_bead:
break
포인트가 새로운 임의의 위치로 이동 된 후에도 여전히 겹칠 수 있으므로 외부 루프를 다시 통과해야합니다.
문제는 일부 포인트가 '겹칠'확률이 급증하기 때문에 포인트 밀도가 충분히 높을 때 정말 느려진다는 것입니다. 그 때문에 최대 반복 횟수를 구축해야했지만 분명히 내 문제에 대한 해결책이 아닙니다.
이를 수행하는 더 빠르고 효율적인 방법이 있습니까?
나는 다른 알고리즘에서 얻은 몇 가지 아이디어를 사용하여 비 최대 포인트 세트를 생성하고 선형 시간으로 실행할 수있는 푸 아송 디스크 포인트 세트 생성기 알고리즘을 작성했습니다.
당연히 Google에 "Poisson-disk point set"이라는 용어를 주신 @Kamil에게 감사드립니다.)
https://github.com/Compizfox/MDBrushGenerators/blob/master/PoissonDiskGenerator.py 에서 찾을 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다