"schneckenförmiges" suchpattern
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
abbrechen
aktuelle feld
ausdrucken
code
feld
fertig code
http
koordinatensystem
mittelpunkt
papierkorb
position
programmiersprache
punkt
quadrat
schleifen
sprache
url
versetzen
verwechseln
wiederholen
-
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
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage