Итак, я программирую рекурсивную программу, которая должна нарисовать снежинки Коха с использованием OpenGL, и у меня есть программа, в основном работающая, за исключением одной крошечной проблемы. Чем глубже рекурсия, тем больше получаются две особые вершины. Картинки внизу.Небольшая ошибка в реализации снежинки Коха
EDIT: Меня не интересует аспект OpenGL, у меня есть эта часть. Если вы не знаете OpenGL, все, что делает glVertex, это провести линию между двумя вершинами, указанными в двух вызовах метода. Притворите его 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 (Все хорошо):
N = 1 (Может быть, немного Бенди, возможно)
N = 5 (WAT)
Без знания алгоритма: Это может быть проблема с двойной ошибкой. –