通过递归绘制希尔伯特曲线
Draw a Hilbert curve by recursion
我需要绘制六阶希尔伯特曲线,但我的程序只能用于一阶。我认为轮换(或一切)有问题,但究竟是什么?非常感谢您的帮助。
public class TurtleFractal {
public static void HilbertCurve(int n, Turtle fred, double step) {
if (n > 0) {
if (n % 2 == 1) {
fred.left(90);
HilbertCurve(n - 1, fred, step);
fred.forward(step);
fred.right(90);
HilbertCurve(n - 1, fred, step);
fred.forward(step);
HilbertCurve(n - 1, fred, step);
fred.right(90);
fred.forward(step);
HilbertCurve(n - 1, fred, step);
fred.left(90);
} else {
fred.right(90);
HilbertCurve(n - 1, fred, step);
fred.forward(step);
fred.left(90);
HilbertCurve(n - 1, fred, step);
fred.forward(step);
HilbertCurve(n - 1, fred, step);
fred.left(90);
fred.forward(step);
HilbertCurve(n - 1, fred, step);
fred.right(90);
}
}
}
public static void main(String[] args) {
Turtle fred = new Turtle(0, 0, 0);
//fred can go forward or turn to any angle
// 0,0-initial coordinates, 0-angle
fred.down();
int n = 2;
//n - curve size
double s = Math.pow(2, n - 2);
double step = 0.5 / (s * 3 + (s - 1));
//draw the curve
HilbertCurve(n, fred, step);
}
你在 HilbertCurve()
中的分形代码分叉看起来不错,所以我猜问题与你在 main()
方法中计算 step
有关。
这是一种不同的方法,我使用 worldCoordinates()
更改坐标系以匹配问题(否则你需要知道 window 的大小——你遗漏的东西你的 step
计算。)我还通过传递 90 或 -90 的角度值而不是分支 n
的奇偶校验,将 HilbertCurve()
的两半合并为一个。 (只是为了多样性。)
您的海龟库与我找到的不同,因此您需要相应地调整代码。在问这样的问题时,你应该说明你从哪里得到你的乌龟图书馆。
public class TurtleFractal {
public static void HilbertCurve(int n, Turtle turtle, double angle) {
if (n <= 0) return;
turtle.left(angle);
HilbertCurve(n - 1, turtle, -angle);
turtle.forward(1.0);
turtle.right(angle);
HilbertCurve(n - 1, turtle, angle);
turtle.forward(1.0);
HilbertCurve(n - 1, turtle, angle);
turtle.right(angle);
turtle.forward(1.0);
HilbertCurve(n - 1, turtle, -angle);
turtle.left(angle);
}
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
double s = Math.pow(2, n);
Turtle fred = new Turtle();
fred.worldCoordinates(0, 0, s, s);
fred.up();
fred.goTo(0.5, 0.5);
fred.down();
HilbertCurve(n, fred, 90.0);
}
}
用法
> java TurtleFractal 4
输出
我需要绘制六阶希尔伯特曲线,但我的程序只能用于一阶。我认为轮换(或一切)有问题,但究竟是什么?非常感谢您的帮助。
public class TurtleFractal {
public static void HilbertCurve(int n, Turtle fred, double step) {
if (n > 0) {
if (n % 2 == 1) {
fred.left(90);
HilbertCurve(n - 1, fred, step);
fred.forward(step);
fred.right(90);
HilbertCurve(n - 1, fred, step);
fred.forward(step);
HilbertCurve(n - 1, fred, step);
fred.right(90);
fred.forward(step);
HilbertCurve(n - 1, fred, step);
fred.left(90);
} else {
fred.right(90);
HilbertCurve(n - 1, fred, step);
fred.forward(step);
fred.left(90);
HilbertCurve(n - 1, fred, step);
fred.forward(step);
HilbertCurve(n - 1, fred, step);
fred.left(90);
fred.forward(step);
HilbertCurve(n - 1, fred, step);
fred.right(90);
}
}
}
public static void main(String[] args) {
Turtle fred = new Turtle(0, 0, 0);
//fred can go forward or turn to any angle
// 0,0-initial coordinates, 0-angle
fred.down();
int n = 2;
//n - curve size
double s = Math.pow(2, n - 2);
double step = 0.5 / (s * 3 + (s - 1));
//draw the curve
HilbertCurve(n, fred, step);
}
你在 HilbertCurve()
中的分形代码分叉看起来不错,所以我猜问题与你在 main()
方法中计算 step
有关。
这是一种不同的方法,我使用 worldCoordinates()
更改坐标系以匹配问题(否则你需要知道 window 的大小——你遗漏的东西你的 step
计算。)我还通过传递 90 或 -90 的角度值而不是分支 n
的奇偶校验,将 HilbertCurve()
的两半合并为一个。 (只是为了多样性。)
您的海龟库与我找到的不同,因此您需要相应地调整代码。在问这样的问题时,你应该说明你从哪里得到你的乌龟图书馆。
public class TurtleFractal {
public static void HilbertCurve(int n, Turtle turtle, double angle) {
if (n <= 0) return;
turtle.left(angle);
HilbertCurve(n - 1, turtle, -angle);
turtle.forward(1.0);
turtle.right(angle);
HilbertCurve(n - 1, turtle, angle);
turtle.forward(1.0);
HilbertCurve(n - 1, turtle, angle);
turtle.right(angle);
turtle.forward(1.0);
HilbertCurve(n - 1, turtle, -angle);
turtle.left(angle);
}
public static void main(String[] args) {
int n = Integer.parseInt(args[0]);
double s = Math.pow(2, n);
Turtle fred = new Turtle();
fred.worldCoordinates(0, 0, s, s);
fred.up();
fred.goTo(0.5, 0.5);
fred.down();
HilbertCurve(n, fred, 90.0);
}
}
用法
> java TurtleFractal 4
输出