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

 
 
> Поворот картинки (транспонирование матрицы), Как сделать через перестановки?
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
Ответов
SasaTheProgramme...
сообщение Jun 21 2007, 01:05
Сообщение #2


Частый гость
**

Группа: Новичок
Сообщений: 129
Регистрация: 4-08-06
Пользователь №: 19 327



Вот какое-то решение из ФИДО (извините ребята, я сейчас анализировать/проверять не могу. И вообще ничего не могу).
=======
Alex Kocharin wrote:
> Комбинация транспонирования и отражения.
>
> Транспонирование:
> (x,y) -> (y,x)
> x*N+y -> y*M+x
>
> Отражение:
> (x,y) -> (x,M-y-1)
> x*M+y -> x*M+M-y-1
>
> Т.е.
> x*N+y -> y*M+M-x-1
>
> Отбратно: транспонирование:
> (x,y) -> (y,x)
> x*N+y -> y*M+x
>
> Отражение:
> (x,y) -> (N-x-1,y)
> x*N+y -> (M-x-1)*N+y
>
> Т.е.
> x*N+y -> (M-y-1)*N+x
>
> Программа (не оптимизированная):
>
> for(int i=0; i<M*N; i++) {
> int x1 = i/N, y1 = i-x1*N;
> int prev = (M-y1-1)*N+x1;
> if (prev < i) {
> int ires = y1*M+M-x1-1;
> int t = picture[ires];
> picture[ires] = picture[i];
> picture[i] = t;
> }
> }
>
> Сдаём заказчику:
>
> int i;i^=i;for(;i<M*N;){int x1=i/N,y1=i-x1*N,p=M*N-y1*N-N+x1;if(p<i){int
> r=y1*M+M-x1-1,t=p[r];p[r]=p[i];p[i++]=t;}}
>
> Проверяй. ;-)))
>
> Возможно, я где-то ошибся - там N вместо M или единичка где лишняя... По
> крайней мере, идея imho верная.
>
>
=======
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- RHnd   Поворот картинки (транспонирование матрицы)   May 18 2007, 17:33
- - blackfin   Цитата(RHnd @ May 18 2007, 21:33) По сути...   May 18 2007, 18:03
|- - RHnd   Цитата(blackfin @ May 18 2007, 22:03) Ско...   May 18 2007, 20:05
|- - 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


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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 12:22
Рейтинг@Mail.ru


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