【问题标题】:Draw a Hilbert curve by recursion通过递归绘制希尔伯特曲线
【发布时间】:2017-08-31 00:30:43
【问题描述】:

我需要在六阶绘制希尔伯特曲线,但我的程序仅适用于一阶。我认为旋转(或一切)有问题,但究竟是什么?非常感谢您的帮助。

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);

}

【问题讨论】:

    标签: java recursion turtle-graphics


    【解决方案1】:

    HilbertCurve() 中的分形代码分支看起来不错,所以我猜这个问题与您在 main() 方法中计算 step 有关。

    这是一种不同的方法,我使用worldCoordinates() 更改坐标系以匹配问题(否则您需要知道窗口的大小——您在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
    

    输出

    【讨论】:

      猜你喜欢
      • 2018-08-16
      • 1970-01-01
      • 2019-04-14
      • 2016-08-15
      • 2023-04-09
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      相关资源
      最近更新 更多