java - 科赫雪花实现中的小错误

标签 java math fractals

所以我正在编写一个递归程序,该程序应该使用 OpenGL 绘制科赫雪花,并且我的程序基本上可以正常工作,除了一个小问题。递归越深,2个特定的顶点就越奇怪。图片在底部。

编辑:我真的不关心 OpenGL 方面,我已经把那部分记下来了。如果您不了解 OpenGL,glVertex 所做的就是在 2 个方法调用中指定的两个顶点之间画一条线。假装它的 drawLine(v1,v2)。一样的区别。

我怀疑我找点的方法有问题,但我找不到任何看起来不正确的东西。

我按照基本的标准绘图方法,这里是相关的代码片段

(V为顶点,V1为左下角,v2为右下角,v3为上角):

        double dir = Math.PI;
        recurse(V2,V1,n);

        dir=Math.PI/3;
        recurse(V1,V3,n);

        dir= (5./3.)* Math.PI ;
        recurse(V3,V2,n);

递归方法:

public void recurse(Point2D v1, Point2D v2, int n){
    double newLength = v1.distance(v2)/3.;
    if(n == 0){
        gl.glVertex2d(v1.getX(),v1.getY());
        gl.glVertex2d(v2.getX(),v2.getY());

    }else{

        Point2D p1 = getPointViaRotation(v1, dir, newLength);
        recurse(v1,p1,n-1);
        dir+=(Math.PI/3.);

        Point2D p2 = getPointViaRotation(p1,dir,newLength);
        recurse(p1,p2,n-1);
        dir-=(Math.PI*(2./3.));

        Point2D p3 = getPointViaRotation(p2, dir, newLength);
        recurse(p2,p3,n-1);
        dir+=(Math.PI/3.);

        recurse(p3,v2,n-1);
    }

}

我真的怀疑我的数学有问题,但这对我来说是正确的:

public static Point2D getPointViaRotation(Point2D p1, double rotation, double length){
    double xLength = length * Math.cos(rotation);
    double yLength = length * Math.sin(rotation);
    return new Point2D.Double(xLength + p1.getX(), yLength + p1.getY());
}

N = 0(一切正常):

enter image description here

N = 1(可能有点弯曲,也许)

enter image description here

N = 5(瓦特)

enter image description here

最佳答案

我看不到任何明显的代码问题。然而,我确实对发生的事情有一个理论。

似乎图中的所有点都是基于它之前的点的位置。因此,在此过程中发生的任何舍入误差最终都会开始累积,最终以失控和偏离正轨而告终。

我会为初学者做的是在递归之前计算每个段的起点和终点,以限制内部调用舍入误差的影响。

关于java - 科赫雪花实现中的小错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19131404/

相关文章:

java - 使用简单的 Runtime.getRuntime().exec(cmd) 时代码卡住

java - 在列表中添加新行时 Android 可扩展 ListView 帮助

math - float 学有问题吗?

c# - 如何从点(希尔伯特曲线)旋转图形?

java - 错误:任务 ':app:dexDebug'的执行失败。 > com.android.ide.common.process.ProcessException:

Java:如何优化读取/更新/写入许多小文件的内存占用?

c++ - 如何生成第n个只有偶数位的数?

math - 在什么时候数字的十六进制表示比十进制占用更少的字符?

蟒 turtle : Is it possible to use layers in fill command

netlogo - “Expecting a constant value” 构建NetLogo列表时出错