Вывод текста под углом

В процессе разработки пульта управления для системы сбора дождевой воды появилась у меня потребность вывода текста под углом. В случае TFT-дисплея отмахнулся бы от подобного желания, как требующего слишком много ресурсов от микроконтроллера. Но поскольку графикой в моих проектах занимается полновесный графический процессор (тот, который установлен в смартфоне и управляется с Ардуины по Bluetooth- или WiFi-каналу), то почему бы и нет?

Сказано - через несколько дней сделано.

В результате, система команд моего виртуального дисплея дополнилась еще одной - “#TM<параметры>;”. С ее помощью дисплею задается матрица преобразования, вращающая выводимый после нее текст на заданный угол вокруг заданного центра вращения. Эта матрица преобразования учитывается при всех последующих выводах текста до тех пор, пока она не будет изменена или обнулена.

Теперь немного подробнее о формате команды. В ней передается три параметра:

#TM,,;”

это, соответственно, координаты центра вращения (X,Y) и угол поворота текста (Alpha). Пара X,Y задает расстояние в пикселях до центра вращения от верхнего левого угла дисплея, а Alpha - угол поворота выводимого текста (в градусах), положительное направление - против часовой стрелки.

Далее приведен блок кода, использовавшийся для тестирования. Он выводит текстовые строки под углами от 90 градусов до -90 с шагом -30 градусов, т.е. под углами 90, 60, 30, 0, -30, -60, -90 градусов.

Чтобы два раза не вставать, в этот блок добавлены команды изменения размера шрифта (setTextSize), а также команды изменения цвета шрифта/фона (setTextColors).

Текст с выравниванием по левой границе выводится командой outTextL.

Последней формируется команда обнуления матрицы преобразования “#TM0,0,0;”, после обработки которой все последующие текстовые выводы будут производиться строго горизонтально.

  i=0;
  for(int a=90;a>=-90;a=a-30) {
    if(i%2==1) addCmdString(mdScout.setTextColors(i+1, i));
    else addCmdString(mdScout.setTextColors(i+1, 0));
    addCmdString(mdScout.setTextSize(20+i*2));
    sprintf(s,"#TM130,%d,%d;",350,a);
    addCmdString(s);
    sprintf(s,"= Текст под углом %d =",a);
    addCmdString(mdScout.outTextL(100,350+i*20,s));
    i++;
  }
  addCmdString("#TM0,0,0;");
 
  sendString(sResponse);

В результате выполнения этого цикла получаем на экране смартфона следующую картинку:


Вот, собственно, и все - задача вращения текста решается с минимальным использованием ресурсов микроконтроллера.

Вот, сопс-сно, и нахуа?

3 лайка

Вопрос то по программированию у вас какой? Или вы просто ошиблись разделом форума. И почему отдельной темой? У ыас же уже есть тема, где вы информируете общество о вашем чудесном прилжении. Только использовать его нет никакого желания, нет исходников. А многие мир видят иначе чем вы. Вид едва до троечки дотягивает, даже имея графический процессор. Почему?

Да никакого.
Он просто поделился опытом, как я понял.

@step962
это все здорово, но нормально смотреться будет только на дисплее с хер скока точек на дюйм… Попробуйте так на ОЛЕДе с его 128х64 повернуть - будет ужОс :slight_smile:

1 лайк

Ну, а дальше предполагается обсуждение с заинтересованными лицами.
Я, в первую очередь, собираюсь использовать это при оформлении осей на графиках. Например, горизонтальные отметки в 4-5 позиций по оси абсцисс могут уже налезать друг на друга, если расположить их вертикально - отгрызают слишком много места. А расположенные под углом - оптимально используют площадь дисплея.
Другие могут воспользоваться этой возможностью в иных ситуациях.

Как заметил b707, я поделился опытом решения возникшего передо мной вопроса. Комбинация Arduino+TFT-дисплей (ну или OLED) не потянет эту задачу - ни разрешения не хватит, ни ресурсов микроконтроллера для борьбы с искажениями, возникающими при повороте/масштабировании растровых шрифтов.

Вид едва до троечки дотягивает, даже имея графический процессор. Почему?

Вы о каком виде говорите? О приведенном скриншоте? Так это же всего лишь иллюстрация описываемого решения. Естественно, без претензий на высокую эстетическую ценность.

Вообще мне нравится идея ТС. Его маркетинг немного раздражает, но идея - верная.
В большинстве мне знакомых устройствах домашней автоматизации собственный экран не нужен. Всё можно делать с мобильника. Правда удобнее это делать на простом веб-интерфейсе.

Бывают приборы, где от экрана не откажешься, но чаще (ИМХО) экран ставится “для красоты”. Ведь и правда у каждого (ну кроме БУУМа) в кармане смартфон. :wink:


Кстати я, чисто для отладки, имею имитацию любого дисплея, которая, к тому же, работает с Адафрутовской GFX. На Джаве, но не для тилипона, а на ПК.

Да, это решение для альтернативы традиционно применяемым дисплеям - комбинации микроконтроллер+Bluetooth/WiFi+смартфон. Хер скока точек на дюйм присутствует по умолчанию.

Кстати, смартфон в качестве дисплея можно использовать не вместо, а ВМЕСТЕ со стационарным дисплеем. Цена вопроса - два пина плюс Bluetooth-модуль. Вот прихожу я на дачу, сажусь в тенечке и последовательно подключаюсь со смартфона и к своей метеостанции, и к датчикам в теплице, и к системе водоснабжения - без необходимости носиться из угла в угол участка, чтобы пообщаться с тем или иным устройством через слепой дисплей с невнятным тачскрином…

Ты просто ущербен в своем старании доказать правоту там, где её нет. Погорелец - ни добавить ни убавить.