AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

rechteckige Spirale durchlaufen

Ein Thema von DGL-luke · begonnen am 17. Dez 2005 · letzter Beitrag vom 17. Dez 2005
Antwort Antwort
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

rechteckige Spirale durchlaufen

  Alt 17. Dez 2005, 11:16
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:
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;
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.
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#2

Re: rechteckige Spirale durchlaufen

  Alt 17. Dez 2005, 11:46
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;
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

Re: rechteckige Spirale durchlaufen

  Alt 17. Dez 2005, 12:00
DANKE! das ist großartig!
ok.... hab das ganze ein wenig umgeschrieben, und es funktioniert.

Delphi-Quellcode:
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;
Aber müsste das nicht überlaufen, siehe Kommentare?

EDIT: habe den code jetzt nochmal angepasst.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#4

Re: rechteckige Spirale durchlaufen

  Alt 17. Dez 2005, 12:03
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.


==>
  • mach am Anfang result[0]:=actpos
  • dann for i:=2 to count
  • und dann result[i-1]:=actpos
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#5

Re: rechteckige Spirale durchlaufen

  Alt 17. Dez 2005, 12:07
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.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
ichbins

Registriert seit: 9. Jul 2005
Ort: Hohenaltheim
1.001 Beiträge
 
Delphi 2005 Personal
 
#6

Re: rechteckige Spirale durchlaufen

  Alt 17. Dez 2005, 12:14
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:
var
  a:array[1..10,1..10] of integer;
begin
  a[87]:=7;
  --> a[8,7]=7
end;
aber es ist immer eine Fehlerquelle.
Michael Enßlin
Ich, der ich weiß, mir einzubilden, dass ich weiß, nichts zu wissen, weiß, dass ich nichts weiß.
Sokrates
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#7

Re: rechteckige Spirale durchlaufen

  Alt 17. Dez 2005, 12:16
schon passiert, hab einfach for i:=1 to count-1 gemacht.

EDIT: weitere anmerkungen zur funktion bitte gleich in die codlib-section: http://www.delphipraxis.net/viewtopi...=473530#473530
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:33 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz