java - Banach 分形曲线 Java - 递归

标签 java recursion curve fractals

我有以下巴拿赫分形问题: 所谓的巴纳赫曲线可以使用以下分形规则生成:

  1. 画一个圆圈。
  2. 画 9 个较小的圆,每个圆的半径是原来的 ⅓ 圆圈。较小的圆之一应与原始圆具有相同的中心。其余的中心 8 个较小的圆应沿原圆的圆周等距排列。
  3. 对每个较小的圆圈重复步骤 b。

注:以(x,y)点为圆心,半径为r的圆是所有点的集合 (x + r · cos(t), y + r · sin(t)) 其中 0 ≤ t ≤ 2π ,并且 t 以弧度给出。我可以使用Math.toRadians() 指南:

  • 仅递归解决方案,不允许循环
  • 没有进口,没有列表(所以没有 map 之类的),没有?
  • 我只能使用函数public static void banachCurve(int n)和帮助功能private static void banachCurve(double x, double y, double r, int n)
    • 只能使用 StdDraw 来绘制或调用其他函数,不允许使用其他 Std 类

我想每次都添加圆圈,因为每次应该在边缘有 9 个圆圈,在中心有 1 个圆圈,但是我似乎只能在右侧或左侧获得圆圈,并且由于某种原因出现运行时错误。

public static void banachCurve(int n) {

        banachCurve (0.5,0.5,1,n);
    }

    private static void banachCurve(double x, double y, double r, int n) {
       if (n == 0) {
           return;
       }
       double d = (r/3);
       StdDraw.circle (x,y,d);
//       StdDraw.ellipse(x, y, r, r);
       banachCurve (x + d, y, d, n - 1); // centre
       banachCurve (x + d+ d, y+d, d, n--); // left
       banachCurve (x , y + d, d, n--); // right
       banachCurve (x+d , y +d+ d, d, n--);
        banachCurve (x+d , y +d, d, n--);

    }

我的输出: my output 巴纳赫曲线的阶段: Stages of Banach Curve

最佳答案

每次您调用 n-- ,您正在通过n到该函数,然后在下一次调用时将其减一。相反,您需要传递 n - 1对于每个调用,因为调用本身会递减 n进一步进行自己的递归调用,最终停在 0正如你所正确的那样。

对于四个基点,使用(x + d, y) , (x, y + d) , (x - d, y)(x, y - d)工作正常,但对于四个对角点,您需要使用毕达哥拉斯方法的平方根 ( Math.sqrt ),或三角方法的正弦和余弦 ( Math.sinMath.cos )。使用(x + d, y + d)等会将它们放在一个正方形上。

假设xy标记你的圆的中心,你的函数将变成:

private static void banachCurve(final double x, final double y, final double r, final int n) {
    if (n == 0) {
        return;
    }
    final double d = r / 3;
    StdDraw.circle (x, y, d);
    banachCurve (x, y, d, n - 1);     // centre
    banachCurve (x, y + d, d, n - 1); // north
    banachCurve (x + d, y, d, n - 1); // east
    banachCurve (x, y - d, d, n - 1); // south
    banachCurve (x - d, y, d, n - 1); // west
    // Get the diagonal radius for a point at 45 degrees on the circle
    final double diagD = Math.cos(Math.toRadians(45)) * d;
    banachCurve (x + diagD, y + diagD, d, n - 1); // north-east
    banachCurve (x + diagD, y - diagD, d, n - 1); // south-east
    banachCurve (x - diagD, y - diagD, d, n - 1); // south-west
    banachCurve (x - diagD, y + diagD, d, n - 1); // north-west
}

这是 banachCurve(0.5, 0.5, 1, 6); 的输出:

Banach Curve for recursion depth of 6.

关于java - Banach 分形曲线 Java - 递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53742173/

相关文章:

java - 奇怪的 Java 乘法递归与 StackOverFlow

java - 大 O 与递归

python - 绘制直方图的最佳拟合曲线

Java 接口(interface)中已弃用的方法是否必须实现?

java - 如何更改从 JSON Schema 生成的 POJO 的格式?

java - 使用文件名中的日期对文件进行排序

python - 如何平滑曲线?

java - 使用 GSON 将 Java 接口(interface)转换为 JSON 字符串,而不将序列化封装在 JSON 对象中?

c++ - 用于获取 vector 元素的所有组合的递归与位掩码

c# - 如何制作具有更多点的图形路径?