• Create Account

## Map Coordinates

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

5 replies to this topic

### #1BuckyOHare486  Members

Posted 22 August 2012 - 06:20 AM

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?

### #2Juliean  GDNet+

Posted 22 August 2012 - 06:34 AM

//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.

Edited by The King2, 22 August 2012 - 06:35 AM.

### #3BuckyOHare486  Members

Posted 22 August 2012 - 08:18 AM

[code=auto:0]
//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.

### #4Juliean  GDNet+

Posted 22 August 2012 - 09:31 AM

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..

Edited by The King2, 22 August 2012 - 09:31 AM.

### #5Exessuz  Members

Posted 23 August 2012 - 01:04 PM

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;

### #6Bacterius  Members

Posted 23 August 2012 - 10:28 PM

[code=auto:0]
//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.

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.

Edited by Bacterius, 23 August 2012 - 10:30 PM.

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

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.