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

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


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

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



Цитата(RHnd @ May 18 2007, 19:33) *
Не совсем уверен, что правильно выбрал подфорум, но, надеюсь, мне помогут.
Задача ставиться так - в памяти лежит картинка 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 Подскажите, пожалуйста!

Подозреваю, что просто не получится. Допустим, мы "подняли" некий элемент, вычислили его новый адрес, "подняли" эелемент по новому адресу, положили на его место первый "поднятый". Теперь нужно "пристроить" "висящий" элемент - вычисляем его новый адрес и т.д. Но тут может получиься кольцо, т.е. не перебрав всей матрицы мы вернёмся к адресу первого "поднятого" элемента. Эту ситуацию нужно уметь детектировать и выбирать новый "первый" элемент. Насколько эта ситуация реальна мне сказать трудно, теория чисел не является моим сильным местом. Я бы посоветовал обратиться в fido7.ru.math - там точно с этим справятся. Но если это действительно может случится, то алгоритм может получиться жутко прожорливым как по памяти, так и по времени.
А нельзя ли эту матрицу использовать как она есть? Т.е. при обращении к ней переставлять индексы. Или, если она представлена одномерным массивом - руками вычислять смещение i*M+j вместо j*N+i ?
Go to the top of the page
 
+Quote Post
Doka
сообщение May 18 2007, 19:10
Сообщение #3


Electrical Engineer
******

Группа: СуперМодераторы
Сообщений: 2 163
Регистрация: 4-10-04
Пользователь №: 778



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

кстати, да.. забавно, что этого никто не предложил)
вполне рабочее решение если массив потом используется для вывода (или для обработки не требующей строгой ориентации (верт/гориз))


--------------------
Блог iDoka.ru
CV linkedin.com/in/iDoka
Sources github.com/iDoka


Never stop thinking...........................
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
- - 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 Текстовая версия Сейчас: 24th June 2025 - 20:04
Рейтинг@Mail.ru


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