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