01.04.2013, 13:25
Сидел скучал на паре. Может кому-то пригодится.
Переводим двухмерные координаты в одномерные. Основан на спиралевидном наращивании.
Его преимущество: "бесконечность", в то время, когда у змейки нужно задавать определённые границы.
Преобразование двухмерные координаты в одномерные. Вернёт число(позицию в спирали);
Преобразование одномерные координаты в двухмерные. Вернёт число(x,y);
Переводим двухмерные координаты в одномерные. Основан на спиралевидном наращивании.
Его преимущество: "бесконечность", в то время, когда у змейки нужно задавать определённые границы.
Преобразование двухмерные координаты в одномерные. Вернёт число(позицию в спирали);
PHP Code:
stock GetSpiralPosFrom(x,y)
{
new k, z=1;
//================= Находим виток
if(x > 0)k=x; else k=-x;
if(y > 0){if(y > k)k=y;} else if(y < -k) k=-y;
//================= Находим позицию начала витка
for(new j; j < k; j++) z+=j*8;
//================= Находим позицию в витке и прибавляем к начальной позиции.
if(y == k) return z+=(k*7)+x;
if(y == -k) return z+=(k*3)-x;
if(x == -k) return z+=(k*5)+y;
return z+=k-y;
}
PHP Code:
stock GetXYPosFrom(spiral, &x,&y)
{
new k, z=1;
//================= Находим начало нового витка
for(; z < spiral; k++) z+=k*8;
if(!k){x=0; y=0; return 1;} else k--;
//================= Находим позицию в витке
z-=(k*2); if(spiral >= z){y=k; x=spiral-z-k; return 1;}
z-=(k*2); if(spiral >= z){x=-k; y=spiral-z-k; return 1;}
z-=(k*2); if(spiral >= z){y=-k; x=k-(spiral-z); return 1;}
z-=(k*2); if(spiral >= z){x=k; y=k-(spiral-z); return 1;}
return 1;
}