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

时间:2015-08-13 05:59:07

标签: c delphi hilbert-curve

我正在尝试将这段代码从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;
}

我找不到与那里使用的腐烂函数相当的

2 个答案:

答案 0 :(得分:2)

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

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,您可以使用布尔值而不是整数(请确保您正确调整调用代码)。

答案 1 :(得分:0)

rot不是标准功能。相反,它是您正在翻译的代码的一部分。您只需要继续阅读您链接的文章。您可以在以下几行找到:

//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类布尔类型。也就是说,问题中的函数对这些“布尔值”执行算术运算,因此编写一个干净的字面翻译有点棘手。

作为指针传递的参数可能更好作为var参数,因此通过引用传递。再一个C缺乏的功能。