16+
Суббота
16 декабря
Вход |Карта сайта | |Upload |codebook | PARTS

 О смысле всего сущего 0xFF

 Средства и методы разработки

 Мобильная и беспроводная связь

 Блошиный рынок Объявления

caxapa

Микроконтроллеры ARM 

AVR PIC MSP PLD,FPGA,DSP 

Кибернетика Технологии 

Схемы, платы, компоненты 

Средства и методы разработки

 
   Новая тема Правила Регистрация Поиск »» Архив
Вернуться в конференциюТопик полностью
Ксения  (06.12.2017 17:16 - 06.12.2017 17:19, ссылка) , в ответ на ЗЫ: на самом деле основная сложность - краткость документации и всякие хитрые режимы направления разверток, ориентации и т.п., т.е. начальная инициализация, с которой приходится экспериментировать из-за краткости документации и непоняток как автор: AVF
А я вот смотрю сейчас на реализацию алгоритма Брезенхэма (проведение прямой на дискретном поле) и диву даюсь, как косолапо эта процедура для ARM'ов написана - везде, где требуется поставить следующую точку правее или выше, вызываются функции (!) 
DrawHorizontalLine() и DrawVerticalLine(). Причем даже в случаях, когда надо провести чисто горизонтальную или чисто вертикальную линию, то все равно пользуются алгоритмом Брезенхэма, т.к. обе эти функции внутренние и прямого доступа к ним нет. Какая GUI после этого станет на этом дисплее быстро работать, если наиболее часто используемый графический примитив так написан? Тогда как у электронщиков глаза в одну кучку сведены - "надо аппаратное ускорение делать!". Т.е. им аппаратное ускорение легче сделать, чем проведение линии эффективно запрограммировать. Я вот смотрю сейчас на файл GLCD_LPC1700.cpp из "uVision/ARM development tools" и вижу, что они его с C на C++ переписали, чтобы оформить графические примитивы отдельным классом, а примитив drawLine(), каким был дурацким, таким и остался. Хуже того - он у них еще и через float и double() работает!
Функция drawLine() началась раньше - спереди есть еще очень много чего, но здесь просто перл неэффективности:
...
    else if (abs(x2-x1)>abs(y2-y1))
    {
        delta=(double(y2-y1)/double(x2-x1));
        ty=double(y1);
        if (x1>x2)
        {
            for (int i=x1; i>=x2; i--)
            {
                drawPixel(i, int(ty+0.5));
                ty=ty-delta;
            }
        }
        else
        {
            for (int i=x1; i<=x2; i++)
            {
                drawPixel(i, int(ty+0.5));                
                ty=ty+delta;
            }
        }

    }
    else
    {
        delta=(float(x2-x1)/float(y2-y1));
        tx=float(x1);
        if (y1>y2)
        {
            for (int i=y2+1; i>y1; i--)
            {
                drawPixel(int(tx+0.5), i);
                tx=tx+delta;
            }
        }
        else
        {
            for (int i=y1; i<y2+1; i++)
            {
                drawPixel(int(tx+0.5), i);            
                tx=tx+delta;
            }
        }
    }
Функция drawLine() еще не закончена - сзади есть еще очень много чего, то здесь - просто перл неэффективности:
...
Примечание: Помимо всего прочего, int(tx+0.5) - это так оно у них округление делается из float/double в int.
 [x][x][x][x][x][x] [x][x][x][x][x][x][x][x]

Тема выделяется по переводу строки или автоматом

 

Имя


Регистрация позволит вам редактировать и перемещать ваши сообщения и прикреплять к ним файлы.
 
Символы: á é ó ú ý « »
Главная | Карта сайта | О проекте | Проекты | Файлообменник | Регистрация | Вебмастер | RSS
Лето 7526 от сотворения мира. При использовании материалов сайта ссылка на caxapу обязательна.
MMI © MMXVII