ну, про алгоритм - если глядеть на карту, то есть шесть самых крупных квадратов. Если перемещать между ними мышку, то можно заметить, что меняется только первый(после знака - или _) символ в имени файла. Причём левые четыре квадрата расположены таким образом, что символ меняется от 0 до 3 по часовой стрелке, на правых квадратах 4 и 5.
Если посмотреть на квадраты следующего порядка(тайлы в 4 раза меньше по длине), то видно, что там та же закономерность - существуют группы из 4 квадратов(2х2), в каждой из которых нумерация по часовой стрелке, начиная с левого верхнего, стартовый индекс группы равен 4*номер группы, то бишь последовательно, и группы эти, расположены по часовой стрелке, размером в 4х4 тайла текущего порядка, и составляют весь квадрат порядка выше. И так далее до восьмого(последнего) порядка, где размер квадрата 2х2 самых мелких тайлов и нумерация - 0,4,8,c. На каждом порядке меняется n-ный символ в хэше, где n==номер порядка. Перед хэшем в имени тайла всегда "_". Символ "-" используется по-моему только в RGE, на ненаселённых тайлах. Когда несколько тайлов объединены, в больший, то либо число порядков сокращается, либо нумерация порядка как у низшего - 0,4,8,c
Собсно, вот моя реализация) Записывает в name восьмисимвольный хэш(без "_") по координатам тайла из RE. Правда для тайлов расположенных в районе Австралии работать скорей всего не будет, не проверял
- Код: Выделить всё
void GetTileName(long tX,long tY,char* name){
long x,y;
memset(name,0,8);
int t=0,num_row,num_col; float tile_size=16384/2;
y=16383-unsigned(tY);
x=16384+unsigned(tX);
for(int i=0;i<8;i++,tile_size/=4){
num_row=(y/int(tile_size*2))%2;
num_col=(x/int(tile_size*2))%2;
t=4*num_col+4*num_row+8*(num_row^num_col&&num_row);
if(int(tile_size)){
num_row=(y/int(tile_size))%2;
num_col=(x/int(tile_size))%2;
t+=num_col+num_row+2*(num_row^num_col&&num_row);
};
switch(t){
case 0:name[i]='0';break;
case 1:name[i]='1';break;
case 2:name[i]='2';break;
case 3:name[i]='3';break;
case 4:name[i]='4';break;
case 5:name[i]='5';break;
case 6:name[i]='6';break;
case 7:name[i]='7';break;
case 8:name[i]='8';break;
case 9:name[i]='9';break;
case 10:name[i]='a';break;
case 11:name[i]='b';break;
case 12:name[i]='c';break;
case 13:name[i]='d';break;
case 14:name[i]='e';break;
case 15:name[i]='f';break;
};
};
name[8]=0;
};
©Ted )