![]() |
rechteckige Spirale durchlaufen
Hallo,
für Pathfinding will ich mich spiralförmig um einen gegebenen Punkt herum bewegen. Nach viel Denkarbeit habe ich bereits rausgefunden, dass ich mich an "Eckpunkten" festhalten kann, die eine ganzzahlige Quadratwurzel haben.
Delphi-Quellcode:
Ich berechne hier immer einen Eckpunkt, der vor dem gesuchten Punkt liegt, und will dann weiter rundrum, bis ich zum gesuchten Punkt komme. Wenn der Eckpunkt oben links ist, muss ich noch eins nach links, und dann nach unten, und evtl. dann irgendwann auch wieder nach rechts.
function GetSpiralPoint(origin: TPoint; index: Integer):TPoint;
var i,corner:integer; p:TPoint; begin // we're assuming origin to be 0|0 here, translation will be added afterwards // additionally we assume the spiral to go counter-clockwise and start at -1|0 corner := ceil(sqrt(index)); i := sqr(corner); if (Odd(corner)) then begin corner := -((corner -1) div 2); p.X := corner; p.Y := corner; end else begin p.Y := corner div 2; p.X := p.Y -1; end; end; Wenn er unten rechts liegt, noch eins nach rechts und dann entsprechend nach oben usw. usf. Gibt es da irgendetwas mathematisch elegantes? ich wäre auch zufrieden, wenn ich mir eine Punktliste generieren könnte. |
Re: rechteckige Spirale durchlaufen
Delphi-Quellcode:
function spirale(abstand,count,startstep:integer;startpunkt:tpoint;drehsinnnachrechts:boolean):array of tpoint;
var richtung,i,step:integer; actpos:tpoint; begin richtung:=1; actpos:=startpunkt; setlength(result,1); result[1]:=actpos; step:=startstep; for i:=2 to count do begin case richtung of 1: actpos.x:=actpos.x+step; 2: actpos.y:=actpos.y+step; 3: actpos.x:=actpos.x-step; 4: actpos.y:=actpos.y-step; end; step:=step+abstand; if drehsinnnachrechts then begin richtung:=richtung+1; if richtung=5 then richtung:=1; end else begin richtung:=richtung-1; if richtung=0 then richtung:=4; end; setlength(result,length(result)+1); result[length(result-1)]:=actpos; end; end; |
Re: rechteckige Spirale durchlaufen
DANKE! das ist großartig!
ok.... hab das ganze ein wenig umgeschrieben, und es funktioniert.
Delphi-Quellcode:
Aber müsste das nicht überlaufen, siehe Kommentare?
type PArray = array of TPoint;
function spirale(abstand,count,startstep:integer;startpunkt:tpoint;drehsinnnachrechts:boolean):PArray; var richtung,i,step:integer; actpos:tpoint; begin setlength(result,count); richtung:=1; actpos:=startpunkt; result[1]:=actpos; step:=startstep; for i:=1 to count-1 do begin case richtung of 1: actpos.x:=actpos.x+step; 2: actpos.y:=actpos.y+step; 3: actpos.x:=actpos.x-step; 4: actpos.y:=actpos.y-step; end; step:=step+abstand; if drehsinnnachrechts then begin richtung:=richtung+1; if richtung=5 then richtung:=1; end else begin richtung:=richtung-1; if richtung=0 then richtung:=4; end; result[i]:=actpos; end; end; end; EDIT: habe den code jetzt nochmal angepasst. |
Re: rechteckige Spirale durchlaufen
ich habe ja for i:=2 to count gemacht, damit es weniger Elemente werden, da das 1. Element ja der Startpunkt ist. Du kannst ja das Element [count-1] verwenden.
Ein dynamisches Array fängt immer bei 0 an und hört bei count-1 auf. ==>
|
Re: rechteckige Spirale durchlaufen
sodele, funzt jetzt immer noch ;)
Ich weiss ja, dass es bis count-1 geht, aber genau das verletze ich ja und es funzt trotzdem... werde das gleich mal für die codelib vorschlagen. ach ja: wenn man das setlength gleich am anfang macht, sollte es schneller gehen. |
Re: rechteckige Spirale durchlaufen
mach doch noch die oben vorgeschlagenen Veränderungen. Sone vllt-Zugriffsverletztung is nie gut. Der schreibt eben dann in einen nicht-zugewiesenen RAM-Bereich, und wenn da jetzt eine Variable drinn ist...
Bei mir funzt auch folgendes:
Delphi-Quellcode:
aber es ist immer eine Fehlerquelle.
var
a:array[1..10,1..10] of integer; begin a[87]:=7; --> a[8,7]=7 end; |
Re: rechteckige Spirale durchlaufen
schon passiert, hab einfach for i:=1 to count-1 gemacht.
EDIT: weitere anmerkungen zur funktion bitte gleich in die codlib-section: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz