Преобразовать точку в расстояние по трехмерной кривой Гильберта? - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь написать функцию, которая вычисляет расстояние вдоль точки, которая появляется вдоль трехмерной кривой Гильберта.По сути, это функция, которая может принимать координаты 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;
    }
...