| 

.NET C# Java Javascript Exception

1
Hey Leute,

ich habe mal wieder ein Problem.
Ich erstelle auf meiner Openlayers Karte einen Haufen von Icons (als Vectorn). Dabei prüfe ich beim erstellen von jedem Icon, ob es sich mit anderen überschneidet. Wenn ja Probiere ich eine neue Position und prüfe wieder... Das wird solange gemacht, bis ein passender Platz gefunden wurde. Dabei entsteht natürlich eine Lange Aufrufliste und ihrgendwann "Kackt der mist ab!", mit folgender Meldeung:
Unhandled Error: Maximum recursion depth exceeded
Das Problem dabei sind die immer wiederkehrenden Funktionsaufrufe in Schleifen, auf die ich aber leider nicht verzichten kann/will.

Was kann man da tun?

Kurz noch etwas Quellcode:
function getGoodIconPlace(Point){
$.each(IconsImLayer, function(i, e){
if (Kollision) {
return getGoodIconPlace(newPoint);
}
});
return Point;
}
So ungefähr kann man sich das vorstellen
08.12.2014
DerPunk 1,2k 1 7
2 Antworten
1
Hättest Du ggf. die Möglichkeit das Koordinatensystem in verschiedene Sektoren zu unterteilen? So könntest Du die maximale Rekursionstiefe veringern und die Sektoren nacheinander (oder Parallel) abarbeiten lassen.
09.12.2014
Slashi 409 2 8
Das wäre bestimmt möglich, mit einer menge Aufwand. Hab aber einen anderen Fehler gefunden: Das "return" in der schleife, bewirkt nur ein "continue" (es steht ja in einer einzelnen Funktion). Dadurch wird die Schleife nicht abgebrochen. Wenn ich das ergebnis vorher rausgebe und die Schleife mit "return false" beende, hab ich keine Probleme mehr.
DerPunk 09.12.2014
0
Die Reursionstiefe bedeutet, wie oft die Funktion sich innerhalbe der Funktion selber aufruft, klar? Das sind ein paar tausend je nach Browser. Siehe hier. Collision detection braucht keine Reursion:
do{
allesGut=true;
for(a=0;a<element.length-1;a++){
for(b=a+1;b<element.length;b++){
if(Kollision(a,b)){
allegut=false;
schiebeAuseinander(a,b);
}
}
}
}while(allesGut===false);

Am besten machst Du das in einem Web-Worer oder im Verzweiflungsfall mit setTimeout.
23.12.2014

Stelle deine Javascript-Frage jetzt!