Quindi sto programmando un programma ricorsivo che dovrebbe disegnare il fiocco di neve di Koch usando OpenGL, e ho il programma fondamentalmente funzionante tranne un piccolo problema. Più profonda è la ricorsione, più 2 sono i particolari più strani. Immagini in basso.Piccolo bug in Koch's Snowflake Implementazione
EDIT: Non mi interessa davvero l'aspetto OpenGL, ho questa parte in basso. Se non conosci OpenGL, tutto ciò che fa glVertex è tracciare una linea tra i due vertici specificati nelle 2 chiamate di metodo. Fingere il suo drawLine (v1, v2). Stessa differenza.
Sospetto che il mio metodo per la ricerca di punti sia da incolpare, ma non riesco a trovare nulla che non sia corretto.
Sto seguendo il metodo di disegno sostanzialmente normale, qui il codice relativo tagli
(V è per vertice V1 è il basso a sinistra, v2 è basso a destra, v3 è l'angolo superiore):
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);
metodo ricorsivo:
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);
}
}
ho davvero il sospetto che la mia matematica è il problema, ma questo sembra corretto a 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 (Tutto va bene):
N = 1 (Forse un po 'bendy, forse)
N = 5 (WAT)
Senza conoscere l'algoritmo: potrebbe trattarsi di un problema di precisione "doppio". –