마우스 좌표를 아이소 메트릭 인덱스로 변환하는 방법?


21

타일 64x32 로 아이소 메트릭 맵을 그립니다 .

const Offset = 160;
int X, Y;

for (int a=0; a < 6; a++)
  for (int b=0; b < 6; b++) {
    X = a * 32 - b * 32 + Offset;
    Y = a * 16 + b * 16;
    DrawTile(X, Y, tile);
  }

이 코드를 보여주는 이미지 :

이 코드를 보여주는 이미지 :

전문가 여러분, 셀의 아이소 메트릭 인덱스에서 마우스 좌표 변환 공식을 도와주십시오. 예 : (105; 100)-> [1; 4].



사이드 노트 : 당신이 실제로하지 않으면 원하는 같이, 당신이 증가하고 변수의 이전 값에 액세스 할 수 while(val = arr[i++])비슷한 구조이나, 사용하지 마십시오 . 사용 ++a하고 ++b대신.
Martin Sojka

답변:


25

타일 ​​공간 좌표에서 화면 공간 좌표로 의 변환 행렬결정한 다음 이를위한 역행렬계산해야합니다. 역행렬 은 화면 공간 좌표에 적용될 때 타일 공간 좌표로 변환됩니다.

그건 그렇고 : 오프셋은 실제로 모든 좌표 시스템에서 (0.0, 1.0) 인 장소를 가리키고 있지만 큰 문제는 아니며 명심해야 할 문제입니다. 이는 변환 된 좌표계 ​​원점의 오프셋이 (오프셋 + 32, 0)에 있음을 의미합니다.


구체적인 경우

타일 ​​공간 (a, b) 좌표를 화면 공간 (x, y) 좌표로 변환하기 위해 기본적으로 수행하는 작업은 다음 변환 매트릭스를 통해 실행하는 것입니다.

여기에 이미지 설명을 입력하십시오

정의 : 타일 ​​(0, 0)의 ab 는 [0.0, 1.0) 범위에 있으며 (0.0, 0.0)은 위쪽 모서리, (1.0, 1.0) 아래쪽 모서리, (0.0, 1.0) 왼쪽 모서리 화면 공간의 오른쪽 모서리 (1.0, 0.0).

변환을 행렬에 통합 할 수 있도록 좌표 정의를 상수 세 번째 좌표 (항상 정확히 1 임)로 확장합니다.

이제이 변환에 대한 역행렬을 만들 수 있습니다 . 기본 공식은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

... CA에 대한 보조 인자행렬입니다 .

귀하의 경우 결정 요인 | A | 오프셋에 관계없이 항상 1024이므로 역행렬은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


계산 예

이제 예제 데이터를 위해 ...

수식에 오프셋의 숫자를 넣으면 다음과 같은 결과가 나타납니다.

여기에 이미지 설명을 입력하십시오

(105, 100, 1) (화면 좌표)에 행렬을 곱하면 다음을 얻을 수 있습니다.

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

세 번째 좌표는 항상 1이므로 계산할 필요가 없습니다. 가장 가까운 정수로 내림하면 예상대로 타일 공간 좌표로 (1, 4)가 표시됩니다.


일반 차원 투영 행렬

각 타일의 너비가 2w (예 : 64, w = 32)이고 높이가 2 시간 (예 : 32, 따라서 h = 16)이고 원점의 오프셋 이 이와 같은 원근법이 있는 경우 가로 및 세로 축에 대해 화면 공간이 각각 f x 및 f y (예 : 192 및 0) 인 경우 행렬은 다음과 같습니다.

화면 공간에 타일 공간

여기에 이미지 설명을 입력하십시오

공간을 타일로 묶는 화면 공간

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.