реклама на сайте
подробности

 
 
> Поворот картинки (транспонирование матрицы), Как сделать через перестановки?
RHnd
сообщение May 18 2007, 17:33
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 518
Регистрация: 12-04-07
Из: Санкт-Петербург
Пользователь №: 26 997



Не совсем уверен, что правильно выбрал подфорум, но, надеюсь, мне помогут.
Задача ставиться так - в памяти лежит картинка NxM, ее нужно повернуть против часовой стрелки на 90 градусов. Так как картинка большая, а памяти мало, то просто переписать ее в новый блок памяти нельзя. Мне кажетя, что должен быть какой-то алгоритм перестановки элементов картинки, решающий задачу, но найтк его как-то не удается.

Пример:
По сути, задача сводится к транспонированию матрицы. Есть матрица 4x3, из нее получается 3x4:
Код
1 2 3                       3 6 9 C
4 5 6           =>          2 5 8 B
7 8 9                       1 4 7 A
A B C

В линейном виде (как в памяти лежит):
Было: Picture[12] = 1 2 3 4 5 6 7 8 9 A B C
Стало: NewPictute[12] = 3 6 9 С 2 5 8 B 1 4 7 A

А вот каким алгоритмом можно переставить элементы Picture так чтобы получился NewPicture для произвольных N и M, я не знаю. sad.gif Подскажите, пожалуйста!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
blackfin
сообщение May 18 2007, 18:03
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 106
Регистрация: 18-04-05
Пользователь №: 4 261



Цитата(RHnd @ May 18 2007, 21:33) *
По сути, задача сводится к транспонированию матрицы. Есть матрица 4x3, из нее получается 3x4:
Скорее, к транспонированию с последующим зеркальным отражением относительно
горизональной линии проходящей через середину матрицы (M/2).
Можно выполнить поворот "на месте", если зарезервировать память под
квадратную матрицу, т.е. 4х4, но лучше, сразу заполнять память в нужном порядке.

Сообщение отредактировал blackfin - May 18 2007, 18:04
Go to the top of the page
 
+Quote Post
RHnd
сообщение May 18 2007, 20:05
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 518
Регистрация: 12-04-07
Из: Санкт-Петербург
Пользователь №: 26 997



Цитата(blackfin @ May 18 2007, 22:03) *
Скорее, к транспонированию с последующим зеркальным отражением относительно
горизональной линии проходящей через середину матрицы (M/2).

Да, точно. smile.gif
Цитата(blackfin @ May 18 2007, 22:03) *
Можно выполнить поворот "на месте", если зарезервировать память под
квадратную матрицу, т.е. 4х4, но лучше, сразу заполнять память в нужном порядке.

Цитата(SasaTheProgrammer @ May 18 2007, 22:41) *
А нельзя ли эту матрицу использовать как она есть? Т.е. при обращении к ней переставлять индексы. Или, если она представлена одномерным массивом - руками вычислять смещение i*M+j вместо j*N+i ?

Квадратную матрицу делать нельзя - массив может быть как 1000x1000, так и 10000x1. А памяти мало. sad.gif
Так же не получится изначально записывать в нужном порядке - в момент начала прихода картинки мы еще ничего не знаем о ее размерах. Фактически, можно сказать, что нам постфактум сообщаются адрес начала, ширина и высота. На счет вычисления адресса руками тоже не пройдет - на выходе мы так же должны предоставить адрес начала, ширину и высоту (новые), а там дальше внешняя прога начнет эти данные гнать наружу.

Цитата(Doka @ May 18 2007, 22:35) *
а тогда если так: переписывать начиная с 0 адреса
притом ячейку назначение перезаписывать (запоминая старое значение) и потом перезаписывать уже это запомненное значение (т.е. куда оно должно быть перемещено (опять перед перезаписью запомнив старое) и т.д. пока вновь не прийдете на нулевой адрес?

Нет, так не получится. Действительно, как отметил SasaTheProgrammer, зацикливание произойдет. Причем, произойдет обязательно. sad.gif

Цитата(SasaTheProgrammer @ May 18 2007, 22:41) *
Я бы посоветовал обратиться в fido7.ru.math - там точно с этим справятся.

А не подскажете, как туда обратиться? Когда-то давно и сам был фидошником, но с тех пор, как интернет прочно вошел в мою жизнь, отстал от положения дел. Там, вроде, надо какой-то специальный софт ставить или что-то такое?

Сообщение отредактировал RHnd - May 18 2007, 20:35
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- RHnd   Поворот картинки (транспонирование матрицы)   May 18 2007, 17:33
|- - SasaTheProgrammer   Цитата(RHnd @ May 18 2007, 22:05) А не по...   May 19 2007, 23:09
- - Doka   Цитата(RHnd @ May 18 2007, 21:33) В линей...   May 18 2007, 18:35
- - SasaTheProgrammer   Цитата(RHnd @ May 18 2007, 19:33) Не совс...   May 18 2007, 18:41
|- - Doka   Цитата(SasaTheProgrammer @ May 18 2007, 22...   May 18 2007, 19:10
- - anton   1. В дсп камнях часто присутствует двумерное дма. ...   May 19 2007, 10:25
|- - RHnd   Цитата(anton @ May 19 2007, 14:25) 1. В д...   May 19 2007, 10:57
- - gfdsa   Алгоритм циклической перестановки для поворота кар...   May 20 2007, 16:10
- - SasaTheProgrammer   Вот придумался алгоритм - очень не быстрый и требу...   May 20 2007, 18:53
|- - RHnd   Цитата(SasaTheProgrammer @ May 20 2007, 22...   May 21 2007, 14:41
|- - shasik   Не знаю на сколько еще актуально... Посмотрите кн...   May 25 2007, 08:59
|- - Oldring   Цитата(RHnd @ May 21 2007, 18:41) учитыва...   May 25 2007, 09:52
|- - Oldring   Цитата(Oldring @ May 25 2007, 13:52) Ну и...   May 26 2007, 09:28
- - SasaTheProgrammer   Вот какое-то решение из ФИДО (извините ребята, я с...   Jun 21 2007, 01:05


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 18:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016