Map Coordinates

Started by
4 comments, last by Bacterius 11 years, 8 months ago
Hi,

I've been puzzling over how to convert X,Y coordinates of a 2D map into an ID and back again. I want to be able to do this so that I can determine which cell on a map grid has been clicked but also display the coordinates to the user as they'd expect them. I intend to use a 10 x 10 grid map to begin with and I know that X is "how many from left" and Y is "how many from top" but I just can't figure out the formula for converting them. Have any of you done this before? Also, what is the technical name for this site of grid-related mathematics?
Advertisement

//ID to x+y
x = ID/width
y = ID%width
//x+y to ID
ID = x+y*width


This is all you need. width is the width of your map, in that case 10.


//ID to x+y
x = ID/width


Leaves a remainder so I am flooring it but for ID '1' which should be coordinates 0,0 comes out as 0,1 while ID '34' is coming out as 3,4 but should be 3,3. I know I'm doing something wrong but can't see what. I'm testing this in Excel with the following formulas:

X = FLOOR([@ID]/10, 1)
Y = MOD([@ID], 10)

The grid is a 10 x 10 area and I have labelled both axis with 0 through to 10.
Ok, so if your ID starts at 1, you need to say @ID-1 before applying the formula, and when reversing, you afterwards need to add 1. I'd suggest having "0" as the first ID anyway..
if you want to make a 10 x 10 map , lets say that each tile is 32 x 32 px

i used to make a linear array holding all the tile ids

int width = 32;

short map[100]; -> 10x10

supposing that you are drawing Y first

for(int x =0 ; x < 10; x++){
for(int y =0 ; y < 10; y++){

RENDER()
}
}

int x = click.x / 32;
int y = click.y / 32;

then the tile is

int id = x*width + y;

map[id].selected;

[quote name='The King2' timestamp='1345638889' post='4972176']

//ID to x+y
x = ID/width


Leaves a remainder so I am flooring it but for ID '1' which should be coordinates 0,0 comes out as 0,1 while ID '34' is coming out as 3,4 but should be 3,3. I know I'm doing something wrong but can't see what. I'm testing this in Excel with the following formulas:

X = FLOOR([@ID]/10, 1)
Y = MOD([@ID], 10)

The grid is a 10 x 10 area and I have labelled both axis with 0 through to 10.
[/quote]
You have to use integer math here, e.g. integer division (always rounds down, so flooring is correct barring floating-point inaccuracies) and integer remainder (= modulo operation). This assumes your array starts at 0 and (0, 0) respectively, so offset as needed.

“If I understand the standard right it is legal and safe to do this but the resulting value could be anything.”

This topic is closed to new replies.

Advertisement