当前位置: 首页 > 知识库问答 >
问题:

Banach分形曲线Java递归

徐昆
2023-03-14

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

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

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

  • 仅递归解决方案,不允许循环
  • 无导入

我想过每次添加圆圈,因为每次都应该有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--);

    }

共有2个答案

锺离韬
2023-03-14
匿名用户

如果要拖动数学。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);
    }
}

banachCurve的输出(0.5、0.5、1、3)

这种方法可以轻松测试@tucuxi的建议,即六个而不是八个周围的圆圈。只需将for循环中的增量角度从45增加到60:

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

康元凯
2023-03-14

每次调用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)的输出:

 类似资料:
  • 例如,随机函数产生120个数字(0或1),这些相加值的平均值必须接近60。

  • 问题内容: 我正在尝试用Java绘制曲线。一个简单的以(X,Y)开始,(X,Y)结束和曲线量的贝塞尔曲线就足够了。 我找不到在Swing中执行此操作的方法。如果不在Swing中,我可以使用一些简单的数学方法吗?我将如何在Swing中实现它? 编辑:我知道如何通过重写paint(Graphics g)方法绘制形状和线条。 问题答案: 您可以使用Java 2D Object Path2D.Double

  • 求大佬解答一下, 只做过简单的曲线积分例题, 这题解不了。

  • 规则的曲线比如圆、椭圆、抛物线都可以用一个函数去描述,对于不规则的曲线无法使用一个特定的函数去描述,这也就是样条曲线和贝塞尔曲线出现的原因。Threejs提供了这两种曲线的API,不需要自己封装,如果你想深入研究可以学习计算机图形学。 一条光滑样条曲线案例 在三维空间中设置5个顶点,输入三维样条曲线CatmullRomCurve3作为参数,然后返回更多个顶点,通过返回的顶点数据,构建一个几何体,通

  • 主要内容:JavaFX曲线,QuadCurveJavaFX曲线 要创建三次曲线,请使用适当的构造函数。 设置三次曲线的主要参数是,,controlX1(控件点1X),controlY1(控件点1Y),controlX2(控件点2X)和controlY2(控件点2Y),,。 ,,和参数是曲线的起点和终点。,,和是控件点。 控制点(控制X1,控制Y1)影响线起点(startX,startY)和中间点之间的线段。控制点(controlX2,cont

  • SVG 曲线 - <polyline> 实例 1 <polyline> 元素是用于创建任何只有直线的形状:Sorry, your browser does not support inline SVG. 下面是SVG代码:<svg xmlns="http://www.w3.org/2000/svg" version="1.1"> <polyline points="20,20 40,25 60,4