@DROS

Как реализовать (алгоритм) отрисовку графики «по слоям» на МК?

День добрый всем.

Вопрос вот в чем. Имеется МК (avr arm) и граф.дисплей к нему (TFT 320х480). Конкретно в данном случае необходимо реализовать вывод показаний в виде аналогового индикатора (+ на свободном месте экрана - график, но это к воросу отношения не имеет). Индикатор отображается подложкой в виде обычной картинки, стрелка его - так же картинка. Соотв. как наиболее грамотно реализовать вывод этой информации на экран ЖКИ ?

Решение в лоб - крутим стрелку на нужный градус, перерисовываем подложку, рисуем стрелку поверх нее. Это самое простое решение, но как по мне, не самое элегантное. Дело в том, что если ЖКИ будет, скажем, 640х800 пикселей, перерисовка займет весьма много времени и будет заметна на глаз. Хотелось бы фен-шуя и красоты.

Второе решение, приходящее на ум - это читать с дисплея область с уже отрисованной стрелкой, обсчитывать область с новым ее расположением и заменять первое вторым, тем самым минимизируя область перерисовки, поскольку динамическая область "аналогового индикатора" дай бог процентов 35-40.

Может кто еще какие соображения подкинет, поделится личным опытом так сказать. Готовых либ что-то не нарыл, даже если с ардуины портировать под обычный AVR C.
  • Вопрос задан
  • 359 просмотров
Решения вопроса 1
AlanDrakes
@AlanDrakes
Без двойного буфера - самое простое помнить "старое значение", где была стрелка, и новое значение - где её нужно перерисовать. Тоже не самый удобный вариант, но его можно реализвать так:
- Стирание стрелки по старым координатам. (Восстановление части заднего фона)
- Рисование стрелки по новым координатам.
Плюсы - Не нужно много памяти. Фактически, только данные о стрелке, координатах и тому подобное.
Минусы - Минимум два кадра отрисовки.

Другой вариант - создавать временный буфер памяти, в котором будет рисоваться изменённая картинка, а затем выводить её на экран (заменять прямоугольник).
Минусы - Требуется память. Много. Можно попытаться отхватить больше памяти, чем есть в чипе.
Плюсы - Делается за один кадр.

Почему бы не использовать что-то другое? Ползунковые индикаторы / полосу / цифры, например. Их проще отрисовать быстро.
Хотя, если так хочется - то... как говорится.
Но лично я эти стрелочки пропустил для себя.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@nirvimel
Если на двойную буферизацию памяти жалко, то остается только городить нетривиальный алгоритм перерисовки. Например:
  1. Создать маску для стрелки: из канала прозрачности (1 бит) стрелки в конечном положении вычесть канал прозрачности стрелки в начальном положении.
  2. Залить область с маской изображением стрелки в конечном положении.
  3. Создать маску для заливки: из канала прозрачности стрелки в начальном положении вычесть канал прозрачности стрелки в конечном положении.
  4. Залить область с маской изображением фона.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы