5 replies to this topic

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?

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?

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

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.

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

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;

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;

Posted 23 August 2012 - 10:28 PM

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

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