Banach分形曲线Java-递归

Banach分形曲线Java-递归,java,recursion,curve,fractals,Java,Recursion,Curve,Fractals,我有以下Banach分形问题: 可以使用以下分形规则生成所谓的Banach曲线: 画一个圆圈 画9个小圆圈,每个圆圈都有一个半径⅓ 原版的 圆圈其中一个较小的圆的中心应与原始圆的中心相同。其余部分的中心 8个较小的圆应沿原始圆的圆周等距分布 对每个较小的圆圈重复步骤b 注:以点(x,y)为中心半径r的圆是所有点的集合 (x+r·cos(t),y+r·sin(t)),其中0≤ T≤ 2π,t以弧度表示。我可以使用Math.toRadians() 准则: 仅限递归解决方案,不允许循环 没有导入&没

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

  • 画一个圆圈
  • 画9个小圆圈,每个圆圈都有一个半径⅓ 原版的 圆圈其中一个较小的圆的中心应与原始圆的中心相同。其余部分的中心 8个较小的圆应沿原始圆的圆周等距分布
  • 对每个较小的圆圈重复步骤b
  • 注:以点(x,y)为中心半径r的圆是所有点的集合 (x+r·cos(t),y+r·sin(t)),其中0≤ T≤ 2π,t以弧度表示。我可以使用
    Math.toRadians()
    准则:

    • 仅限递归解决方案,不允许循环
    • 没有导入&没有列表(因此没有地图或其他)&没有
    • 我只能使用函数
      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--);
    
        }
    
    我的输出: Banach曲线的阶段:

    每次调用
    n--
    时,都将
    n
    传递给函数,然后在下次调用时将其递减1。相反,您需要将
    n-1
    传递给每个调用,因为调用本身将在其自己的递归调用中进一步递减
    n
    ,最终在
    0
    处停止,正如您正确地所做的那样

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

    假设
    x
    y
    标记圆的中心,则函数将变为:

    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)的输出;


    每次调用
    n--
    时,您都会将
    n
    传递给函数,然后在下一次调用中将其递减一。相反,您需要将
    n-1
    传递给每个调用,因为调用本身将在其自身的递归调用中进一步递减
    n
    ,最终在
    0
    处停止,正如您正确所做的那样。

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

    假设
    x
    y
    标记圆的中心,则函数将变为:

    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)的输出;


    如果要将
    Math.cos()
    拖到图片中,a la是当前公认的答案,为什么不全力以赴,使用正弦和余弦绕圆圈移动:

    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);
    
        banachCurve (x, y, d, n - 1); // center
    
        for (double angle = 0; angle < 360; angle += 45) {
            double theta = Math.toRadians(angle);
            double dx = x + d * Math.cos(theta);
            double dy = y + d * Math.sin(theta);
    
            banachCurve (dx, dy, d, n - 1);
        }
    }
    
    private静态void-banachCurve(双x,双y,双r,int-n){
    如果(n==0){
    返回;
    }
    双d=r/3;
    标准圆(x,y,d);
    banach曲线(x,y,d,n-1);//中心
    用于(双角度=0;角度<360;角度+=45){
    双θ=数学环面(角度);
    双dx=x+d*Math.cos(θ);
    双dy=y+d*Math.sin(θ);
    banach曲线(dx,dy,d,n-1);
    }
    }
    
    banachCurve(0.5,0.5,1,3)的输出;

    这种方法可以很容易地测试@tucuxi的建议,将周围的八个圆圈改为六个。只需将
    for
    循环中的增量角度从45增加到60:

    虽然我不能说这是对原始设计的改进。尽管考虑到这种代码设计,七个周边的圆圈同样微不足道,但它吸引了人们的眼球:


    如果要将
    Math.cos()
    拖到图片中,a la是当前公认的答案,为什么不全力以赴,使用正弦和余弦绕圆圈移动:

    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);
    
        banachCurve (x, y, d, n - 1); // center
    
        for (double angle = 0; angle < 360; angle += 45) {
            double theta = Math.toRadians(angle);
            double dx = x + d * Math.cos(theta);
            double dy = y + d * Math.sin(theta);
    
            banachCurve (dx, dy, d, n - 1);
        }
    }
    
    private静态void-banachCurve(双x,双y,双r,int-n){
    如果(n==0){
    返回;
    }
    双d=r/3;
    标准圆(x,y,d);
    banach曲线(x,y,d,n-1);//中心
    用于(双角度=0;角度<360;角度+=45){
    双θ=数学环面(角度);
    双dx=x+d*Math.cos(θ);
    双dy=y+d*Math.sin(θ);
    banach曲线(dx,dy,d,n-1);
    }
    }
    
    banachCurve(0.5,0.5,1,3)的输出;

    这种方法可以很容易地测试@tucuxi的建议,将周围的八个圆圈改为六个。只需将
    for
    循环中的增量角度从45增加到60:

    虽然我不能说这是对原始设计的改进。尽管考虑到这种代码设计,七个周边的圆圈同样微不足道,但它吸引了人们的眼球:


    谢谢,但是对于n=6(即图),每次输出5圈,它只关注中心圆,而不是舞台2@Yuki1112我刚刚测试了我自己的代码(我修复了答案中的
    diagD
    计算),它对我很有效。不过,谢谢你