Der kleine Applikationslinseneffekt war das Nebenprodukt eines Federbruchs ohne Pläne.
Zu dieser Zeit habe ich die Programmierung der ersten Version des Encoders beendet (File Encoder Application), und ich brauchte etwas Eingängiges für die About...
Die ursprüngliche Idee ist nicht meine, aber ich implementierte sie basierend auf einem Effekt, den ich in einem dieser ikonischen DOS-Demos gesehen hatte.
Ich beschloss, den Effekt in einem Java Swing JPanel für mein Projekt zu verkapseln.
Alles innerhalb des Panels kann mit einer Lupe vergrößert werden, die an den gewählten Koordinaten positioniert ist.
Besonders schwierig war es, sicherzustellen, dass die Aktualisierung der Textkomponenten, insbesondere bei der Änderung der Position des ausgewählten Textes, das visuelle Erscheinungsbild nicht beeinträchtigte.
Wenn Sie das LensJPanel erstellen, wird der Inhalt des JPanels auf das Element angewendet, das dem Vergrößerungseffekt unterzogen wird. Sie können den Radius des Vergrößerungsglases angeben und ob es den Inhalt vergrößert oder verringert.
Wenn Sie den Radius haben und feststellen, ob die Lupe den Inhalt vergrößert oder schrumpft, wird eine zweidimensionale quadratische Matrix mit einem Element für jedes Quadratpixel mit der Lupe erstellt.
Der Algorithmus berechnet die Koordinaten des entsprechenden Quellpixels im Originalbild für jedes Zielpixel, um die Farbe bei der Anwendung der Transformation zu bestimmen.
Die Transformation beinhaltet eine einfache polare Koordinatentransformation, weshalb eine Vergrößerungslinse verwendet wird:
Ein Pixel wird aus einer bestimmten Position des Objektivrahmens berechnet und wird verwendet, um die Farbe zu bestimmen, wenn die Transformation angewendet wird.Der Pixel wird auch innerhalb des Objektivrahmens sein.Zusätzlich wird der Radius von der Mitte des Objektivs zum Winkel für ein bestimmtes Pixel berechnet.Der "Ursprung"-Pixel für den Pixel, den wir berechnen, wird im gleichen Winkel sein, aber der Radius wird sich ändern.Der Radius reicht von 0% bis 100 % für die Pixel von -target und -source, wobei 100% die Länge des Objektivradius darstellt.Der Quellpixel wird für jedes Zielpixel berechnet, indem er seinen Winkel beibehalten und den Radius mit einer Funktion mit einem monoton ansteigenden Derivat transformiert. Diese Transformation erfolgt im Intervall zwischen 0 und 1, wobei f(0) gleich 0 und f(1) gleich 1 ist. Hier stellt 0 0% des Linsenradius dar, und 1 stellt 100% des Objektivradius dar.Das bedeutet, dass die Radien ihren Quellpixel aus einem kleineren Radius nehmen, der den Linsenkreis erweitert.Außerhalb des Kreises der Linse wird die Transformation die Identität sein, d.h. der Quellpixel wird sich nicht ändern.
Die Erklärung ist ein wenig verwirrend, aber wenn Sie daran interessiert sind, mehr über das Thema zu erfahren, zögern Sie nicht, mich zu kontaktieren.
Ich hoffe, jemand wird es nützlich finden :-).