Ну-ну…
Да ладно, народ делает, делится. Находится на раз: Сглаживание
Вообчем, дело дрянь.. ![]()
Манипуляции с (int) и static_cast ничего не изменили. Вообщем-то, ожидаемо.
А вот с “толстыми” стрелками получился вообще полный песец..
Фотку сделал специально в той позиции, где от картинки тошнит..
А при движении так вообще блевота - выглядит как махание шлангом, взятым за один конец..
Пошёл спать.. Нунах эти “толстые” стрелки, завтра верну взад “тонкие”..
P.S. Подумаю, может перейду на дисплей 2.8 ILI9341 (240/320).
Хотя что-то никакой уверенности в получении приемлимого результата уже нет…
А Вы попробуйте на ПК. Возможно с “виртуальным пикселем” размером от 2х2 до 5х5. Быстрее определитесь, приемлемый результат или нет.
У Вас вон что 318, что 185 тоже выводится весьма кривовато, но претензии почему-то только к стрелкам.
Ээмм, а это как? В wokwi что ли?
Так я специально сфотал в тех позициях, где самая поганая картинка.
Есть вполне приличные. Вот, например.
Но при движении.. Наизнанку выворачивает..
Вам про цифры: страшные и не выровненные!
Есть довольно старая книжка Д. Роджерс “Алгоритмические основы машинной графики”. Там всё весьма просто и наглядно расписано. И про пиксели, и про сглаживание, и про всякое такое прочее.
Да, знаю. Но это фигня. Просто шрифт неудачный применил. Это как раз поправимо.
Посмотрел. Да, красота. Но.. Это для 32-х битных процов, а у меня мега 2560..
Практически законченный проект. Переезжать на STM и прочую “крутизну” нет ни желания, ни опыта работы..
Скорее всего оставлю изначальный вариант с “тонкими стрелками”. Там хоть бычьего … нет. ![]()
Так сделайте стрелки изначально ромбиком, а не одной прямой линией, - глядишь и в глаза бросаться не будет ![]()
И в чём магия? Дисплей вроде как такой же (160х128).
Как при движении стрелки картинка выглядит?
Это визуальная иллюзия.
Какая магия? Такие же ступеньки. Где 5, где 15.

взял бы дисплей 480х320 ;-)))
ЗЫ оно при близком рассмотрении тоже видно, но с 45-50см уже идеально смотрится
Ромбиком???
Треугольником, наверное? Как здесь.
Кстати, как раз хотел спросить, как такая стрелка в коде выглядит?
Как два “склееных” треугольника, или можно как-то сразу из одного сделать?
А чё не ноут с “пятнашкой” сразу?
Ну а если серъёзнее, то у меня 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, но достигается более простыми подручными средствами.
Нет! Ромбиком! Наслаждайтесь(с)
Даа, уж.. Загрузили.. ![]()
Начну, пожалуй, с кода, предложенного lilik.
Там всё более-менее понятно.
Далее пощупаем код по ссылке от толстый. Вроде тоже вписывается в рамки моих познаний.
Хотя, после беглого просмотра кода, появилась “непонятка” - как "ромбик, нарисованный линиями, умудряется превратиться в “закрашенный”?? ![]()
На фото явно видно, что “ромбик” не прозрачный. А в коде “краски” не обнаружил..
Ну а предложение от Мишутк, пожалуй оставлю “на закуску”.
Или вообще пропущу, т.к. явно вижу, что это не мой уровень.. ![]()
Вообщем, вечером попытаюсь поразвлекаться кодингом. Если ничто не отвлечёт.
А “отвлекающий момент” как раз сегодня приехал на “Озоне”.
Супер-пупер крутой паяльник.
Целый месяц ждал! Эх, попаяяяем! ![]()
Ой, вэй! Ещё и “Аврора” на УКВ бродит! Чую, не до кодинга сегодня будет..
Прошу помощь зала - как сюда
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 ); // рисование новой стрелки
передать в переменную “нормальные градусы”?
Весь мозг вынес себе.. ![]()
P.S. Водку не предлагать! До субботы. ![]()





