所以我正在编写一个递归程序,该程序应该使用 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(一切正常):
N = 1(也许有点弯曲,也许)
N = 5 (WAT)