Имея радиус и площадь круга в геометрии такси (окрестности фон Неймана), я хотел бы сопоставить все «поля» (буквы «o» на изображении) с индексами массива 1D и обратно.
Я хотел бы преобразовать индекс 1-го массива на основе 0 в координаты x, y и обратно (0, 0 предполагается в качестве центра).
o radius=0, area=1
o
ooo radius=1, area=5
o
o
ooo
ooooo radius=2, area=13
ooo
o
o
ooo
ooooo
ooooooo radius=3, area=25
ooooo
ooo
o
x, y = taxicab.circlePositionFromIndex(index, radius)
index = taxicab.circleIndexFromPosition(x, y, radius)
То, что я до сих пор достиг, этофункция, которая вычисляет координаты x, y путем итерации по кругу:
var _DIRECTIONS = [1, -1, -1, -1, -1, 1, 1, 1];
function indexToPosition(index, radius) {
var i = 0;
for (var r = 0; r <= radius; r++) {
var x = 0, y = r;
var direction = 0;
var segment = 0;
do {
if (i === index)
return [x, y];
segment += 1;
x += _DIRECTIONS[direction];
y += _DIRECTIONS[direction+1];
i += 1;
if (segment === radius) {
direction += 2;
segment = 0;
}
} while (x !== 0 || y !== r);
}
return -1;
};
Эта функция кажется слишком сложной для задачи, должен быть более простой способ.Также это работает только в одну сторону.
Для вычисления площади круга я использую эту функцию:
function area(radius) {
return 1 + 2 * radius * (radius + 1);
}