В функцию вместо ожидаемого int16_t передаётся float

Ну-ну…

Да ладно, народ делает, делится. Находится на раз: Сглаживание

Вообчем, дело дрянь.. :frowning:
Манипуляции с (int) и static_cast ничего не изменили. Вообщем-то, ожидаемо.
А вот с “толстыми” стрелками получился вообще полный песец..


Фотку сделал специально в той позиции, где от картинки тошнит..
А при движении так вообще блевота - выглядит как махание шлангом, взятым за один конец.. :cry:

Пошёл спать.. Нунах эти “толстые” стрелки, завтра верну взад “тонкие”..

P.S. Подумаю, может перейду на дисплей 2.8 ILI9341 (240/320).
Хотя что-то никакой уверенности в получении приемлимого результата уже нет…

А Вы попробуйте на ПК. Возможно с “виртуальным пикселем” размером от 2х2 до 5х5. Быстрее определитесь, приемлемый результат или нет.
У Вас вон что 318, что 185 тоже выводится весьма кривовато, но претензии почему-то только к стрелкам.

Ээмм, а это как? В wokwi что ли?

Так я специально сфотал в тех позициях, где самая поганая картинка.
Есть вполне приличные. Вот, например.


Но при движении.. Наизнанку выворачивает.. :frowning:

Вам про цифры: страшные и не выровненные!

Есть довольно старая книжка Д. Роджерс “Алгоритмические основы машинной графики”. Там всё весьма просто и наглядно расписано. И про пиксели, и про сглаживание, и про всякое такое прочее.

Да, знаю. Но это фигня. Просто шрифт неудачный применил. Это как раз поправимо.

Посмотрел. Да, красота. Но.. Это для 32-х битных процов, а у меня мега 2560..
Практически законченный проект. Переезжать на STM и прочую “крутизну” нет ни желания, ни опыта работы..
Скорее всего оставлю изначальный вариант с “тонкими стрелками”. Там хоть бычьего … нет. :slight_smile:

Так сделайте стрелки изначально ромбиком, а не одной прямой линией, - глядишь и в глаза бросаться не будет :roll_eyes:

Да пожалуйста :slight_smile:

И в чём магия? Дисплей вроде как такой же (160х128).
Как при движении стрелки картинка выглядит?

Это визуальная иллюзия.

Какая магия? Такие же ступеньки. Где 5, где 15.

VID_20220828_075256

взял бы дисплей 480х320 ;-)))
ЗЫ оно при близком рассмотрении тоже видно, но с 45-50см уже идеально смотрится

Ромбиком??? :roll_eyes: Треугольником, наверное? Как здесь.
Кстати, как раз хотел спросить, как такая стрелка в коде выглядит?
Как два “склееных” треугольника, или можно как-то сразу из одного сделать?

А чё не ноут с “пятнашкой” сразу?
Ну а если серъёзнее, то у меня 2.8’’ (240/320) едва влезает в конструкцию.

// СЕКУНДОМЕР
#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#define TFT_CS     10
#define TFT_RST    9
#define TFT_DC     8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

float a = 0.00; // переменная для угла поворота стрелки
float aa = 0.00; // переменная для угла поворота стрелки (предыдущее значение)
int str = 55; //длина стрелки в пикселях
byte sek = 16; //

void setup(void) {
  // Используйте этот инициализатор, если вы используете 1,8-дюймовый TFT
  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
  tft.cp437(true);//для правильного отображения русского алфавита
  tft.fillScreen(ST7735_BLACK);
  tft.setRotation(1);//ориентация экрана
  tft.drawCircle(80, 64, 63, ST7735_WHITE ); //обод секундомера
  tft.drawCircle(80, 64, 62, ST7735_WHITE );
  tft.drawCircle(80, 64, 61, ST7735_WHITE );

}
void loop() {
  //
  aa = a;
  //
  tft.setCursor(50, 45);
  tft.setTextSize(1);
  tft.setTextColor(ST7735_GREEN);
  tft.println(utf8rus("СЕКУНДОМЕР"));
  tft.setCursor(70, 80);
  tft.setTextSize(2);
  tft.setTextColor(ST7735_GREEN);
  if (sek < 10) {
    tft.print("0");
  } tft.println(sek);
  //
  tft.fillTriangle(80 + cos(aa + 1.5)*str * 0.1, 64 + sin(aa + 1.5)*str * 0.1, 80 + cos(aa)*str, 64 + sin(aa)*str, 80 + cos(aa - 1.5)*str * 0.1, 64 + sin(aa - 1.5)*str * 0.1, ST7735_BLACK ); // стирание старой стрелки
  a = a + PI / 30;
  tft.fillCircle(80, 64, 7, ST7735_WHITE );
  for (float i = 0.01; i < 2 * PI; i = i + PI / 30) {
    tft.drawLine(80 + cos(i)*str * 0.90,  64 + sin(i)*str * 0.90, 80 + cos(i)*str,  64 + sin(i)*str, ST7735_GREEN    ); // риски-метки шкалы через 1 сек
  }
  for (float i = 0.01; i < 2 * PI; i = i + PI / 6) {
    tft.drawLine(80 + cos(i)*str * 0.75,  64 + sin(i)*str * 0.75, 80 + cos(i)*str,  64 + sin(i)*str, ST7735_WHITE   ); // риски-метки шкалы через 5 сек
  }
  tft.fillTriangle(80 + cos(a + 1.5)*str * 0.1, 64 + sin(a + 1.5)*str * 0.1, 80 + cos(a)*str, 64 + sin(a)*str, 80 + cos(a - 1.5)*str * 0.1, 64 + sin(a - 1.5)*str * 0.1, ST7735_WHITE ); // рисование новой стрелки
  tft.fillCircle(80, 64, 3, ST7735_BLACK );

  sek++; if (sek > 59) {
    sek = 0;
  }
  //
  delay(835);//подбираем опытным путём
  tft.fillRect(70, 80, 30, 20, ST7735_BLACK);
}
////////////////////////////////////////////////////////////////////////
/* Функция перекодировки русских букв из UTF-8 в Win-1251 */
String utf8rus(String source)
{
  int i, k;
  String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

  k = source.length(); i = 0;

  while (i < k) {
    n = source[i]; i++;

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
            n = source[i]; i++;
            if (n == 0x81) {
              n = 0xA8;
              break;
            }
            if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
            break;
          }
        case 0xD1: {
            n = source[i]; i++;
            if (n == 0x91) {
              n = 0xB8;
              break;
            }
            if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
            break;
          }
      }
    }
    m[0] = n; target = target + String(m);
  }
  return target;
}
///////////////////////////////////////////////////////////////////////////


Прежде чем сдаться попробуйте обманку. Рисуете толстую стрелку цветом отличающимся от фона на четверть (между основным цветом стрелки и фоном). Поверх рисуете стрелку на пару пикселей тоньше и более ярким цветом. Поверх еще одну стрелку еще тоньше и основным цветом. Пока что не обращайте внимание на производительность. Подберите количество шагов, градаций цвета и изменений размера. Покрутите по циферблату с небольшими скоростями. Если эффект понравится, будете заниматься оптимизацией. Это “плюшевое“ сглаживание. Немного похоже по эффекту на обычный antialiasing, но достигается более простыми подручными средствами.

Нет! Ромбиком! Наслаждайтесь(с)

1 лайк

Даа, уж.. Загрузили.. :slightly_smiling_face:
Начну, пожалуй, с кода, предложенного lilik.
Там всё более-менее понятно.
Далее пощупаем код по ссылке от толстый. Вроде тоже вписывается в рамки моих познаний.
Хотя, после беглого просмотра кода, появилась “непонятка” - как "ромбик, нарисованный линиями, умудряется превратиться в “закрашенный”?? :roll_eyes:
На фото явно видно, что “ромбик” не прозрачный. А в коде “краски” не обнаружил..

Ну а предложение от Мишутк, пожалуй оставлю “на закуску”.
Или вообще пропущу, т.к. явно вижу, что это не мой уровень.. :frowning:

Вообщем, вечером попытаюсь поразвлекаться кодингом. Если ничто не отвлечёт.
А “отвлекающий момент” как раз сегодня приехал на “Озоне”.
Супер-пупер крутой паяльник. :slight_smile: Целый месяц ждал! Эх, попаяяяем! :face_savoring_food:
Ой, вэй! Ещё и “Аврора” на УКВ бродит! Чую, не до кодинга сегодня будет..

Прошу помощь зала - как сюда

 tft.fillTriangle(80 + cos(a + 1.5)*str * 0.1, 64 + sin(a + 1.5)*str * 0.1, 80 + cos(a)*str, 64 + sin(a)*str, 80 + cos(a - 1.5)*str * 0.1, 64 + sin(a - 1.5)*str * 0.1, ST7735_WHITE ); // рисование новой стрелки

передать в переменную “нормальные градусы”?
Весь мозг вынес себе.. :frowning:

P.S. Водку не предлагать! До субботы. :wink: