Преобразовать точку в расстояние по трехмерной кривой Гильберта?
Я пытаюсь написать функцию, которая вычисляет расстояние вдоль точки, которая появляется вдоль трехмерной кривой Гильберта. По сути, это функция, которая может принимать координаты x, y, z точки и вычислять, где на кривой она появляется. Предположим, что x, y и z могут быть целыми числами от 0 до 255, примерно соответствующими цветовому пространству RGB. Таким образом, я могу создать упорядоченный список точек на основе кривой Гильберта.
Я попытался реализовать приведенный здесь код о переполнении стека, однако это застревает в рекурсивном цикле, когда я пытаюсь написать его на C#, более того, я не совсем такой. Я также пытался реализовать этот код, однако, я должен неправильно его понять, потому что он дает мне то, что кажется совершенно случайным результатом.
В настоящее время я следую этому руководству и прошел кодирование раздела, когда речь заходит о сером коде. Тем не менее, я застрял, когда дело доходит до расчета примера с вращением. В таблице я не уверен, как получается итоговое число между chnk, вращением и флипбитом.
Я студент информатики с небольшим математическим образованием.
Ниже приведен пример кода, который у меня есть
//This might be a little more than graycode??
public long GreyCode()
{
//convert the integers in the point to a binary representation of them
string bx = Convert.ToString(Convert.ToInt32(x), 2).PadLeft(16, '0');
string by = Convert.ToString(Convert.ToInt32(y), 2).PadLeft(16, '0');
string bz = Convert.ToString(Convert.ToInt32(z), 2).PadLeft(16, '0');
//store the binary values in an array to iterate over
int[] bxArr = bx.Select(c => c - '0').ToArray();
int[] byArr = by.Select(c => c - '0').ToArray();
int[] bzArr = bz.Select(c => c - '0').ToArray();
//call a function that will iterate over each one xoring every bit together
//Xor's each bit by it's neighboring bit to the right
//until it reaches the end of the array
bxArr = XorArray(bxArr);
byArr = XorArray(byArr);
bzArr = XorArray(bzArr);
//This is a magic number and I don't understand it tbh
int rank = 4;
//Using rank, combine the arrays and flip every rankth bit
int[] combined = (bxArr.Concat(byArr).ToArray()).Concat(bzArr).ToArray();
int[] bitArr = FlipBits(rank, combined);
//rotations and stuff
//finally, convert to integer and store
string resStr = string.Join("", bitArr);
long ret = Convert.ToInt64(resStr, 2);
return ret;
}