所以我正在编写一个递归程序,使用OpenGL绘制Koch的雪花,并且除了一个小问题,程序基本上可以工作。递归越深,两个特定顶点就会变得更奇怪。底部有图片。
编辑:我并不真正关心OpenGL方面,我已经掌握了那部分。如果您不了解OpenGL,则所有glVertex做的就是在两个方法调用中指定的两个顶点之间绘制一条线。假装它是drawLine(v1,v2)。同样的区别。
我怀疑我的查找点的方法有问题,但我找不到任何看起来不正确的地方。
我遵循基本标准的绘图方法,以下是相关的代码片段(V代表顶点,V1是左下角,v2是右下角,v3是顶角):
编辑:我并不真正关心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)