ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
25 апреля
799994 Топик полностью
Ксения (06.12.2017 17:16 - 17:19, просмотров: 251) ответил AVF на ЗЫ: на самом деле основная сложность - краткость документации и всякие хитрые режимы направления разверток, ориентации и т.п., т.е. начальная инициализация, с которой приходится экспериментировать из-за краткости документации и непоняток как
А я вот смотрю сейчас на реализацию алгоритма Брезенхэма (проведение прямой на дискретном поле) и диву даюсь, как косолапо эта процедура для ARM'ов написана - везде, где требуется поставить следующую точку правее или выше, вызываются функции (!) http://ru.wikipedia.org/wiki/%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_%D0%91%D1%80%D0%B5%D0%B7%D0%B5%D0%BD%D1%85%D1%8D%D0%BC%D0%B0
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.