Форум программистов, компьютерный форум CyberForum.ru

Эффект линзы - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Как удалить элемент из массива? http://www.cyberforum.ru/cpp-beginners/thread147368.html
покажите пожалуйста пример с простым массивом и с динамическим....... ____________ зарание спс:)
C++ Как создать функцию, которая определит с каким типом данных ей работать и подстроиться под этот тип? например если мне нужно создать шаблон функции сортировки одномерных массивов произвольного типа))) http://www.cyberforum.ru/cpp-beginners/thread147365.html
C++ Составить программу для подсчета произведения элементов целочисленной матрицы Y, рамерами m на n, сумма двох индексов которых - число парное.
Составить программу для подсчета произведения элементов целочисленной матрицы Y, рамерами m на n, сумма двох индексов которых - число парное. Сформировать матрицу с помощью генератора случайных чисел и организовать ее вывод на экран. Добавлено через 17 часов 6 минут :cry:
C++ Составить программу которая находит max значение среди элементов линейной таблицы Y которая состоит из N целых чисел и у которых непарные индексы.
Составить программу которая находит максимально значение среди элементов линейной таблицы Y которая состоит из N целых чисел и у которых непарные индексы. Добавлено через 7 часов 6 минут помогите пожалуйста:-[
C++ Одномерный массив... http://www.cyberforum.ru/cpp-beginners/thread147351.html
Как записать время в одномерный массив из 2 элементов и что бы выводило "06 04" т.е. не скидывало "ноль" при выводе на экран... подскажите плиз
C++ Еще строки 13. Функция в строке ищет все буквенные подстроки и после каждой вставляет полученный через параметры символ. Функция возвращает адрес строки, если удалось вставить хотя бы один символ, в противном случае 0 Добавлено через 7 минут только в С++ пишите если ченить придумаете плиЗ) подробнее

Показать сообщение отдельно
Nick Alte
Эксперт С++
1594 / 986 / 117
Регистрация: 27.09.2009
Сообщений: 1,901
Завершенные тесты: 1
19.06.2010, 17:04     Эффект линзы
Рассмотрим достаточно простой вариант. Пусть нам надо включить круглую линзу с радиусом R = N/2 на участке N*N пикселей. Пусть в этой линзе будет показан исходный рисунок с увеличением, зависящим от расстояния до центра. Допустим, в самом центре увеличение в M раз, и оно линейно убывает до 1 у самого края линзы (в дальнейшем можно перейти к нелинейной зависимости).

Будем исходить из наиболее популярной системы индексации точек: координата x по горизонтали, y - по вертикали вниз, точка с координатами (0, 0) расположена в верхнем левом углу. В такой системе координатами центра будет точка (R, R). Расстоянием от точки (x, y) до центра будет
r = sqrt((x-R)^2 + (y-R)^2)
Для удобства можно переместить нулевую точку в центр:
x' = x - R, y' = y - R

Определим формулу для фактора увеличения в зависимости от расстояния до центра r:
F(r) = 1 + r*(M-1)/R
Фактор увеличения, очевидно, определяет взаимосвязь между расстояниями от центра для одной и той же точки на исходной картинке и на результирующей: r = r_old / F. При этом угол, под которым точка расположена относительно центра, неизменен. При условии постоянства угла изменение радиуса влечёт за собой пропорциональное изменение координат x', y'.
Собрав всё это вместе, мы получим следующий алгоритм:

для каждой точки (x, y) в интересующем нас квадрате:
- вычислить (x', y') = (x-R, y-R)
- определить расстояние до центра r = sqrt(x'^2 + y'^2)
- Если r>R, то
- занести по координатам (x, y) значение цвета из исходного изображения с теми же координатами: эта точка за пределами линзы.
- иначе:
- определить координаты на старом изображении: x_old = R + x'*F(r), y_old = R + y'*F(r)
- определить цвет точки по координатам x_old, y_old и занести его в формируемое изображение по координатам (x, y)
конец

Определять цвет точки в исходном изображении можно с разной степенью точности в зависимости от потребностей: округлять полученные x_old, y_old и брать ближайшее значение из исходного рисунка; простейшая линейная (точнее, билинейная) интерполяция по четырём ближайшим точкам; кубическая или более сложная фильтрация. В зависимости от выбранного метода получится более или менее гладкий эффект.
Изменение формулы F(r) позволит регулировать "увеличение" и геометрию искажений. Наиболее очевидным шагом в этом направлении будет замена линейной зависимости от r на квадратичную.
 
Текущее время: 22:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru