|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
17.11.2012, 18:50 | #1 |
Пользователь
Регистрация: 17.06.2012
Сообщений: 12
|
Алгоритм точного поворота растрового изображения
Всем привет!
Из спортивного интереса решил написать алгоритм для прецизионного поворота растрового изображения на произвольный угол относительно произвольной точки поворота. Но боюсь, что изобретаю велосипед... Много видел сообщений о то, что такой алгоритм будет очень медленный и громоздкий, но самого алгоритма никто показать не может. Может здесь кто-нибудь встречал такой алгоритм? |
17.11.2012, 20:52 | #2 |
Участник клуба
Регистрация: 30.07.2009
Сообщений: 1,601
|
Добрый, на данный момент, вечер. Честно скажу, что даже не разбирал этот код. Смотрел только на название функции. Не помню даже, откуда взялся. Он поворачивает изображение, находящееся в TBitmap. Мои знания в этом направлении закончились
|
17.11.2012, 21:21 | #3 |
Пользователь
Регистрация: 17.06.2012
Сообщений: 12
|
Благодарю за ответ - во вложении один из быстрых но неточных алгоритмов поворота. Меня же интересует точный алгоритм, вне зависимости от того, как долго он будет выполняться.
|
17.11.2012, 22:37 | #4 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Цитата:
программа — запись алгоритма на языке понятном транслятору
|
|
17.11.2012, 23:41 | #5 |
Пользователь
Регистрация: 17.06.2012
Сообщений: 12
|
Под "точным" алгоритмом я понимаю такой алгоритм, который даёт результат с ошибкой на уровне точности используемых типов данных. Т.е. если я использую, например, тип данных extended, то ошибка должна лежать в 19 знаке после запятой.
В интересующей меня тут задаче, если мы используем 24 битный цвет, то extended даёт даже слишком большой запас точности. Поскольку мы всё-равно округляем каждый канал RGB до целого значения (максимум 255 - 3 знака) нам достаточно иметь только 4 точных знака после запятой, а это значит, что возможно получить абсолютно точное решение даже с типом данных double. Т.е. в данной задаче можно получить настолько точное решение, что точнее не бывает. |
18.11.2012, 02:48 | #6 |
Пользователь
Регистрация: 01.11.2009
Сообщений: 99
|
О матрицах преобразования что-нибудь слышали?
Если интересует, могу скинуть рабочий пример на делфях(поворот треугольника,закрашенного и с наложенной текстурой на произвольный угол отнисительно заданной точки) |
18.11.2012, 03:06 | #7 |
Пользователь
Регистрация: 17.06.2012
Сообщений: 12
|
shelest, проблема не в том, чтобы повернуть точку на произвольный угол, а в том, что сетка исходного растрового изображения накладывается на сетку итогового изображения нетривиальным образом. При этом квадрату в итоговом изображении может соответствовать, например, восьмиугольник и 4 треугольника "отрезанных" от разных пикселей исходного изображения... Вот здесь есть примерная картинка.
Но за попытку помочь - спасибо. |
18.11.2012, 11:22 | #8 | |
Старожил
Регистрация: 20.04.2008
Сообщений: 5,526
|
Цитата:
программа — запись алгоритма на языке понятном транслятору
|
|
18.11.2012, 14:08 | #9 |
Пользователь
Регистрация: 16.05.2012
Сообщений: 20
|
Алгоритм? Могу попробовать описать своё видение.
Итак, все точки вращаются по окружности. Допустим х и у - координаты точки относительно центра вращения. Если это катеты прямоугольного треугольника то радиус вращения - гипотенуза. Значит радиус будет равен квадратному корню из суммы квадратов координат. При помощи тригонометрии не трудно посчитать угол наклона гипотенузы относительно координатной сетки, и изменив его посчитать новые координаты. Берём точку итогового изображения и расчитываем её точные координаты на исходном изображении. Мне кажется, в данном сучае точка всё-таки скорей круг чем квадрат и не имеет угла поворота. Возможно, четырёх точек для определения её цвета будет достаточно. При помощи точных координат можно определить наиблизкую точку, ближайшую по оси х, ближайшую по оси у ну и четвёртую, чтоб получился квадрат. Далее необходимо расчитать коэффициены "важности" каждой из четырёх точек. Для этого отбрасываем целые части координат итоговой точки и перемножаем дробные части соответствующим образом: х*у, х(1-у), у(1-х), (1-х)(1-у). Умножаем значения цвета каждой из четырёх точек на её коэффициент и складываем результаты - получаем значение цвета итоговой точки (проделать отдельно для red, green, blue). |
18.11.2012, 15:12 | #10 | |||
Пользователь
Регистрация: 17.06.2012
Сообщений: 12
|
Цитата:
Чтобы не быть голословным приведу результат работы точного алгоритма и результат работы Photoshop. Я взял изображение в виде горизонтальной линии толщиной 1 пиксель и длиной 10 пикселей чёрного цвета на белом фоне и повернул его по часовой стрелке на 3 градуса. Сверху - результат работы точного алгоритма, снизу - результат работы Photoshop (изображение увеличено в 24 раза): На мой взгляд, это очень большое искажение. Цитата:
Цитата:
|
|||
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Что я не правильно делаю в функции поворота изображения | maxcroud | C# (си шарп) | 2 | 18.06.2012 16:36 |
алгоритм поворота в игре змейка | Xneo | C# (си шарп) | 1 | 27.05.2012 13:29 |
Поворот изображения, матрица поворота | kordax | Помощь студентам | 9 | 19.01.2012 23:21 |
загрузка растрового изображения | Serg16361898 | Помощь студентам | 0 | 01.06.2010 20:15 |
Процедура поворота изображения | Илья PHoeNiX | Общие вопросы Delphi | 3 | 08.06.2008 13:59 |