Небольшой эффект прикладных линз был побочным продуктом весенних каникул без каких-либо планов.
В то время я заканчивал программирование первой версии энкодера File Encoder Application, и мне нужно было что-то заманчивое для The Augh...
Изначальная идея не моя, но я реализовала ее, основываясь на эффекте, который я видела в одной из этих культовых демозах DOS.
Я решил инкорпорировать эффект в Java Swing JPanel для моего проекта.
Всё внутри панели может быть увеличено с помощью увеличительного стекла, расположенного в выбранных координатах.
Особенно трудно обеспечить, чтобы освежение текстовых компонентов, особенно при изменении местоположения выбранного текста, не оказывало негативного воздействия на визуальный вид.
Когда вы создаете LensJPanel, содержание JPanel применяется к элементу, который будет иметь эффект повышения. Вы можете указать радиус увеличивающего стекла и будет ли он повышать или уменьшать содержание.
Когда у вас есть радиус и выясняется, будет ли увеличительное стекло расширять или уменьшать содержание, создается двухмерная квадратная матрица с одним элементом для каждого квадратного пикселя, содержащего увеличительное стекло.
Алгоритм вычисляет координаты соответствующего исходного пикселя в оригинальном снимке для каждого пикселя назначения, чтобы определить цвет при применении преобразования.
Преобразование предполагает простое преобразование полярных координат, поэтому используется увеличительная линза:
Пиксель рассчитывается по конкретному положению рамы рассеивателя и используется для определения цвета при применении преобразования.Пиксель также будет находиться в раме объективов.Кроме того, рассчитывается радиус от центра рассеивателя до угла для данного пикселя.Пиксель "происхождения" для пикселя, который мы вычисляем, будет под одним углом, но радиус изменится.Радиус составляет от 0% до 100% как для цели, так и для пикселей, при этом 100% соответствует длине радиуса рассеивателя.Источник пиксела рассчитывается для каждого целевого пикселя, сохраняя свой угол и преобразуя радиус с помощью функции с монотонно возрастающей производной. Это преобразование происходит в интервале от 0 до 1, где f(0) равняется 0 и f(1) равно 1. Здесь 0 представляет 0% радиуса рассеивателя, а 1 представляет 100% радиуса рассеивателя.Это означает, что радии отберут источник пикселя из меньшего радиуса, что расширит круг объективов.За пределами круга линзы преобразование будет представлять собой идентичность, что означает, что исходный пиксель не изменится.
Объяснение немного сбивает с толку, но если вам интересно больше узнать об этой теме, не стесняйтесь связаться со мной.
Я надеюсь, что кто-то найдёт это полезным :-).