2013-10-31 2 views
0

마우스/스크린 좌표를 등각 투상 인덱스로 변환하는 데 어려움을 겪고 있습니다. 나는 여기 또는 인터넷에서 찾을 수있는 모든 공식을 시도했지만 그 중 아무 것도 작동하지 않거나 뭔가를 놓치고 있습니다. http://i.imgur.com/HnKpYmG.png 다음 그림은 원점이 왼쪽 상단에 있고 한 타일의 크기가 128x64 픽셀입니다.등각 투영 좌표로의 화면 좌표

감사합니다. 감사합니다.

답변

3

기본적으로 몇 가지 다른 비트가있는 회전 행렬을 적용해야합니다.

END { 
    PI = 3.1415; 
    x = 878.0; 
    y = 158.0; 

    # Translate one origin to the other 
    x1 = x - 128*5; 
    # Stretch the height so that it's the same as the width in the isometric 
    # This makes the rotation easier 
    # Invert the sign because y is upwards in math but downwards in graphics 
    y1 = y * -2; 

    # Apply a counter-clockwise rotation of 45 degrees 
    xr = cos(PI/4)*x1 - sin(PI/4)*y1; 
    yr = sin(PI/4)*x1 + cos(PI/4)*y1; 

    # The side of each isometric tile (which is now a square after the stretch) 
    diag = 64 * sqrt(2); 
    # Calculate which tile the coordinate belongs to 
    x2 = int(xr/diag); 
    # Don't forget to invert the sign again 
    y2 = int(yr * -1/diag); 

    # See the final result 
    print x2, y2; 
} 

내가 몇 가지 다른 좌표를 테스트하고 결과가 올 것 : 여기에 다른 언어에 포트에 쉽게해야 AWK로 작성된 몇 가지 예제 코드입니다.

+0

완벽하게 작동 해 주셔서 감사합니다. – Hnus

+0

위대한 분들은 만족 스럽다면 대답을 수락하는 것을 잊지 마십시오. – acfrancis

+1

노골적인 코멘트. PI를위한 소수점 네 번째 자리는 실제로 중요하지 않지만, 당신은 그것을 올바르게 가져야합니다 : 3.14159 ... 3.1416으로 반올림합니다. –

0

나는 acfrancis로 해답을 시도했는데, 음수 인덱스에 대해서는 함수의 한계가 있다는 것을 알았습니다. 누군가 다른 사람이이 문제를 해결할 경우를 대비해서 : 발행 사유 : -1.1 ....과 같은 음수 값은 -1 대신 0으로 변환됩니다. 배열에 대한 고전적인 "유일한 영"문제가 있습니다.

것은 해결하기 : (X2)를 주조하기 전에, Y2 값을 int로 : 체크 XR/DIAG < 0, 진정한 결과 = 결과 만약 있다면 - 1 (각각 Y2를 들어 연간 * -1/DIAG < 0 then result = result -1) 그런 다음 이전과 같이 결과 값을 int로 캐스트합니다.

희망이 있습니다.

덧붙여서 : 128 * 5로 원점을 번역 한 것은 특정한 경우에 해당하므로이 기능을 일반화하기 위해 제거해야한다고 생각합니다.

관련 문제