![]() |
Re: Nächstliegendes Pixel ermitteln
PNG und IE vertragn sich nicht :zwinker:
am einfachsten du gehst in kreisähnlichen Bahnen vom Pixel aus nach außen und das erste Pixel was übereinstimmt ist automatisch das nächste. z.B.
Code:
.IBH
J837G C4x2A K516F .D9E |
Re: Nächstliegendes Pixel ermitteln
Ich würd auch in
![]() [/Eigenwerbung] EDIT: mir fällt ein, nicht zwingend... man sollte da nochmal die distanz berechnen, d = sqrt(dx*dx+dy*dy), und noch einmal rundrum gehen. das sollte reichen ;) |
Re: Nächstliegendes Pixel ermitteln
Zitat:
[add] Und nochwas ... deine Spiralen sind wohl auch nicht so gut (wenn ich jetzt nichts übersehn hab), denn was passiert, wenn der Punkt nahe am Rand des Bildes ist? |
Re: Nächstliegendes Pixel ermitteln
@DGL-luke: Wie gesagt, einmal reicht nicht, sondern Ceil(d - Sqrt(d))-mal. Und das ist einfach zu viel.
@himitsu: Und jetzt verallgemeiner das mal ;) . Dann solltest du auf etwas ziemlich Ähnliches wie ich kommen :zwinker: . Das Problem sind ja solche Reihenfolgen:
Code:
(Lückenfüller, damit die erste Zeile eingrückt wird -.-)
4 2 M 1 3 Zitat:
|
Re: Nächstliegendes Pixel ermitteln
Zitat:
Delphi-Quellcode:
Optimierungen wären z.B., wenn du sobald du über den Bildrand kommst, den außenliegenden Bereich überspringst.
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 statt:
Delphi-Quellcode:
irgendwie den Wiedereintritt berechnen (irgendwie so ... denk ich ma):
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
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:54 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