kostenloser Webspace werbefrei: lima-city


"schneckenförmiges" suchpattern

lima-cityForumProgrammiersprachenSonstige Programmiersprachen

  1. Autor dieses Themas

    simuliertes

    Kostenloser Webspace von simuliertes

    simuliertes hat kostenlosen Webspace.

    Ich weiß nicht wie ich den Titel besser ausdrucken hätte können.
    Ich schreibe in freebasic, denke aber die Programmiersprache ist egal weil ja eigentlich alle sprachen for-schleifen & case bzw if kennen.
    Die Antwort kann also in pseudocode oder einer andern Programmiersprache kommen :wink:

    also normalerweise macht man ja einfach eine Kombination aus 2 for-schleifen x/y um einen Bereich im 2d-koordinatensystem " abzuscannen".
    Ich möchte das allerdings von einem Mittelpunkt aus schneckenförmig gesucht/gezeichnet wird.

    Dazu mal eine kleine gif-animation:
    http://simuliertes.lima-city.de/spielplatz/papierkorb/schnecke.gif

    Das hier habe ich jetzt geschrieben:
    dim as integer b,p(1 to 2)={0,0},x=1,y=2,xSt=300,ySt=300,st=6
    ' integer ist der Datentyp, p=der gezeichnete Punkt als x/y-array.
    'x=1,y=2 machen den code verständlicher weil p(x) besser aussieht als p(1)
    'xSt/ySt versetzen die Pixel nur in den Bildmittelpunkt damit nicht  links
    ' oben gezeichnet wird (und ausserhalb des Bildschirms bei minus-werten..)
    
    b=2
        for a as integer= 1 to 32
            for seite as integer=1 to 4
                for c as integer=1 to b
                    select case seite
                    case 1: p(x)=c:p(y)=-b ' wenn seite=1 dann punkt(x,y)=(c,-b)
                    case 2: p(x)=b:p(y)=c
                    case 3: p(x)=-c:p(y)=b
                    case 4: p(x)=-b:p(y)=-c
                    end select
                    pset(p(x)+xSt,p(y)+ySt) 'zeichne einen Punkt (x,y)
                next c ' "next" ist das ende der for-schleife also wie {}        
            next seite
            b+=1 'dasselbe wie b=b+1 oder b++ in anderen sprachen
            
        next a


    ...und so sieht das aus:
    http://imageshack.us/photo/my-images/269/basschnecke.gif/







    Beitrag zuletzt geändert: 18.8.2011 11:12:25 von simuliertes
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. t*****b

    Wir brauchen auf jeden Fall vier Schleifen. Die Schleifen stellen nicht nur die Dimension da (x/y) sondern auch die Richtung, in welche abgefragt wird (+x, -x, +y, -y). Ich würde dann auch keine For-Schleifen verwenden, sondern While-Schleifen.

    Ich würde es so realisieren:

    gehe ein Feld nach oben bis ein Feld rechts noch nicht markiert, markiere das Feld wenn vorhanden, ansonsten abbrechen
     gehe ein Feld nach rechts, bis ein Feld unten noch nicht markiert, markiere das Feld wenn vorhanden, ansonsten abbrechen
      gehe ein Feld nach unten, bis ein Feld links noch nicht markiert, markiere das Feld wenn vorhanden, ansonsten abbrechen
       gehe ein Feld nach links, bis ein Feld oben noch nicht markiert, markiere das Feld wenn vorhanden, ansonsten abbrechen
        wiederholen


    Und noch ein wenig Pseudocodehaftiger:

    gehe solange ein Feld nach oben, bis das Feld rechts davon nicht markiert ist, markiere das aktuelle feld wenn vorhanden ansonsten fertig
     gehe solange ein Feld nach rechts, bis das Feld darunter nicht markiert ist, markiere das aktuelle feld wenn vorhanden ansonsten fertig
      gehe solange ein Feld nach unten, bis das Feld links davon nicht markiert ist, markiere das aktuelle feld wenn vorhanden ansonsten fertig
       gehe solange ein Feld nach links, bis das Feld darüber nicht markiert ist, markiere das aktuelle feld wenn vorhanden ansonsten fertig
  4. Autor dieses Themas

    simuliertes

    Kostenloser Webspace von simuliertes

    simuliertes hat kostenlosen Webspace.

    Ah ,danke.
    Ich hab's zwar anders gelöst aber das war der entscheidende Hinweis.
    Je nach Seite wird jetzt p(x/y) einfach nach oben,unten,rechts oder links bewegt.
    Thnks

    nextstep=2
        for a as integer = 1 to size
        p(y)-=1
        p(x)-=1
            for seite as integer=1 to 4
                for c as integer=1 to nextstep
                    select case seite
                    case 1: p(x)+=1 'wenn seite=1, einen schritt nach rechts,..
                    case 2: p(y)+=1 '..unten,
                    case 3: p(x)-=1 '..links,
                    case 4: p(y)-=1 '..und wieder nach oben.
                    end select
                    'pset(p(x)+xSt,p(y)+ySt) 'zeichne einen Punkt (x,y)
                    line(p(x)*st+xSt,p(y)*st+ySt)-(p(x)*st+xSt+st,p(y)*st+ySt+st),rgb(255,255,255),b 'zeichne ein weißes st*st quadrat 
                    sleep 250/nextstep
                    line(p(x)*st+xSt+1,p(y)*st+ySt+1)-(p(x)*st+xSt+st-1,p(y)*st+ySt+st-1),col,bf 'zeichne ein weißes st*st quadrat                 
                next c
                'sleep 125
            next seite
            nextstep+=2 
        next a


    abzufragen ob sich daneben schon ein ausgefülltes Feld befindet hätte ein entsprechendes array mit den infos benötigt was mir ein bisschen zu umständlich erscheint.

    Jetzt würde ich das ganze aber gerne noch so umschreiben das ich eine Funktion habe in der ich den aktuelle schritt (nicht verwechseln mit der variabel "nextstep") eingeben kann und die x/y-position bekomme.

    Beitrag zuletzt geändert: 18.8.2011 13:13:36 von simuliertes
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!