计算希尔伯特曲线的 XY 到 D(转换 C 代码)

Calculate XY to D for hilbert curve (Convert C code)

我正在尝试将这段代码从 this wikipedia article 从 C 转换为 Delphi。

//convert (x,y) to d
int xy2d (int n, int x, int y) {
    int rx, ry, s, d=0;
    for (s=n/2; s>0; s/=2) {
        rx = (x & s) > 0;
        ry = (y & s) > 0;
        d += s * s * ((3 * rx) ^ ry);
        rot(s, &x, &y, rx, ry);
    }
    return d;
}

我找不到与那里使用的 rot 函数等效的函数

这个rot不是标准函数。相反,它是您正在翻译的代码的一部分。您只需要继续阅读您 link 阅读的文章。几行你会发现这个:

//rotate/flip a quadrant appropriately
void rot(int n, int *x, int *y, int rx, int ry) {
    if (ry == 0) {
        if (rx == 1) {
            *x = n-1 - *x;
            *y = n-1 - *y;
        }

        //Swap x and y
        int t  = *x;
        *x = *y;
        *y = t;
    }
}

您需要将此函数与问题中的代码一起翻译。我相信你不需要我来翻译这么简单的功能。

我想说的是 rxry 确实是布尔值,您最好以这种方式对它们进行编码。本文中的代码是以 C 风格编写的,早于 C 布尔类型。也就是说,问题中的函数对这些 "booleans" 执行算术运算,因此编写一个干净的直译有点棘手。

作为指针传递的参数可能比作为 var 参数更好,因此通过引用传递。又是 C 所缺乏的一个特性。

您可以使用 Var 关键字在 Delphi 中通过引用传递函数,这与在链接的 C 代码中传递指向整数的指针的结果相同:

procedure Rot(N : Integer; RX, RY : Boolean; Var X, Y : Integer);
 var
   T : Integer;
 begin
   If Not RY then
   begin
     If RX then
     begin
       X := N - 1 - X;
       Y := N - 1 - Y;
     end;
       T := X;
       X := Y;
       Y := T;
   end;
 end;

请注意,参数顺序已更改。我将按引用传递的参数和按值传递的参数分组在一起。您可以对 RX 和 RY 使用布尔值而不是整数(不过请确保适当地调整调用代码)。