Получение верхнего левого положения плитки внутри набора плиток

У меня есть набор плиток (изображение, полное других маленьких изображений). И я хочу получить одно из этих маленьких изображений, называемых тайлами, чтобы я мог что-то с ним сделать. Я знаю размер каждой плитки (все они одного размера). У меня есть два уравнения:

x = (i % tiles_hor) * tile_h
y = (i % tiles_ver) * tile_w

x = (i % tiles_hor) * tile_w
y =  (i / tiles_hor) * tile_w

где i означает индекс плитки, которую я хочу получить;
tiles_hor — количество тайлов по горизонтали;
tiles_ver — количество плиток по вертикали;
tile_w и tile_h — ширина и высота каждой плитки внутри набора плиток соответственно;

Плитки получают свой индекс последовательно, вот так:

01 02 03 04 05 
06 07 08 09 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

Таким образом, каждая пара цифр — это индекс плитки внутри набора плиток. Допустим, я хочу получить плитку 04 (при условии, что каждая плитка имеет размер 32x32): с первым уравнением:

x = (4 % 5) * 32 = 128. Таким образом, позиция x внутри изображения равна 128
y = (4 % 5) * 32 = 0. Таким образом, y внутри изображения равна 0;

со вторым уравнением:
x = (4 % 5) * 32 = 128. Таким образом, позиция x внутри изображения равна 128
y = (4 / 5) * 32 = 0. Здесь 0, потому что мы сначала округляем первое выражение до ближайшего младшего числа (я не знаю, верно ли мое выражение. Пожалуйста, поправьте меня, если это не так).

Обратите внимание, что мы рассматриваем идеальный квадратный набор плиток (в данном случае 5x5).

Мой вопрос:
Второй вариант работает в большинстве случаев. Первые перестают работать при отсутствии идеальных квадратов тайлсета и при большой высоте. Так что я там делаю не так?

Кроме того, как уравнение, которое выдает действительно важное значение (tiles_ver и tile_h), может быть правильным? Что мне там не хватает?


person Patrick Bassut    schedule 28.07.2012    source источник


Ответы (1)


person    schedule
comment
а что если вместо того, чтобы рассматривать tile_h, не рассматривать вообще, как это сделано в посте. Что это может принести мне в краткосрочной или долгосрочной перспективе? - person Patrick Bassut; 28.07.2012
comment
если tile_w == tile_h, то вы можете просто использовать tile_w. в противном случае вам нужно рассмотреть их обоих. - person perreal; 28.07.2012
comment
На самом деле tile_w != tile_h. Я хотел пример, в котором игнорирование tile_h могло бы испортить результат. Можете ли вы увидеть любой? - person Patrick Bassut; 28.07.2012
comment
конечно, если tile_h равен 1, а tile_w равен 32, и если вы хотите вычислить тайл 25, ни одно из ваших уравнений не будет работать. - person perreal; 28.07.2012
comment
на самом деле будет. Причина y = (25/32) * 32 = 0 * 32 = 0 - person Patrick Bassut; 28.07.2012
comment
а почему вы делите на 32? tile_hor равен 5. - person perreal; 28.07.2012
comment
я имел в виду в примере, который вы только что привели в своем предыдущем комментарии. - person Patrick Bassut; 28.07.2012
comment
используя ваше второе уравнение: y = (25/5) * 32 = 160. Используя мое уравнение: ((25 - 1)/5) * 1 = 4. - person perreal; 28.07.2012