计算希尔伯特曲线的 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;
}
}
您需要将此函数与问题中的代码一起翻译。我相信你不需要我来翻译这么简单的功能。
我想说的是 rx
和 ry
确实是布尔值,您最好以这种方式对它们进行编码。本文中的代码是以 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 使用布尔值而不是整数(不过请确保适当地调整调用代码)。
我正在尝试将这段代码从 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;
}
}
您需要将此函数与问题中的代码一起翻译。我相信你不需要我来翻译这么简单的功能。
我想说的是 rx
和 ry
确实是布尔值,您最好以这种方式对它们进行编码。本文中的代码是以 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 使用布尔值而不是整数(不过请确保适当地调整调用代码)。