Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.05.2010, 19:25
гость

 
Сообщений: n/a

Поворот изображения
Привет всем. Есть картинка размером w на h, храниться она в одномерном чисельном массиве (в формате 0xAARRGGBB). нужно быстро повернуть её на 90 градусов. Вроде ничего сложного, но я почему-то постоянно вылетаю за пределы массива
  #2  
Старый 21.05.2010, 19:46
MBo MBo вне форума
Местный

Отправить личное сообщение для MBo Посмотреть профиль Найти все сообщения от MBo
 
Регистрация: 21.09.2006
Адрес: Новосибирск
Сообщений: 1,374

повернутая картинка должна быть в новом массиве?
Приведите суть проблемного кода, скорее всего, что-то со счетчиками цикла и индексами намудрили
  #3  
Старый 22.05.2010, 10:17
гость

 
Сообщений: n/a

Код:
    public void createShiftTable() {
        switch (angle) {
            case NO_ROTATE:
                img_w = (or_img_w * percent) / 100;//ширина картинки
                img_h = (or_img_h * percent) / 100;//высота картинки
                break;
            case ROTATE_90:
                img_w = (or_img_h * percent) / 100;
                img_h = (or_img_w * percent) / 100;
                break;
        }
        dst_img = new int[img_w * img_h];//обработанная картинка
//таблица перехода
        xs_tab = new int[img_w];
        ys_tab = new int[img_h];
        for (int x = 0; x < img_w; x++) {
            xs_tab[x] = (or_img_w * x) / img_w;
        }
        for (int y = 0; y < img_h; y++) {
            ys_tab[y] = (or_img_h * y) / img_h;
        }
        System.gc();
    }
....
                for (int y = 0; y < img_h; y++) {
                    for (int x = 0; x < img_w; x++) {
                        dst_img[y + x * img_w] = src_img[ys_tab[x] + or_img_w * xs_tab[y]];
                    }
                }
Вот, код немножко мутноват
  #4  
Старый 22.05.2010, 10:42
Местный

Отправить личное сообщение для prografix Посмотреть профиль Найти все сообщения от prografix
 
Регистрация: 03.11.2006
Адрес: Москва
Сообщений: 167

Надо исправить так:
dst_img[y + x * img_h] = ...
Возможно это не единственное место.
  #5  
Старый 22.05.2010, 11:17
гость

 
Сообщений: n/a

а... я уже разобрался. Вот я блин ))
  #6  
Старый 22.05.2010, 11:19
гость

 
Сообщений: n/a

Код:
    public void createShiftTable() {
        switch (angle) {
            case NO_ROTATE:
                img_w = (or_img_w * percent) / 100;
                img_h = (or_img_h * percent) / 100;
                break;
            case ROTATE_90:
                img_w = (or_img_h * percent) / 100;
                img_h = (or_img_w * percent) / 100;
                break;
        }
        int tmp_img_w = (or_img_w * percent) / 100;
        int tmp_img_h = (or_img_h * percent) / 100;
        dst_img = new int[img_w * img_h];
        xs_tab = new int[tmp_img_w];
        ys_tab = new int[tmp_img_h];
        for (int x = 0; x < tmp_img_w; x++) {
            xs_tab[x] = (or_img_w * x) / tmp_img_w;
        }
        for (int y = 0; y < tmp_img_h; y++) {
            ys_tab[tmp_img_h - y - 1] = or_img_w * ((or_img_h * y) / tmp_img_h);
        }
        System.gc();
    }

    public void Render() {
        int count = 0;
        switch (angle) {
            case NO_ROTATE:
                for (int y = 0; y < img_h; y++) {
                    for (int x = 0; x < img_w; x++) {
                        dst_img[count] = src_img[xs_tab[x] + ys_tab[y]];
                        count++;
                    }
                }
                return;
            case ROTATE_90:
                for (int y = 0; y < img_h; y++) {
                    for (int x = 0; x < img_w; x++) {
                        dst_img[count] = src_img[xs_tab[y] + ys_tab[x]];
                        count++;
                    }
                }
                return;
        }
    }
в общем вот, может кому ещё понадобиться. всё работает
  #7  
Старый 22.05.2010, 15:49
гость

 
Сообщений: n/a

что за говнокод вы тут запостили. ему место на dailywtf толька

делается все гораздо проще

for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
dst_img[x * height + y] = src_img[y * width + x];
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поворот точки вокруг произвольной прямой в 3-мерном пространстве. TrinitroTZ Вычислительная геометрия 8 22.03.2009 20:58
Трансформация изображения DmT Обработка изображений, звук, графика 1 07.09.2008 14:07
Растягивание Изображения гость Обработка изображений, звук, графика 2 04.05.2008 17:53
Супер быстрый поворот изображения Shveya Обработка изображений, звук, графика 10 13.09.2007 15:13
масштабирование изображения Africa Оффтопик 2 28.10.2006 16:15