![]() |
Gibt es eine direkte Verbindung zwischen 2 Pixeln
Hi :hi:
Ich hab mich heute an einer A*-Umsetzung versucht und bekomme auch relativ gute Ergebnise. Die Ergebnispfade sind bei mir Arrays of TPoint, die ich jetzt vereinfachen will. Aus einer Kette von vielleicht 50 Punkten, will ich jetzt die "Schlüsselpunkte" herausfinden, d.h ich will solange den Punkt i aus der Liste löschen, solange eine direkte Verbindung zum Punkt i+1 noch möglich ist. Und genau da ist mein Problem: Wie schaffe ich es ohne einen riesen Rechenaufwand festzustellen, ob die Verbindung zwischen 2 Punkten frei ist? Ich hoffe das hat jetzt jemand verstanden ... |
Re: Gibt es eine direkte Verbindung zwischen 2 Pixeln
vom prinzip müsst des ja so gehen
Code:
funktion checke(feld: TPoint): boolean
wenn (feld nicht-möglich/erlaubt) ergebnis = false sonst wenn (feld = ziel) ergebnis = true sonst result := checke(f1) or checke(f2) or checke(f3) // alle umliegenden felder |
Re: Gibt es eine direkte Verbindung zwischen 2 Pixeln
Das Problem ist, dass ich ja nicht nochmal alle Felder untersuchen will - ich weiß ja dass es einen Weg gibt - sondern nur die, die auf der direkten Linie zwischen zweit Punkten liegen. Und das ist eben leider nicht immer eindeutig:
![]() Also müsste die Frage wahrscheinlich eher so heißen: Wie komme ich am schnellsten an die Koordinaten von allen Pixeln, die auf der Linie liegen |
Re: Gibt es eine direkte Verbindung zwischen 2 Pixeln
Zitat:
... einfach die nachpar pixel um den einen prüfen ;) if cancas.pixels[x+1,y+1] = clwhite(oder halt die "leere farbe" oder halt "nicht die punktfarbe der punkte then und das in ner schleife ;) |
Re: Gibt es eine direkte Verbindung zwischen 2 Pixeln
Was ist denn genau die Aufgabe die du damit lösen willst? Ich hab den Hintergrund nicht ganz verstanden, aber mein Ansatz wäre zu versuchen, eine Art Funktion für diese Pixel aufzustellen:
Vom Pixel A(0,0) zum Pixel B(10,20) sähe das dann so aus: f(x)=[(20-0)/(10-0)]*x. // Steigungsdreieck wie aus der 8. Klasse Und dann
Delphi-Quellcode:
Nur beim Runden gibts Probleme.
for i:= A.x to B.x do
Pixel[A.x+i,A.y+f(i)].color:=ClLiegtdrauf. |
Re: Gibt es eine direkte Verbindung zwischen 2 Pixeln
wie ichs verstanden habe mag e nur wissen ob eine linie existiert ... da genügt ein schwarzer pixel in z richtung und x länge ;)
|
Re: Gibt es eine direkte Verbindung zwischen 2 Pixeln
Moin,
dafür ist etwas Vektorrechnung erforderlich... Ich habe hier mal die Berechnung für 3D-Punkte angegeben, wenn du nur 2D-Punkte hast lässt du einfach die dritte Dimenstion auf Null.
Delphi-Quellcode:
hier wird getestet, ob die drei Punkte auf einer Geraden liegen.
type
TPoint3D = packed record X: Longint; Y: Longint; Z: Longint; end; : function Point3D(X, Y, Z: Integer): TPoint3D; begin Result.X := X; Result.Y := Y; Result.Z := Z; end; function PunktAufGerade(P1, P2, P3:TPoint3D):boolean; function subP(P1, P2:TPoint3D):TPoint3D; begin Result.X:=P1.X - P2.X; Result.Y:=P1.Y - P2.Y; Result.Z:=P1.Z - P2.Z; end; function skalar(a, b:integer):integer; begin if b = 0 then Result:=0 else Result:=a div b; end; var a, b:TPoint3D; sX, sY, sZ:integer; begin a:=subP(P2, P1); b:=subP(P3, P1); sX:=skalar(a.X, b.X); sY:=skalar(a.Y, b.Y); sZ:=skalar(a.Z, b.Z); Result:= (sX = sY) and (sX = sZ); end; procedure TForm.ButtonClick(Sender: TObject); var a, b, c:TPoint3D; begin a:=Point3D(3, 0, 4); b:=Point3D(1, 1, 1); c:=Point3D(-1, 2, -2); if PunktAufGerade(a, b, c) then showmessage('auf der Gerade') else showmessage('nicht auf der Gerade'); end; MfG Thorsten |
Re: Gibt es eine direkte Verbindung zwischen 2 Pixeln
da gibt so einen freakigen algo, der testet, auf welche felder man kommt, wenn man von A nach B will. der schaut immer, ob man eher rechts oder eher oben muss (angenommen man muss nach rechts oben), geht dann dorthin und testet weiter.
auf den namen komm ich leider nicht. das mit dem steigungsdreieck ist ne übergangslösung, die allerdings funktionieren sollte. |
Re: Gibt es eine direkte Verbindung zwischen 2 Pixeln
Zitat:
|
Re: Gibt es eine direkte Verbindung zwischen 2 Pixeln
Eine mögliche lösung wäre es, die heuristik (ziel strecken schätzung) über zu bewerten, sodass die kantenkosten an gewicht verlieren. So kannst du dich der luftlinie annähern und es werden trotzdem noch schwere hindernisse umgangen. Auf dem resultierenden pfad kannst du dann die punkte mit gleichem delta-vektor streichen...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:43 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-2025 by Thomas Breitkreuz