Search code examples
javamathfractals

Small bug in Koch's Snowflake Implementation


So I'm programming a recursive program that is supposed to draw Koch's snowflake using OpenGL, and I've got the program basically working except one tiny issue. The deeper the recursion, the weirder 2 particular vertices get. Pictures at the bottom.

EDIT: I don't really care about the OpenGL aspect, I've got that part down. If you don't know OpenGL, all that the glVertex does is draw a line between the two vertices specified in the 2 method calls. Pretend its drawLine(v1,v2). Same difference.

I suspect that my method for finding points is to blame, but I can't find anything that looks incorrect.

I'm following the basically standard drawing method, here are the relevant code snips

(V is for vertex V1 is the bottom left corner, v2 is the bottom right corner, v3 is the top corner):

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

Recursive method:

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

}

I really suspect my math is the problem, but this looks correct to me:

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 (All is well):

enter image description here

N = 1 (Perhaps a little bendy, maybe)

enter image description here

N = 5 (WAT)

enter image description here


Solution

  • So, it turns out I am the dumbest man alive.

    Thanks everyone for trying, I appreciate the help.

    This code is meant to handle an equilateral triangle, its very specific about that (You can tell by the angles).

    I put in a triangle with the height equal to the base (not equilateral). When I fixed the input triangle, everything works great.