# Rendering an isometric tilemap

I have a tile which is 512x256 pixels and I'm trying to render it in an isometric fashion.

I have this helper function:

Pos cartToIso(Pos p) {
xa := p.x - p.y;
ya := (p.x + p.y) / 2;
return new Pos(xa, ya);
}


And to render I do this:

// note this is smaller than the image since
// it's being scaled down
const tileWidth = 256;
const tileHeight = tileWidth / 2;

for (int y = 0; y < 32; y++) {
for (int x = 0; x < 32; x++) {
int ya = y * tileWidth;
int xa = x * tileHeight;
Pos p = cartToIso(xa, ya);

drawImage(grassTile, p.x, p.y, tileWidth, tileHeight);
}
}


This nearly works but there is a big black gap around the tiles. It's fixed when I change the rendering to this:

// note this is smaller than the image since
// it's being scaled down
const tileWidth = 256;
const tileHeight = tileWidth / 2;

for (int y = 0; y < 32; y++) {
for (int x = 0; x < 32; x++) {
int ya = y * tileHeight; // <- here!
int xa = x * tileHeight;
Pos p = cartToIso(xa, ya);

drawImage(grassTile, p.x, p.y, tileWidth, tileHeight);
}
}


But why? This seems to be counter-intuitive compared to what the isometric 2d tutorials I have read have said.

Is there a flaw to my rendering logic?