2014-03-04 4 views
1

나는 두 개의 X의 배열 및 y 좌표가 :가장 효율적인 방법은 y는 지정된 지역에서 좌표

x = np.round(np.arange(-4.67,-1.32,0.01),2) 
y = np.round(np.arange(-3.32,3.32,0.01),2) 

나는 무작위 내에서 0.65 너비/높이의 사각형을 그릴 이러한 배열을 사용하고 있습니다를 지정된 범위는 사분면의 왼쪽에있는 영역을 나타냅니다. 값은 시각적으로 0에서부터의 거리를 나타내며, x, y 쌍은 사각형이 가운데에 놓이는 거리입니다. 여기에 내가 무작위로 좌표를 따기 해요 방법은 다음과 같습니다

x1, y1 = random.choice(x), random.choice(y) 
position1 = np.append(x1,y1) 

문제는 가끔 그릴 수 여러 개의 사각형이 있다는 것입니다, 그들은 겹칠 수 없습니다. 정의 된 영역 내의 정사각형 사이에 최소 2도 (중심에서 중심)의 거리를 유지해야합니다. , I는 무작위 그 배열에서 쌍을 선택할 수

coords = np.array(list(itertools.product(x,y)) 

제곱 모든 좌표 점의 또 다른 배열을 생성 :

는 I은 가능한 모든 해당 영역 내의 좌표 쌍을 포함하는 배열을 생성 생각 그 쌍을 중심으로하여 코드에서 제거하십시오. 이렇게하면 다른 정사각형이 해당 정사각형의 2도 내에서 플롯 될 수 없습니다. 여러 사각형에 대해이 작업을 수행 할 수 있다고 가정합니다.

이렇게하면 대량의 배열이 생성됩니다. 이 코드는 PsychoPy (실험 작성기)에서 실행되므로 이러한 좌표를 사각형에 할당하는 것이 중요합니다. 이 작업을 수행하는 가장 효율적인 방법은 무엇입니까? 아마도 내가 놓친 분명한 방법이 있을까요?

답변

1

빠른 검사를 수행하려면 그리드 맵을 사용할 수 있습니다.

그렇지 않으면 당신이 점에 동의하고 또한 그리드에 포인트를 추가, 너무 가까이 다른 지점이 있는지 그리드 만 근처의 세포를 찾고 점 먼저 확인을 선택하면 :

grid = {} 
points = [] 

def addPoint(x, y): 
    # returns True if the point was accepted 

    # compute the cell of the point 
    ix = int(math.floor(x/dist)) 
    iy = int(math.floor(y/dist)) 

    # check cell and all neighbors 
    for nhcell in ((ix-1, iy-1), (ix, iy-1), (ix+1, iy-1), 
        (ix-1, iy), (ix, iy), (ix+1, iy), 
        (ix-1, iy+1), (ix, iy+1), (ix+1, iy+1)): 
     if nhcell in grid: 
      for xx, yy in grid[nhcell]: 
       if (x - xx)**2 + (y - yy)**2 < dist2: 
        # anoter existing point is too close 
        return False 

    # the new point is fine 
    points.add((x, y)) 

    # we should also add it to the grid for future checks 
    if (ix, iy) in grid: 
     grid[(ix, iy)].append((x, y)) 
    else: 
     grid[(ix, iy)] = [(x, y)] 

    return True 
+0

감사 당신은이 솔루션을 제공합니다. 나는 내일 그것에게 줄 것이다. – foushad

+0

@foushad : 그리드는 셀 좌표 (두 정수)를 해당 셀 내부의 점 목록에 매핑하는 사전입니다. 'floor '는 표준 모듈'math'의'math.floor'입니다. – 6502

관련 문제