.sea.monkey.: matrix spiralförmig durchsuchen

Guten Morgen an diesem schönen Mittwoch,
seit 2 Stunden quäle ich mich mit einem Problem herrum von dem ich nicht einmal weiß ob es da ne einigermassen unkomplizierte Lösung gibt.

Ich versuche grade in Java (wobei die Sprache wohl relativ egal ist) eine 15*20 Matrix (also eine 2 dimensionales Array) spiralförmig von innen nach aussen zu durchlaufen. Leider scheitere ich die ganze Zeit an meiner heute (:-)) mangelnden Vorstellungskraft.

Grundgedanke von mir ist, das Ding in einer doppelten For-schleife zu durchlaufen wobei beide Iteratoren dauerhaft geändert werden müssen (mal +, mal - etc.)...ich denke es ist klar was ich meine...

Ich würde auch gerne ein bißchen Code posten aber leider ist alles was ich hier habe murks.

Hat vielleicht irgendwer ne idee oder einen schnipsel der mich auf den richtigen Weg führt? So schwer kann das doch nicht sein....schätze ich.

schönen Gruß
.sea.monkey.

P.S. zum Sinn: ich weiß das es einfacher Wege gibt das Ding zu durchlaufen, aber ich muss hier etwas visualisieren und das _muss_ von innen nach aussen geschehen.

  1. Hi,

    Ich versuche grade eine 15*20 Matrix spiralförmig von innen nach aussen zu durchlaufen.

    hä? also sowas hier?

    ------------------------
    |   | 1 | 2 | ... | 15 |
    ------------------------
    | 1 | x | y | ........ |
    ------------------------
    | 2 | a | b | ........ |
    ------------------------
    | . | . | . | ........ |
    ------------------------
    | 20| c | a | ........ |
    ------------------------

    was heist spiralförmig von innen nach ausen? willst du bei 7.10 anfangen und dann eins nach unten dann eins nach rechts dann 2 nach oben und 2 nach rechts und 3 nach unten???
      |----
      | | |
       -  |
    so in etwa???

    MfG

    1. Hallo,

      hä? also sowas hier?

      --> ganz genau!

      was heist spiralförmig von innen nach ausen? willst du bei 7.10 anfangen und dann eins nach unten dann eins nach rechts dann 2 nach oben und 2 nach rechts und 3 nach unten???
        |----
        | | |
         -  |
      so in etwa???

      --> Genau das wäre sehr wünschenswert.
      Sorry falls das Posting undeutlich war, ich sitze da jetzt schon so lange vor das ich es wahrscheinlich schon so verständlich finde das ich es nicht mehr erklären kann.

      Hast du da ne idee zu?

      schönen Gruß
      .sea.monkey.

      1. Hi !

        #include <stdio.h>

        main() {
        int x=7;
        int y=10;
        int end_x;
        int end_y;
        int laenge=1;
        int richtung=1;

        while (end_y != 7) {
              if (richtung==1) {
                 end_y=y+laenge;
                 while (y != end_y) {
                    printf("x=%d, y=%d\n",x,y);
                    y++;
                 }
                 richtung=2;
              }
              if (richtung==2) {
                 end_x=x-laenge;
                 while (x != end_x) {
                    printf("x=%d, y=%d\n",x,y);
                    x--;
                 }
                 richtung=3;
                 laenge++;
              }
              if (richtung==3) {
                 end_y=y-laenge;
                 while (y != end_y) {
                    printf("x=%d, y=%d\n",x,y);
                    y--;
                 }
                 richtung=4;
              }
              if (richtung==4) {
                 end_x=x+laenge;
                 while (x != end_x) {
                    printf("x=%d, y=%d\n",x,y);
                    x++;
                 }
                 richtung=1;
                 laenge++;
              }
           }
        }

        Gruß

        Hans

        1. Hi,
          im prinzip hast du recht da es aber erstens ist x-start = 8 und
          y-start = 8 und dann musst du bewegung-in-y-start = 6 machen und
          bewegung-in-x-start = 1 und dann jeweils eins dazu und
          vorzeichenwechsel.

          MfG

          1. Hi

            bewegung-in-y-start
            bewegung-in-x-start

            muss natürlich bewegung-in-y-richtung bzw. bewegung-in-x-richtung heißen

            MfG

        2. Hi,

          #include <stdio.h>

          main() {
          }

          Bitte hier nach Möglichkeit nur Standard-C nach ISO/IEC 9899, wenn's denn unbedingt C sein soll. Diese Möglichkeit bestand hier auch. Danke.
          Unkommentierter Brute Force ist übrigens auch nicht gerade das, was man hilfreich nennen könnte.

          so short

          Christoph Zurnieden

        3. Hi,
          erstmal danke!
          Ich hab das ganze jetzt mal eingefügt und an Java angepasst und versucht es zu verstehen.
          Klar, es gibt 4 mögliche Richtungen mit jeweils unterschiedlichen Iterationen (Lauflänge, Richtungswechel etc.)
          Eine Frage hab ich allerdings noch: ich verstehe die Abbruchbedingung nicht. Warum sollte es abbrechen wenn end_y!=7 ist? Mal abgesehen davon das es zu früh abbricht.
          Und die Kommentare in den beiden Folgepostings mti den Korrekturen helfen mir da jetzt grade auch nicht. Dieses Ding hat glaube ich mein Hirn frittiert :-)

          schönen Gruß
          .sea.monkey.

          1. Hi,

            Warum sollte es abbrechen wenn end_y!=7 ist?

            da es ein while ist wird abgebrochen sobald end_y == 7 ist (oder drüber)

            Mal abgesehen davon das es zu früh abbricht.

            das liegt vermutlich daran das es while(end_y!=15 && end_x!=20) heißen sollte.

            MfG

      2. Hi,

        Hast du da ne idee zu?

        noch keine genaue, aber warum machst du bzw. willst du das so machen? ich sehe da keinen sinn darin.

        Jetzt denken wir mal rückwärts und vangen rechts unten an.
        (15:20)
        19 hoch => (15:1)
        14 links => (1:1)
        19 runter => (1:20)
        13 rechts => (14:20)
        18 hoch => (14:2)
        12 links => (2:2)
        17 runter => (2:19)
        11 rechts => (13:19)
        16 hoch
        10 links
        15 runter
        9 rechts
        14 hoch
        8 links
        13 runter
        7 rechts
        12 hoch
        6 links
        11 runter
        5 rechts
        10 hoch
        4 links
        9 runter
        3 rechts
        8 hoch
        2 links
        7 runter
        1 rechts
        6 hoch

        berechne einfach noch die endposition von dieser vorgehensweise und du
        hast die Startposition. so müsstest du alle haben, nun das ganze
        umdrehn und dir die ins auge fallende gemeinsamkeit merken. Natürlich
        darfst du die anzahl nicht sprunghaft nach rechts, bzw, links gehen
        sondern einzelschrittweise und dann auslesen.

        MfG

      3. Hi,

        |----
          | | |
           -  |

        --> Genau das wäre sehr wünschenswert.
        Sorry falls das Posting undeutlich war, ich sitze da jetzt schon so lange vor das ich es wahrscheinlich schon so verständlich finde das ich es nicht mehr erklären kann.

        Nicht nur, sondern Du siehst auch den Wald vor laute Bäumen nicht. Aber keine Angst, das ist nicht ungewöhnlich wenn man zu lange auf einen Punkt starrt, ich kenn' das ;-)

        Du hast eine n-dimensionale Ebene, die Du von der Mitte aus spiralförmig durchsuchen willst. Du weißt, was eine Spirale ist und hast Dich mit diesem Wissen schon für eine Drehrichtung entschieden: bei dieser 2-dimensionalen Ebene im Uhrzeigersinn. Die Ebene ist in diskrete Punkte aufgeteilt, eine Schrittweite von 1 ist somit möglich und wird hier auch angestrebt. Wenn Du jetzt ein Koordinatenkreuz auflegst mit dem Nullpunkt auf dem Punkt an dem Du anfangen willst, kannst Du Dir die Regel besser vorstellen. Die vertikale Achse sei mit 'y' bezeichnet, oben positiv und die horizontale mit 'x', rechts positiv. Da Du Dich auch für die Richtung des ersten Schrittes entschieden hast -- nach unten, also auf der y-Achse in den negativen Bereich -- ist die Regel für den ersten Schritt: (x+0,y+(-1)), für den zweiten (x+(-1),y+0), der dritte ist (x+0,y+1), der vierte (x+0,y+1), der fünfte (x+1,y+0) womit Du oberhalb des Anfangspunktes angekommen bist und eine halbe Spirale ausgeführt hast. Aber vielleicht solltest Du Dir das auf Kästchenpapier mal zu Gemüte führen, ich habe das im Kopf erledigt, kann mich also durchaus vertan haben ;-)
        Wenn Du dann ein paar Punkte mehr zusammen hast, solltest Du so langsam die allgemeine Regel an den Zahlenfolgen erkennen können. Die nimmst Du dann.
        Damit Du Dich endlich interessanteren Dingen widmen kannst ;-)

        so short

        Christoph Zurnieden

        1. Hi,

          Wenn Du dann ein paar Punkte mehr zusammen hast, solltest Du so langsam die allgemeine Regel an den Zahlenfolgen erkennen können. Die nimmst Du dann.
          Damit Du Dich endlich interessanteren Dingen widmen kannst ;-)

          hi, auch du hast wie Hans außer acht gelassen das diese matrix nicht so lang wie breit ist.
          dadurch lüfst du gegen später außerhalb des, ich nenns jetzt mal,
          definierten bereiches da 15:20 wenn du so linear vorgest greifst du aber
          irgendwann auf z.B. 16:19 oder 0:7 zu, diese sind nicht definiert. dies
          wird bei meinem Lösungsansatz berücksichtigt.

          MfG

          1. Hi,

            hi, auch du hast wie Hans außer acht gelassen das diese matrix nicht so lang wie breit ist.

            Ja, das habe ich, und?

            dadurch lüfst du gegen später außerhalb des, ich nenns jetzt mal,
            definierten bereiches da 15:20 wenn du so linear vorgest greifst du aber
            irgendwann auf z.B. 16:19 oder 0:7 zu, diese sind nicht definiert.

            Doch, die sind definiert, da ich eine n-dimensionale Ebene vorgegeben habe. Eine Ebene ist definitionsgemäß in ihren Dimensionen nicht begrenzt. Eine Lösung hier paßt somit ebenfalls auf alle Flächen innerhalb dieser Ebene, es ist nämlich eine allgemeingültige Lösung. Wenn Ich das mache, wie Du vorschlägst, dann mußt Du Dein Vorgehen individuell anpassen und hast somit genausoviele Funktionen wie die Ebene Flächen enthält nämlich [latex]\aleph_0[/latex]. Datt is' 'ne ganz schöne Menge, ich sach Dir datt nur in' Guten! ;-)

            Der allgemeine Algorithmus zusammen mit den bekannten Grenzen der zu durchsuchenden Flächen ergibt eine nette kleine Funktion mit eine Liste der Eckpunkte als Argument und einer Liste der gefundenen Sächelchen als Rückgabe.

            so short

            Christoph Zurnieden

  2. main() {
    int x=8;
    int y=13;
    int end_x;
    int end_y;
    int x_laenge=1;
    int y_laenge=6;
    int richtung=1;

    /* Erst mal in der Mitte raus nach oben, damit es symmetrisch wird */
       while (y != 7) {
          printf("x=%d, y=%d\n",x,y);
          y--;
       }

    /* Jetzt unterschiedlich lange Strecken ablaufen, da es keine X*X sondern ein
    e Y*X-Matrix ist, wobei X != Y (damit gewisse Erbsenzaehler zufrieden sind) */

    while ((y > 0) && (x > 0)) {
          if (richtung==1) { /* Rechts rum, in X-Richtung */
             end_x=x+x_laenge;
             while (x != end_x) {
                printf("x=%d, y=%d\n",x,y);
                x++;
             }
             richtung=2;
             y_laenge++; /* Y-Laenge um 1 erhoehen, damit man nicht gegen gerade gez
    ogene Linie stoesst */
          }
          if (richtung==2) { /* Abwaerts in Y-Richtung */
             end_y=y+y_laenge;
             while (y != end_y) {
                printf("x=%d, y=%d\n",x,y);
                y++;
             }
             richtung=3;
             x_laenge++;
          }
          if (richtung==3) { /* Links rum, in X-Richtung */
             end_x=x-x_laenge;
             while (x != end_x) {
                printf("x=%d, y=%d\n",x,y);
                x--;
             }
             richtung=4;
             y_laenge++; /* Y-Laenge um 1 erhoehen, damit man nicht gegen gerade gezogene Linie stoesst */
          }
          if (richtung==4) { /* Aufwaerts, in Y-Richtung */
             end_y=y-y_laenge;
             while (y != end_y) {
                printf("x=%d, y=%d\n",x,y);
                y--;
             }
             richtung=1;
             x_laenge++; /* X-Laenge um 1 erhoehen, damit man nicht gegen gerade gez
    ogene Linie stoesst */
          }
       }
    }

    So, sofern copy&paste nicht irgend einen Mist gemacht hat, muesste es so klappen. Statt printf dann entsprechend System.out.println() machen und die entsprechenden Klassen importieren.

    Gruß

    Hans

    1. Hi,

      es tut mir leid, aber ich kann das nicht einfach so lassen stahn.
      Wir sind hier ein _ordentlicher_ Sauhaufen! ;-)

      #ifdef __cplusplus
      #include <cstdio>
      #else
      #include <stdio.h>
      #endif

      main() {

      Nach ISO-14882 ist in C++ main() vom Typ int.

      int x=8;
      int y=13;

      Funktioniert das auch mit anderen Werten?

      int end_x;
      int end_y;
      int x_laenge=1;
      int y_laenge=6;
      int richtung=1;

      /* Erst mal in der Mitte raus nach oben, damit es symmetrisch wird */
         while (y != 7) {
            printf("x=%d, y=%d\n",x,y);
            y--;
         }

      Es funktioniert also nicht mit andern Werten. Hat das einen bestimmten Grund? Oder möchtest Du den OP einfach ein wenig hoppnehmen?

      /* Jetzt unterschiedlich lange Strecken ablaufen, da es keine X*X sondern ein
      e Y*X-Matrix ist, wobei X != Y (damit gewisse Erbsenzaehler zufrieden sind) */

      Das Du überhaupt diese Einschränkung machst wundert mich.

      [merkwürdig komplizierte Vorgehensweise, aber egal, gestrichen]

      return 0;

      }

      Bei C++ ist die Voreinstellung bereits die Rückabe von 0, deshalb ist die Zeile "return 0;" für C++ überflüssig. Da sie aber bei C++ nicht schadet und bei C vorgeschrieben ist, kann man sie hinsetzen, wenn man auf beide Sprachen portierbar bleiben möchte. (Wobei die 0 da eigentlich falsch ist. Der Rückgabewert für einen erfolgreichen Abschluß muß nicht zwingend 0 sein. Der C++-Compiler kann das und muß das sogar regeln, der C-Compiler tut es aber nicht, darf er ja auch gar nicht. Macht aber auch nix, der hat dafür dann Macros.)

      So, sofern copy&paste nicht irgend einen Mist gemacht hat, muesste es so klappen. Statt printf dann entsprechend System.out.println()

      Ach, 's ist für Java? Warum gibst Du dann keinen Javacode an? Keine Java-VM auf der Maschine? Soviel sollte aber selbst "Kaffe" schaffen, Lizenzprobleme sind also zumindest hier kein Grund ;-)

      so short

      Christoph Zurnieden

      1. Hi,

        dito

        #ifdef __cplusplus
        #include <cstdio>
        #else
        #include <stdio.h>
        #endif

        main() {

        Nach ISO-14882 ist in C++ main() vom Typ int.

        int x=8;
        int y=13;

        Wieso immer C++ ?

        Funktioniert das auch mit anderen Werten?

        Ja, aber seamonkey möchte eine 15*20-Matrix haben !

        Es funktioniert also nicht mit andern Werten. Hat das einen bestimmten Grund? Oder möchtest Du den OP einfach ein wenig hoppnehmen?

        15*20-MATRIX  !!!!!!!!!!

        Das Du überhaupt diese Einschränkung machst wundert mich.

        *Baldrian schluck* Nein, ich wiederhole mich jetzt nicht mehr...

        [merkwürdig komplizierte Vorgehensweise, aber egal, gestrichen]

        return 0;

        }

        Bei C++ ist die Voreinstellung bereits die Rückabe von 0, deshalb ist die Zeile "return 0;" für C++ überflüssig. Da sie aber bei C++ nicht schadet und bei C vorgeschrieben ist, kann man sie hinsetzen, wenn man auf beide Sprachen portierbar bleiben möchte. (Wobei die 0 da eigentlich falsch ist. Der Rückgabewert für einen erfolgreichen Abschluß muß nicht zwingend 0 sein. Der C++-Compiler kann das und muß das sogar regeln, der C-Compiler tut es aber nicht, darf er ja auch gar nicht. Macht aber auch nix, der hat dafür dann Macros.)

        WIESO *heul* muss es denn immer C++ sein ?

        So, sofern copy&paste nicht irgend einen Mist gemacht hat, muesste es so klappen. Statt printf dann entsprechend System.out.println()

        Ach, 's ist für Java? Warum gibst Du dann keinen Javacode an? Keine Java-VM auf der Maschine? Soviel sollte aber selbst "Kaffe" schaffen, Lizenzprobleme sind also zumindest hier kein Grund ;-)

        Weil ich mit C unter Unix schneller bin als mit Java unter Windows !

        so short

        Christoph Zurnieden

        Kein Problem, Christoph, habe Dir eine Leiter hingestellt, damit Du nicht so tief fällst, wenn Du versuchst, von Deinem hohen Roß runterzusteigen.

        Gruß

        Hans

        1. Hi,

          Nach ISO-14882 ist in C++ main() vom Typ int.

          int x=8;
          int y=13;

          Wieso immer C++ ?

          Weil es nicht sauber zu unterscheiden war, ob Du C oder C++ meintest. C hatte ich schon, dann war jetzt C++ dran.

          Funktioniert das auch mit anderen Werten?

          Ja, aber seamonkey möchte eine 15*20-Matrix haben !

          Dies ist das Selfforum. Wie der Name schon anzudeuten versucht geht es hier vornehmlich um's Selbermachen, der Leitspruch ist ja auch:"Die Energie des Verstehens"
          Hier bekommt niemand einen Fisch betont lässig vor die Füße geworfen, sondern ihm wird erklärt, wie er die neben ihm liegende Angel benutzen kann. Es mag dabei hin und wieder vorkommen, das eine heftige Diskussion über die korrekte Form des Knotens, der den Haken mit der Schnur verbindet vom Zaun gebrochen wird, aber das wird gerne hingenommen.

          Es funktioniert also nicht mit andern Werten. Hat das einen bestimmten Grund? Oder möchtest Du den OP einfach ein wenig hoppnehmen?

          15*20-MATRIX  !!!!!!!!!!

          Die typographische Regel besagt, das im Deutschem zwischen dem letztem Buchstaben des Satzes und des diesen abschließenden Interpunktionszeichens kein Leerzeichen vorhanden sein darf. Außerdem ist mehr als ein gleichartiges Zeichen nicht erlaubt. Eine Ausnahme gibt es: die Kombination eines Frage- und eines Ausrufezeichens, wobei die Reihenfolge keine Rolle spielt.

          Das Du überhaupt diese Einschränkung machst wundert mich.
          *Baldrian schluck* Nein, ich wiederhole mich jetzt nicht mehr...

          Aber ich tue das: es geht um's Fischen, nicht um den Fisch.

          WIESO *heul* muss es denn immer C++ sein ?

          Weil, wie gesagt, C schon dran war und es die Reihenfolge gebietet nun C++ zu nehmen.

          Weil ich mit C unter Unix schneller bin als mit Java unter Windows !

          Ja, und warum hast Du dann kein C genommen?

          Kein Problem, Christoph, habe Dir eine Leiter hingestellt, damit Du nicht so tief fällst, wenn Du versuchst, von Deinem hohen Roß runterzusteigen.

          Der Gaul ist gut trainiert und kann einem wie ein Wüstenschiff das Absteigen auf ebenso wippende wie übelkeitserregende Art erleichtern. Behalte Deine Leiter also, Du wirst sie noch brauchen.

          so short

          Christoph Zurnieden

  3. Hallo,

    das Thema hat mich ein wenig zum Spielen angeregt und so habe ich das Ganze einmal in JavaScript mit ein paar Animationen umgesetzt. Im IE wird es (ohne JavaScript Fehlermeldung) nicht angezeigt. Der ganze Seineninhalt wird dynamisch erzeugt und die Größe der Matrix kann beliebig veränder werden. Ich habe jedoch nicht mit besonders kleinen bzw. unsinnigen Werten getestet, da mögen noch Fehler auftauchen. Wer Spass daran hat, kann ja mal ein bisschen damit rumspielen.

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
    <html>  
      <head>  
        <title>Spirale</title>  
        <meta http-equiv="content-type" content="text/html; charset=UTF-8" />  
    <style type="text/css">
    
      html,body{padding:0;margin:0;height:100%;text-align:center;font-size:101%;}  
      table {font-size:0.7em;margin:0.5em;float:left;border:1px solid grey;background-color:#eee;border-collapse:collapse}  
      td {border:1px solid grey;margin:0;padding:0;width:26px;height:26px;white-space:nowrap;}  
      div {float:left;margin:0.3em auto;}  
      ul {margin:0;padding:0;text-align:center;}  
      li {list-style-type:none;margin:0.5em;}  
      button {width:15em;}
    
    </style>  
    <script type="text/javascript">  
    <!--
    
    function init() {  
      xsize = 15;  
      ysize = 20;  
      dir = 1 /* 1=rechts, 2=runter, 3=links, 4=rauf */  
      xstart = Math.floor((xsize+1)/2);  
      ystart = Math.floor((ysize+1)/2);  
      MtxPt = new pos(xstart, ystart);  
      maxI = Math.max(xsize, ysize);  
      maxX = xstart;  
      minX = xstart;  
      maxY = ystart;  
      minY = ystart;  
      stepSize = 1;  
      spiralPart = 1; /* Eine Umdrehung besteht aus 4 Teilen, wobei jeweils Teil 1 und 2 bzw. 3 und 4 dieselbe Schrittweite haben */  
    }  
      
    function createObjects() {  
      createTable();  
      showMatrix();  
      createUl();  
      createButtons();  
    }  
      
    function pos(x,y) {  
      this.x = x;  
      this.y = y;  
    }  
      
    function colorSpiral() {  
      init();  
      setPos();  
      setTimeout('drawColorLine()',100);  
    }  
      
    function drawColorLine() {  
      if(maxX < xsize || maxY < ysize || minX > 1 || minY > 1 || dir==3 || dir==1) { /* wir sind noch auf dem Spielfeld */  
        for(i=1;i<=stepSize;i++) { /* Linie einfaerben */  
          getPos(dir);  
          setPos();  
        }  
        if(spiralPart==2 || spiralPart==4) {  
          stepSize++;  
        }  
        spiralPart = spiralPart % 4 + 1; /* Abbildung von {1,2,3,4} => {2,3,4,1} */  
        dir = dir % 4 + 1; /* Richtungsaenderung */  
        setTimeout('drawColorLine()',100);  
      }  
    }  
      
    function symbolSpiral() {  
      init();  
      arrowRight = "&#x2192;"; arrowDown = "&#x2193;"; arrowLeft = "&#x2190;"; arrowUp = "&#x2191;";  
      arrowDownRight = "&#x2198;"; arrowDownLeft = "&#x2199;"; arrowUpLeft = "&#x2196;"; arrowUpRight = "&#x2197;";  
      setSymbolPos("&#0183;");  
      setTimeout('drawSymbolLine()',100);  
    }  
      
    function drawSymbolLine() {  
      if(maxX < xsize || maxY < ysize || minX > 1 || minY > 1 || dir==3 || dir==1) { /* wir sind noch auf dem Spielfeld */  
        switch (dir) {  
          case 1:  
            symbolNorm = arrowRight;  
            symbolCorner = arrowDownRight;  
            break;  
          case 2:  
            symbolNorm = arrowDown;  
            symbolCorner = arrowDownLeft;  
            break;  
          case 3:  
            symbolNorm = arrowLeft;  
            symbolCorner = arrowUpLeft;  
            break;  
          case 4:  
            symbolNorm = arrowUp;  
            symbolCorner = arrowUpRight;  
            break;  
        }  
        for(i=1;i<stepSize;i++) {  
      
          getPos(dir);  
          setSymbolPos(symbolNorm);  
        }  
        getPos(dir);  
        setSymbolPos(symbolCorner);  
         if(spiralPart==2 || spiralPart==4) {  
          stepSize++;  
        }  
        spiralPart = spiralPart % 4 + 1; /* Abbildung von {1,2,3,4} => {2,3,4,1} */  
        dir = dir % 4 + 1; /* Richtungsänderung */  
        setTimeout('drawSymbolLine()',100);  
      }  
    }  
      
    function start() {  
      init();  
      colorSpiral();  
    }  
      
    function getPos(dir) {  
      if(dir==1) {MtxPt.x++;}  
      if(dir==2) {MtxPt.y++;}  
      if(dir==3) {MtxPt.x--;}  
      if(dir==4) {MtxPt.y--;}  
    }  
      
    function setPos() {  
      if(MtxPt.x > maxX) {maxX = MtxPt.x;}  
      if(MtxPt.x < minX) {minX = MtxPt.x;}  
      if(MtxPt.y > maxY) {maxY = MtxPt.y;}  
      if(MtxPt.y < minY) {minY = MtxPt.y;}  
      myTD = document.getElementById('td:'+MtxPt.x+'.'+MtxPt.y);  
      if(MtxPt.x > 0 && MtxPt.x <= xsize & MtxPt.y > 0 && MtxPt.y <= ysize) {  
        myTD.style.backgroundColor = "green";  
      } else {  
        myTD.style.backgroundColor = "red";  
      }  
    }  
      
    function setSymbolPos(symbol) {  
      if(MtxPt.x > maxX) {maxX = MtxPt.x;}  
      if(MtxPt.x < minX) {minX = MtxPt.x;}  
      if(MtxPt.y > maxY) {maxY = MtxPt.y;}  
      if(MtxPt.y < minY) {minY = MtxPt.y;}  
      myTD = document.getElementById('td:'+MtxPt.x+'.'+MtxPt.y);  
      myTD.innerHTML = symbol;  
    }  
      
    function reset() {  
      knoten = document.getElementsByTagName('div')[0];  
      document.getElementsByTagName('body')[0].removeChild(knoten);  
      document.getElementsByTagName('body')[0].removeChild(document.getElementsByTagName('table')[0]);  
      init();  
      createObjects();  
    }  
      
    function createTable() {  
      table = document.createElement('table');  
      xborder = Math.floor((maxI-xsize+2)/2);  
      yborder = Math.floor((maxI-ysize)+2/2);  
      for(y=-(yborder-1);y<=ysize+yborder;y++) {  
        tr = document.createElement('tr');  
        for(x=-(xborder-1);x<=(xsize+xborder);x++) {  
          td = document.createElement('td');  
          td.setAttribute('style','');  
          if(x>0 && y>0 && x<=xsize && y<=ysize) { td.style.nodeValue += "background-color:#000;color:#fff;";}  
          text = document.createTextNode(x + "|" + y);  
          td.appendChild(text);  
          td.setAttribute('id',"td:" + x + "." + y);  
          tr.appendChild(td);  
        }  
        table.appendChild(tr);  
      }  
      document.body.appendChild(table);  
    }  
      
    function createButtons() {  
      li = document.createElement('li');  
      button = document.createElement('button');  
      button.setAttribute('type','button');  
      button.innerHTML = "Wegstrecke einf&auml;rben";  
      button.setAttribute('onclick','colorSpiral();');  
      li.appendChild(button);  
      document.getElementsByTagName('ul')[0].appendChild(li);  
      li = document.createElement('li');  
      button = document.createElement('button');  
      button.setAttribute('type','button');  
      button.innerHTML = "Wegstrecke markieren";  
      button.setAttribute('onclick','symbolSpiral();');  
      li.appendChild(button);  
      document.getElementsByTagName('ul')[0].appendChild(li);  
      li = document.createElement('li');  
      button = document.createElement('button');  
      button.setAttribute('type','button');  
      button.innerHTML = "Reset";  
      button.setAttribute('onclick','reset();');  
      li.appendChild(button);  
      document.getElementsByTagName('ul')[0].appendChild(li);  
    }  
      
    function showMatrix() {  
      for(i=1;i<=xsize;i++) {  
        for(j=1;j<=ysize;j++) {  
          document.getElementById('td:'+i+'.'+j).style.backgroundColor = "lightgrey";  
        }  
      }  
    }  
      
    function createUl () {  
      navcontainer = document.createElement('div');  
      ul = document.createElement('ul')  
      navcontainer.appendChild(ul);  
      document.body.appendChild(navcontainer);  
    }
    
    -->  
    </script>  
    </head>  
    <body onload="init();createObjects();">  
    </body>  
    </html>
    

    cu,
    ziegenmelker