Search code examples
2dcoordinatesprojectiontileisometric

Screen coordinates to isometric coordinates


I'm struggling at converting mouse/screen coordinates to isometric tile index. I have tried about every formula I could find here or on internet but none of them seems to work or I am missing something.

enter image description here

Here is a picture, origin is in the top left corner and dimensions of one tile are 128x64px.

I would appreciate any help, thanks.


Solution

  • Basically, you need to apply a rotation matrix with a few other bits. Here's some sample code written in AWK which should be easy to port to any other language:

    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;
    }
    

    I tested it with a few different coordinates and the results seem correct.