2009-04-15 4 views
3

운영체제 클래스에서는 "Jurrasic Park"라는 스케줄링 시뮬레이터를 작성하려고합니다.트랙을 따라 움직이는 자동차 시뮬레이션하기

궁극적 인 목표는 설정된 길을 따라 일련의 자동차를 타고 나고 승객들이 돌아오고 출발 할 수 있도록 설정된 위치에서 줄을 서서 기다리는 것입니다. 이것은 트랙과 그것을 따라 움직이는 자동차의 간단한 2 차원, 하향식보기 일 것입니다.

아무 것도 시각적으로 표시하지 않고도 쉽게 코딩 할 수 있지만 고정 트랙을 따라 움직이는 자동차를 구현하는 가장 좋은 방법은 무엇인지 잘 모릅니다.

시작하려면 OpenGL을 사용하여 직사각형으로 내 자동차를 그려 보겠습니다. 그러나 자동차 위치를 업데이트하고 시뮬레이션 된 경로를 따라 이동하는 방법에 대해 다소 혼란 스럽습니다. 테마 파크.

트랙의 정점을 목록에 저장하고 update()으로 전화 할 때마다 차를 다음 정점에 한 단계 더 가야합니까?

실행을 타이머 (매 100msec가)를, 각각의 타이머에 새 위치에있는 자동차의 각 사람을 그릴 :

+0

합리적인 방법처럼 보입니다. – dommer

+0

운영체제 클래스에서 OpenGL을 사용해야합니까? –

+0

@mmyers, no ... 나는 우리의 운영체제 문제 중 하나에 대해 매력적인 시뮬레이션을 구축해야합니다. 구현은 나에게 달려있다. – Mithrax

답변

0

나는 그것을 간단한 유지한다. 위치는 자동차의 2D 좌표 (각 자동차?)가 들어있는 파일에서 읽습니다.

길을 길게 설계하면 (30 초라고 말하면서) 30 * 10 점을 쓰는 것이 어려울 것입니다. 그러면 파일을 1 초마다 위치에 저장하는 것이 어떻습니까? 그런 다음 두 간격 사이에 9 개의 사각 지대가 생기고 일정한 속도로 차를 움직여보십시오 (x + = dx/9, y + = dy/9). 당신이 설명하는대로

나는 더 나은 방법 :

+0

자신의 위치를 ​​고정하면 작동하지 않습니다. 그들은 passangers 등, 등, 등 기다리고있을 수도 있습니다. – Mithrax

0

그럼 당신이 어떤 경로를 사용할 수 있습니다 듣고 에테르 고정 된 지점 경로 또는 스플라인을하고 싶습니다. 그런 다음이 경로에서 고정 '속도'로 이동하십시오. 이것은 자동차가 똑같은 방향으로 움직일 경우 코너링처럼 똑바로 쓸 경우 딱딱 해 보일 수 있습니다.

그럼 각 경로 섹션마다 속도를 가질 수 있지만 속도 설정 지점이 많거나 속도가 혼합되어야합니다. 그렇지 않으면 속도가 갑자기 변하는 경우가 있습니다.

아니면 자동차 시뮬레이션을하고 A *를 사용하여 최적의 경로를 만들 수 있습니다. 그 이상은 이지만, 매우 차가운 것입니다.

+0

그는 단 하나의 경로를 가지고 ... 왜 그는 '최적의'경로를 찾아야합니까? – mpen

+0

그는 고정 경로가 아니라 단 하나의 경로를 가지고 있다고 말합니다. 가장 궤도가 굵은 선을 보았습니다. 더 많이 보이기를 원한다면 대부분의 자동차가 모퉁이를 껴안고 구석 구석을 맴돌 았습니다. –

0

전진 및 후진이 있고 앞으로 나아갈 것이라는 것을 알고 있다면 주변의 세포를보고 도로의 색을 찾아 이동하여 도로의 중심.

갑작스러운 커브가 없다고 가정하면 도로가 직접 앞에 있다고 가정하고 왼쪽 및 오른쪽으로 스캔하여 도로가 약간 곡선을 이루는지, 중심에 머물러 있는지 확인할 수 있습니다 처리를 줄이기 위해

사용할 수있는 다른 방법이 있지만이 방법은 간단하고 IMO이며 길에서 부드러운 곡선을 유지할 수 있습니다.

또 다른 접근법은 바로 타일 기반으로하는 것입니다. 따라서 앞에있는 타일을보고 도로 방향을 변경하기 위해 타일을 바꿔 타일을 사용하는 방법을 알아야합니다.

이것은 부드럽지는 않지만 쉽게 할 수 있습니다.

2

곡선 트랙을 원할 경우 두 개의 벡터 끝점에서 지정한 수학적으로 정의 된 곡선 인 스플라인을 사용할 수 있습니다. 끝점을 아래로 내린 다음 그 끝점 사이의 멋진 곡선을 풀어냅니다. 검색은 소스 코드로 도출 할 수있는 소스 코드 또는 수학을 보여줘야합니다. 이것에 대한 좋은 점은 차량의 헤딩을 정확히 풀 수 있고 백분율 계산을 통해 경로의 다음 위치를 얻을 수 있다는 것입니다. 어려운 점은 각 끝점 집합간에 동일한 단계 수를 사용하지 않으려면 커브 길이 계산을 수행해야한다는 것입니다.

대체 방법은 숨겨진 비트 맵을 그려진 경로가 단일 픽셀 광폭 커브로 사용하는 것입니다. 현재 위치를 둘러싼 픽셀을 이동 방향 벡터와 일치시킨 다음 각 단계에서 델타 함수로 벡터를 업데이트하여 경로에서 다음 위치를 찾을 수 있습니다. 이 방법은 조이스틱을 사용하여 다양한 경로를 따라 "차량"을 "주행"하는 경로 주행 프로토 타입에 사용되며 벡터 계산을 혼동시키는 교차점이있을 때까지 제대로 작동합니다. 그러나 이것이 단방향 폐 루프라면, 이것은 잘 동작 할 것이고 구현하기가 쉽지 않을 것입니다. 마지막 몇 델타를 평균하여 차량의 진행 각을 부드럽게 할 수 있습니다. 또한 각 픽셀은 하나의 "단계"가되므로 속도 제어가 쉽습니다.

앞의 경우 시작/중지 위치 또는 관심 지점에 대해 특별히 태그가 지정된 끝점을 가질 수 있습니다. 후자의 경우 특수 노드의 경로에 다른 색상의 픽셀을 사용하십시오. 두 경우 모두 표시되는 내용은 기본 경로 데이터가 아니지만 일부는 "공원"의 표현을 미리 보여줍니다.

가장 쉬운 것은 무엇이든 선택하고 다음 경로 위치로 이동하고 자동차가 움직일 때마다 차량 방향을 업데이트하는 tick() 함수를 작성하십시오. 당신이 정말로 똑똑하다면, 반경 기반 충돌 처리를 할 수 있으므로 트랙 앞의 차량이 정지했을 때 자동차가 자동으로 멈추게됩니다.