2012-05-13 2 views
1

저는 젊은 프로그래머이고 저는 파이썬을 배우고 있습니다. 나는 더 큰 프로그램을 만드는 법을 배우기위한 샘플 프로그램을 만들고 있습니다.충돌을 추적하는 가장 효과적인 방법은 무엇입니까

class Robot(): 

    def __init__(self): 
     self.xpos = 0 
     self.ypos = 0 

    def step(self, axis): 
     print "step" 
     if axis in "xX": 
      self.xpos += 1 
     elif axis in "yY": 
      self.ypos += 1 

    def walk(self, axis, steps=2): 
     for i in range(steps): 
      self.step(axis) 

    def get_pos(self): 
     print "X:%i Y:%i" % (self.xpos, self.ypos) 


robot = Robot() 
robot.walk("x", steps=3) 

이 모든 것이 개별 로봇의 위치를 ​​추적합니다. 두 대의 로봇이 있고 같은 위치에 있다면 어떻게 추적 할 수 있습니까?

예 :

robot1 = Robot() 
robot2 = Robot() 
robot1.walk("x",5) 
robot2.walk("x",5) 

그들이 그렇게 내가 어떻게 어떤 로봇이 동일한 위치에 있는지 확인하는 것과 같은 위치에있을 것입니다?

+0

이것은 종종 개체가 존재하는 공간을 분할하기 위해 나무를 사용하여 충돌을보다 효율적으로 찾을 수 있습니다. 참조 : [quadtrees (2d)] (http://en.wikipedia.org/wiki/Quadtree) 및 [octrees (3d)] (http://en.wikipedia.org/wiki/Octree). –

+0

나는 나의 책의 끝에서 그것들을 보았다. 그러나 나는 아직까지 그것을 얻지 않았다. 난 그냥 __init__에 대한 열정을 배열하고 그런 식으로 추적 할 줄 알았는데 –

답변

0

, 모든 로봇의 위치를 ​​확인하는 방법을 작성하는 간단 예를 들어, 경로가 명확한 지 알 수 있습니다.

덧붙여 말하자면, 각 로봇에 대한 참조를 add_robot 메서드로 설정할 수있는 참조를 포함 시켜서 로봇이 move이라고 할 때 이동이 가능한지 여부를 알 수 있습니다. 방법.

+0

이것은 내가 무엇을 찾고 있었는지입니다. 난 장애물이있는 육상을 시뮬레이트하기 위해 2D 배열을 만들기를 원했고, 프로그램은 특정 위치로 더 뜨거워 지거나 더 차가워지면 이동했을 때이를 알려줍니다. 정말 고맙습니다! –

+0

ETA : 마지막 코멘트 무시 :-) –

+0

단순한 충돌 확인을 위해 O (N)이지만, 해시 맵을 사용하여 올바른 해시 및 같음 함수를 사용하는 것은 O (1)에서 작동합니다. 유스 케이스와 우리가 말하는 로봇의 수에 달려 있습니다. 예를 들어, 10.000 이하는 문제가되지 않습니다. :) – Voo

3

룸() 또는 CoordinateSystem() 또는 모든 Robot 객체에 대한 참조를 보유하고있는 것과 같은 다른 클래스가 필요하다고 생각합니다. 그런 다음, 룸이 점유되었는지 클래스 메소드를 사용하여 해당 위치가 점유되었는지 여부를 리턴 할 수 있습니다. 이것은 많은 다른 작업을 허용하는 장점이있다

class Map: 
    def __init__(self): 
     self.robots = [] 

    def add_robot(self, robot): 
     self.robots.add(robot) 

    def is_occupied(self, x, y): 
     for r in self.robots: 
      if r.xpos == x and r.ypos == y: 
       return True 
     return False 

당신이에서 수행 할 수 있습니다 : 당신이 Map 같은 클래스를 만드는 경우

0

모든 로봇 정보를 담는 컨테이너를 만드는 것은 확실하게 충돌을 확인하는 한 가지 방법이지만, 여전히해야 할 기본 검사는 각 로봇 (x, y)에 대해 동등성 테스트를 수행하는 것입니다.

그래서 가장 간단한 형태로 간단한 AND'ed 평등 테스트를 수행 한 다음 해당 테스트를 수용 할 함수를 만들 수 있습니다 :

def check_collision(r1, r2): 
    if r1.x == r2.x and r1.y == r2.y: 
     return True 
    return False  

그런 다음 함수를 정렬하여 로봇 클래스 또는 새 맵/room 클래스에 추가 할 수 있습니다.

관련 문제