파이썬에서 Way Point 기반 시나리오 맵 자료구조는 시나리오의 여러 지점을 나타내고 그 지점들 간의 이동 경로를 관리하는 데 사용됩니다. 이를 통해 특정한 경로, 행동, 혹은 이벤트들이 일어나는 위치를 정의할 수 있습니다. 이러한 구조는 특히 게임 개발, 로봇 경로 탐색, 네비게이션 시스템에서 많이 사용됩니다.

Way Point 기반 시나리오 맵 자료구조

  • Way Point: 지도나 시나리오 상의 특정 지점을 의미하며, 각 지점은 좌표(위치)를 포함할 수 있습니다.
  • 경로(Path): 각 Way Point 간의 연결(Edge)을 나타내며, 두 지점 간의 거리를 포함할 수 있습니다.
  • 시나리오 맵: 여러 Way Point가 연결되어 이루어진 경로 맵으로, 시나리오에서 중요한 위치와 그 간의 이동 경로를 관리합니다.

기본적인 자료구조

  • 노드(Node): 각각의 Way Point를 표현합니다. 위치 정보와 함께 특정 이벤트나 상태를 가질 수 있습니다.
  • 간선(Edge): Way Point 간의 연결을 의미하며, 이 연결을 통해 이동 경로와 거리를 정의할 수 있습니다.

파이썬으로 구현한 Way Point 기반 시나리오 맵 예제

예제 코드

class WayPoint:
    def __init__(self, name, x, y):
        self.name = name        # Way Point 이름
        self.x = x              # X 좌표
        self.y = y              # Y 좌표
        self.connections = {}   # 연결된 다른 Way Point와의 경로(거리)

    def add_connection(self, other_waypoint, distance):
        """다른 Way Point와의 연결 추가"""
        self.connections[other_waypoint] = distance

    def __repr__(self):
        return f"WayPoint({self.name}, ({self.x}, {self.y}))"

class ScenarioMap:
    def __init__(self):
        self.waypoints = {}  # 시나리오 맵의 모든 Way Point를 저장하는 딕셔너리

    def add_waypoint(self, waypoint):
        """새로운 Way Point 추가"""
        self.waypoints[waypoint.name] = waypoint

    def connect_waypoints(self, name1, name2, distance):
        """두 Way Point 간의 연결 추가"""
        if name1 in self.waypoints and name2 in self.waypoints:
            wp1 = self.waypoints[name1]
            wp2 = self.waypoints[name2]
            wp1.add_connection(wp2, distance)
            wp2.add_connection(wp1, distance)

    def get_waypoint(self, name):
        """Way Point 이름으로 해당 지점 가져오기"""
        return self.waypoints.get(name)

    def display_map(self):
        """시나리오 맵을 출력"""
        for wp in self.waypoints.values():
            print(f"{wp} -> {[f'{conn.name} (distance: {dist})' for conn, dist in wp.connections.items()]}")

# 사용 예제
if __name__ == "__main__":
    # ScenarioMap 생성
    scenario_map = ScenarioMap()

    # Way Point 추가
    wp1 = WayPoint("Start", 0, 0)
    wp2 = WayPoint("Point A", 2, 3)
    wp3 = WayPoint("Point B", 4, 7)
    wp4 = WayPoint("End", 8, 5)

    scenario_map.add_waypoint(wp1)
    scenario_map.add_waypoint(wp2)
    scenario_map.add_waypoint(wp3)
    scenario_map.add_waypoint(wp4)

    # Way Point 간 연결 설정
    scenario_map.connect_waypoints("Start", "Point A", 5)
    scenario_map.connect_waypoints("Point A", "Point B", 4)
    scenario_map.connect_waypoints("Point B", "End", 6)
    scenario_map.connect_waypoints("Start", "End", 10)

    # 맵 출력
    scenario_map.display_map()

예제 설명

  1. WayPoint 클래스:

    • WayPoint는 각 지점을 나타냅니다. 각 Way Point는 이름(name), X, Y 좌표(x, y), 그리고 연결된 다른 Way Point들과의 연결 정보(connections)를 갖습니다.
    • add_connection() 메서드는 현재 Way Point에 다른 Way Point와의 연결을 추가하며, 이때 거리를 포함합니다.
  2. ScenarioMap 클래스:

    • 시나리오 전체를 관리하는 클래스입니다. 여러 Way Point를 추가하고, 그 Way Point들 간의 연결을 설정할 수 있습니다.
    • add_waypoint()는 새로운 Way Point를 추가하며, connect_waypoints()는 두 지점 간의 연결(경로)과 거리를 설정합니다.
    • display_map() 메서드는 각 Way Point와 그 연결 상태를 출력합니다.
  3. 경로 설정:

    • 각 Way Point는 다른 Way Point와 거리를 기반으로 연결되며, 양방향 경로를 설정하여 이동 가능하게 만듭니다.
  4. 거리 기반 경로 연결:

    • 두 Way Point 간의 거리를 지정하여 경로를 연결할 수 있으며, 이를 통해 실제 시나리오에서 각 지점 간 이동 가능성을 표현할 수 있습니다.

실행 결과

WayPoint(Start, (0, 0)) -> ['Point A (distance: 5)', 'End (distance: 10)']
WayPoint(Point A, (2, 3)) -> ['Start (distance: 5)', 'Point B (distance: 4)']
WayPoint(Point B, (4, 7)) -> ['Point A (distance: 4)', 'End (distance: 6)']
WayPoint(End, (8, 5)) -> ['Point B (distance: 6)', 'Start (distance: 10)']

주요 포인트

  1. Way Point와 연결 관리:

    • 각 Way Point는 다른 Way Point들과 연결되며, 연결된 경로의 거리를 관리합니다. 이를 통해 경로 탐색, 최단 경로 계산 등에 활용할 수 있습니다.
  2. 유연한 확장:

    • 기본적인 경로 및 지점 관리 외에도 이벤트 발생, 상태 변경, 혹은 특정 조건부 경로 등을 추가하여 시나리오를 확장할 수 있습니다.
  3. 응용:

    • 게임에서의 경로 탐색 시스템, 물류 시스템에서의 경로 최적화, 로봇 경로 계획, 네비게이션 시스템 등에 활용할 수 있습니다.
  4. 확장성:

    • 이 기본 구조를 확장하여 경로의 우선순위, 지점 간 조건부 연결, 특정 이벤트 발생 여부 등을 관리할 수 있습니다.

이와 같이 Way Point 기반의 자료구조는 시나리오 맵에서 경로와 지점을 효과적으로 관리할 수 있으며, 다양한 분야에서 유연하게 사용될 수 있습니다.

+ Recent posts