だから私は、OpenGL を使用して Koch の雪片を描画することになっている再帰的なプログラムをプログラミングしています。1 つの小さな問題を除いて、プログラムは基本的に機能しています。再帰が深くなるほど、特定の 2 つの頂点が得られなくなります。下の写真。
編集: OpenGL の側面はあまり気にしません。その部分は省略しました。OpenGL を知らない場合、glVertex が行うことは、2 つのメソッド呼び出しで指定された 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 (ワット)