Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.157 Beiträge
 
Delphi 12 Athens
 
#6

Re: Nächstliegendes Pixel ermitteln

  Alt 25. Apr 2006, 16:43
Zitat von Khabarakh:
Argh, was denkst du von mir ? Das funktioniert auch bei meinem geliebten FF nicht.
Und warum behauptet ihr dann, daß er FF sooooo toll sei?

Delphi-Quellcode:
MaxW := Max(X, BildBreite - X);
MaxH := Max(Y, BildHöhe - Y);
MaxiamalerRadius := Abstand(X-Y zu MaxW-MaxH);
GefundenX := -1; //irgendeinen Wert für nichts gefunden
For Radius := 1 to MaxiamalerRadius do Begin
  WinkelTeile := 2 * Pi * Radius {Umfang};
  For WinkelTeil := 1 to WinkelTeile do Begin
    PixelX := X + Sin(2 * Pi * WinkelTeile / WinkelTeil);
    PixelY := Y + Sin(2 * Pi * WinkelTeile / WinkelTeil);
    If (PixelX >= 0) and (PixelX < BildBreite) and (PixelY >= 0) and (PixelY < BildHöhe)
      and (Bild.Pixel[PixelX, PixelY] = Farbe) Then Begin
      GefundenX := PixelX;
      GefundenY := PixelY;
      SchleifenVerlassen;
    End;
  End;
End;
If GefundenX <> -1 Then // was gefunden
Optimierungen wären z.B., wenn du sobald du über den Bildrand kommst, den außenliegenden Bereich überspringst.

statt:
Delphi-Quellcode:
PixelX := X + Sin(2 * Pi * WinkelTeile / WinkelTeil);
PixelY := Y + Sin(2 * Pi * WinkelTeile / WinkelTeil);
If (PixelX >= 0) and (PixelX < BildBreite) and (PixelY >= 0) and (PixelY < BildHöhe)
  and (Bild.Pixel[PixelX, PixelY] = Farbe) Then Begin
irgendwie den Wiedereintritt berechnen (irgendwie so ... denk ich ma):
Delphi-Quellcode:
PixelX := X + Sin(2 * Pi * WinkelTeile / WinkelTeil);
PixelY := Y + Sin(2 * Pi * WinkelTeile / WinkelTeil);
If PixelX < 0 Then Begin
  //Seitenkante des Bildes, welche gerade durchbrochen wurde, als Sekante ansehen
  //den anderen Schnittpunkt berechnen
  //Winkel zum anderen Schnittpunkt errechnen

  //Winkel umrechnen (von 2*Pi nach WinkelTeile)
  i := neuerWinkel * WinkelTeile / 2 * Pi;

  //vielleicht solltest du doch lieber While-Schleifen verwenden
  //denn da kannst du ja offiziell den WinkelTeil ändern (also nicht so wie ich das mache ^^)
  If i > WinkelTeil Then PInteger(@WinkelTeil)^ := i;
End;
...
If PixelX < BildBreite Then ...
If PixelY >= 0 Then ...
If PixelY < BildHöhe Then ...
If (PixelX >= 0) and (PixelX < BildBreite) and (PixelY >= 0) and (PixelY < BildHöhe)
  and (Bild.Pixel[PixelX, PixelY] = Farbe) Then Begin
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat