ILI9488 3,95 дюйма, сенсорный экран

Сработало, без всяких ухищрений.

Естественно )))

Маме нравилось его творчество.



…надо попробовать опции трансформации имеющегося шрифта не только по масштабу.

Без кривых Безье всё очень угловато …

Конечно, но в сравнении с моим почерком, мой печатный почерк просто шедевр… Тут надо понимать, что вариант рисования реального в сенсорном экране интереснее программируемых кривых… В примере сканера, который я выложил, можно уменьшить паузу между считываниями сенсора, тогда отрезки уменьшатся в размерах, шаблон можно увеличить и будут реальные кривые через большое количество коротких отрезков. Но!, это под силу рисовать тому кто умеет, я не умею и смысл мне редактировать сканер? Жена сказала- это интересно, но рисовать 95 символов не буду.

Вариации преобразования одного векторного шрифта.

По формату хранения букв - откуда появляются отрицательные координаты? Какая базовая точка у символа?

Кстати, по-моему оно все помещается в байт. Можно уменьшить размер шрифта вдвое

Да, можно. Базовая точка - левый верхний угол:


666,666 показывают разрывы в рисовании отрезков, их можно изменить. Стрелка показывает область отрицательных значений для х. Ширина базы в используемом варианте скетча сканера букв 80 пикселей.

Кстати. если уж вы не стали харнить координаты в одном общем массиве и делаете массив отдельно для каждой буквы - то массив размеров вам не нужен. Просто придумайте маркер конца буквы по типу того, что вы придумали для поднятия пера - 666

Уж больно вот это коряво смотрится, да и чревато ошибками

for(int i=0;i<DL-2;i=i+2){
 if(massiv[i+2]!=666){ 
tft.drawLine(Xb+b*M*massiv[i],Yb+c*M*massiv[i+1] ,Xb+b*M*massiv[i+2] ,Yb+c*M*massiv[i+3] ,tft.color565(255,255,255)); 
//tft.drawLine(Xb+M*massiv[i],Yb+M*massiv[i+1] ,Xb+M*massiv[i+2] ,Yb+M*massiv[i+3] ,tft.color565(200,20,0));//цвет рисуемых символов   
}
else{i=i+2;}
}

Попробовать типа такого варианта?

for(int i=0;;i=i+2){
if(massiv[i+2]==333){break;}//выход из цикла при нахождении 333
 if(massiv[i+2]!=666){ 
tft.drawLine(Xb+b*M*massiv[i],Yb+c*M*massiv[i+1] ,Xb+b*M*massiv[i+2] ,Yb+c*M*massiv[i+3] ,tft.color565(255,255,255)); 
//tft.drawLine(Xb+M*massiv[i],Yb+M*massiv[i+1] ,Xb+M*massiv[i+2] ,Yb+M*massiv[i+3] ,tft.color565(200,20,0));//цвет рисуемых символов   
}
else{i=i+2;}
}

я бы поменял цикл for на while

while (massiv[i+2]!=333) {

 if(massiv[i+2]!=666){ 
    tft.drawLine(Xb+b*M*massiv[i],Yb+c*M*massiv[i+1] ,Xb+b*M*massiv[i+2] ,Yb+c*M*massiv[i+3] ,tft.color565(255,255,255)); 
  }
i=i+2;
}

впрочем решать вам

Переделал.

Спойлер
//ПЕЧАТЬ БУКВ И СЛОВ виды почерка
#include <SPI.h>          
#include <TFT_eSPI.h>       // Hardware-specific library
TFT_eSPI tft = TFT_eSPI();  // Invoke custom library
#include "ris_fun_.h"//файл хранения массивов букв и функций их обработки

uint16_t color=tft.color565(0,0,0);
//uint16_t color=tft.color565(238,206,155);
String str="Вера Знание Расклад Ремесло Кофе";//
float m=0.25;//масштаб букв 

void setup(){
 tft.init();
 tft.setRotation(3);     // Переводим дисплей в альбомную ориентацию
 tft.fillScreen(color);
 
 //пример вывода слов
 ris_str(0,0,"До свиданья, друг мой, до свиданья.",m);//
 ris_str(0,35,"Милый мой, ты у меня в груди.",m);//
 ris_str(0,70,"Предназначенное расставанье",m);//
 ris_str(0,105,"Обещает встречу впереди.",m);//
 ris_str(0,140,"До свиданья, друг мой, без руки, без слова,",m);//
 ris_str(0,175,"Не грусти и не печаль бровей,-",m);//
 ris_str(0,210,"В этой жизни умирать не ново,",m);//
 ris_str(0,245,"Но и жить, конечно, не новей.",m);//
 ris_str(0,280,"                           С.А.Есенин 1925 ",m);//
 }
 
void loop()
{

}
////////////////////
//почерк биссером
//m=0.10;
//b=2.3;
//c=1.3;
//a=200;
//почерк столбиком
//m=0.10;
//b=2.3;
//c=4.0;
//a=200;
//почерк вытянутый
//m=0.10;
//b=2.3;
//c=2.0;
//a=250;
//почерк раздельный
//m=0.15;
//b=1.0;
//c=2.0;
//a=140;
Спойлер

const int buk_0[] = { // А
-32,80,-31,81,-29,84,-27,88,-22,89,-14,85,-6,79,2,71,10,60,17,46,22,32,28,22,36,12,43,7,44,6,47,7,47,14,46,22,
42,35,35,49,29,64,25,74,23,82,21,85,21,87,20,91,20,90,666,666,25,57,24,50,17,43,7,37,1,39,-3,41,-8,47,-10,55,-9,66,-6,
75,2,81,10,83,22,85,34,83,45,79,49,75,50,75,51,75,51,75,333
};
const int buk_1[] = { // Б
-33,80,-33,79,-32,81,-31,83,-28,85,-22,85,-14,82,-10,75,-3,67,1,60,9,46,12,37,17,27,21,20,23,16,24,14,24,13,24,
13,666,666,4,38,0,36,-4,31,-5,26,-4,21,-1,14,8,10,22,7,43,7,64,5,75,3,72,4,666,666,14,45,20,40,24,37,30,35,35,37,39,41,
43,47,45,54,46,60,44,65,42,73,38,77,34,83,30,88,25,90,20,91,15,91,11,88,7,86,7,86,8,83,15,80,23,78,31,78,40,76,44,78,43,77,44,78,333
};
const int buk_2[] = { // В
-34,78,-33,78,-32,80,-28,85,-23,83,-14,72,-1,51,25,2,26,0,666,666,-1,26,14,15,28,8,42,7,49,13,45,26,34,36,15,46,12,48,23,42,
31,41,38,46,42,56,38,68,31,77,20,86,9,91,-3,88,-7,79,-2,73,9,68,21,65,35,69,45,75,45,76,44,76,333  
};
const int buk_3[] = { // Г
-33,77,-31,80,-29,84,-23,88,-11,80,2,66,21,35,29,17,30,15,30,15,666,666,-7,38,-10,34,-9,27,-8,24,0,20,13,15,35,10,56,6,68,2,
69,1,70,1,666,666,8,87,8,86,11,84,21,81,31,78,44,74,45,74,45,74,333 
};
const int buk_4[] = { // Д
63,8,61,7,56,6,54,6,51,9,45,17,38,25,33,34,25,45,21,53,12,63,6,71,-3,77,-9,82,-15,86,-22,88,-27,87,-31,85,-32,78,
-30,74,-25,72,-17,71,-11,72,-1,77,6,82,17,84,24,85,35,83,43,78,50,69,53,60,53,50,53,39,44,29,29,18,16,15,3,16,-7,
21,-7,26,-7,39,8,48,333  
};
const int buk_5[] = { // Е
60,17,55,12,45,7,33,8,22,14,13,23,10,29,14,35,22,38,32,39,40,39,40,37,31,32,21,31,5,33,-11,39,-20,47,-25,56,-28,
67,-27,75,-24,85,-16,90,-4,94,11,92,23,88,38,82,43,79,43,79,43,79,44,79,666,666,-35,79,-33,78,-29,74,-30,75,-29,73,333  
};
const int buk_6[] = { // Ж
-2,15,-1,11,2,5,9,2,13,0,15,2,17,8,18,17,15,29,11,42,7,51,2,61,-2,73,-8,78,-11,82,-14,86,-17,88,-21,91,-22,90,-28,85,-31,80,
-33,75,666,666,70,5,73,1,60,1,53,7,45,17,36,31,31,41,26,50,22,56,20,66,20,72,19,75,19,80,19,83,21,86,23,87,27,84,35,83,43,80,48,
76,46,76,666,666,31,15,25,28,22,39,19,50,15,61,12,71,10,78,7,84,7,86,8,85,666,666,-8,67,-8,68,-5,64,6,56,31,42,47,31,46,32,44,33,333  
};
const int buk_7[] = { // З
13,10,20,6,26,4,36,4,41,6,43,11,43,15,38,22,30,29,20,35,13,36,12,36,19,33,28,31,37,33,42,37,47,43,51,49,52,54,51,
58,49,65,48,68,45,74,42,79,33,82,21,88,13,89,4,89,-6,90,-15,88,-25,84,-32,80,-36,79,-36,79,-36,79,333
};
const int buk_8[] = { // И
3,7,9,4,12,6,12,10,8,20,3,29,-3,38,-8,47,-11,55,-16,62,-18,68,-19,76,-18,80,-13,81,-6,80,1,78,10,70,17,63,25,51,33,37,42,26,48,
18,52,9,53,6,53,6,53,6,50,9,45,18,40,28,35,38,30,49,26,58,24,64,23,70,24,74,24,79,25,83,27,83,30,83,34,85,38,84,44,80,45,80,45,
79,46,78,666,666,-35,77,-31,76,-24,73,-18,67,-15,65,333    
};
const int buk_9[] = { // Й
3,7,9,4,12,6,12,10,8,20,3,29,-3,38,-8,47,-11,55,-16,62,-18,68,-19,76,-18,80,-13,81,-6,80,1,78,10,70,17,63,25,51,33,37,42,26,48,
18,52,9,53,6,53,6,53,6,50,9,45,18,40,28,35,38,30,49,26,58,24,64,23,70,24,74,24,79,25,83,27,83,30,83,34,85,38,84,44,80,45,80,45,
79,46,78,666,666,-35,77,-31,76,-24,73,-18,67,-15,65,666,666,22,-1,23,2,30,2,35,0,42,-7,333  
};
const int buk_10[] = { // К
-33,79,-32,82,-29,86,-22,85,-14,80,-4,62,4,43,13,23,19,11,24,4,26,3,666,666,8,48,17,33,31,20,45,10,58,5,62,5,62,10,
666,666,14,40,19,40,22,42,24,51,22,58,19,68,16,75,17,81,19,86,23,84,27,83,35,81,43,76,43,76,333 
};
const int buk_11[] = { // Л
-31,80,-31,81,-31,81,-30,82,-26,86,-21,86,-12,83,-8,78,-3,71,3,59,12,45,19,33,26,18,32,12,37,5,43,3,45,3,49,5,
51,7,52,13,51,18,49,26,46,33,43,39,41,47,36,56,33,65,30,71,28,77,26,81,27,83,28,84,31,86,35,85,41,80,48,76,47,75,333 
};
const int buk_12[] = { // М
-32,78,-33,79,-34,87,-29,91,-15,83,-3,65,11,42,28,13,30,6,27,10,24,17,19,28,9,48,4,65,1,76,0,82,2,83,11,77,30,
58,53,23,68,2,68,0,64,6,63,11,53,27,45,45,34,62,27,75,25,81,24,85,26,86,33,84,44,78,45,78,333 
};
const int buk_13[] = { // Н
-32,80,-34,82,-32,88,-29,91,-23,88,-15,75,-5,58,22,5,22,1,22,1,22,3,666,666,57,8,52,20,46,31,40,45,33,58,29,66,
26,77,22,86,24,87,29,83,41,78,47,75,46,74,666,666,-9,58,4,55,31,45,43,42,48,39,50,38,666,666,-1,18,8,11,21,0,21,1,333 
};
const int buk_14[] = { // О
30,4,24,7,18,10,8,19,1,26,-7,37,-15,54,-20,64,-20,73,-16,80,-8,84,8,81,19,76,27,68,35,58,44,45,52,31,54,19,54,10,
51,4,43,0,17,8,666,666,8,84,10,84,22,82,35,78,44,77,46,76,666,666,-35,78,-33,75,-25,70,-21,65,-21,63,333 
};
const int buk_15[] = { // П
-32,78,-35,81,-36,85,-33,88,-27,88,-15,76,-5,59,14,30,15,25,14,24,14,25,666,666,49,24,38,39,27,58,17,79,13,83,13,84,
13,84,13,84,13,84,14,87,22,87,35,83,45,80,50,79,46,79,666,666,0,37,-7,35,-10,32,-9,29,-3,25,6,21,24,17,48,12,69,6,78,1,76,3,333 
};
const int buk_16[] = { // Р
0,91,0,90,8,88,27,80,41,77,43,77,43,77,44,77,666,666,-36,80,-34,81,-30,85,-23,88,-10,76,-1,57,8,31,11,20,11,19,12,18,11,18,
666,666,-11,39,-6,28,2,15,9,8,21,5,33,4,44,9,53,16,55,25,53,38,49,46,41,53,28,58,10,62,4,59,6,58,333 
};
const int buk_17[] = { // С
55,29,58,24,60,17,58,11,51,5,44,4,34,6,21,7,14,12,4,20,-7,30,-16,41,-25,53,-29,63,-31,70,-30,79,-24,86,-14,91,3,87,20,83,
35,76,44,74,43,74,45,78,333 
};
const int buk_18[] = { // Т
-31,81,-34,82,-35,83,-31,91,-25,90,-13,83,-3,68,11,39,12,34,12,33,666,666,-13,53,-16,48,-17,45,-11,39,3,32,25,23,58,9,67,
4,68,4,66,4,666,666,51,29,43,42,33,58,25,73,22,79,21,85,22,85,26,82,45,78,666,666,21,51,6,84,1,96,1,96,333 
};
const int buk_19[] = { // У
-36,80,-37,79,-36,80,-34,81,-28,83,-19,84,-7,83,7,75,17,71,29,59,44,43,60,25,69,10,73,4,72,3,73,3,72,5,71,6,666,666,11,7,
12,8,8,14,2,22,-2,31,-3,41,0,47,10,50,25,50,36,47,37,46,38,47,37,47,37,47,37,47,666,666,15,86,13,88,13,86,13,86,15,87,21,85,30,80,42,78,49,78,48,77,48,77,48,77,333 
};
const int buk_20[] = { // Ф
 51,5,40,7,27,14,14,20,-1,33,-11,42,-17,49,-22,59,-22,66,-11,66,8,60,24,54,44,43,58,31,66,20,71,9,65,5,54,5,666,666,-34,80,-30,83,
 -23,88,-14,90,-5,83,4,69,14,49,27,20,36,2,38,1,666,666,11,91,11,91,16,88,31,80,43,79,46,77,46,78,45,78,333
};
const int buk_21[] = { // Х
2,7,3,7,6,5,12,3,20,1,25,3,27,12,27,26,22,38,17,52,8,64,-3,76,-9,83,-13,85,-17,84,-20,82,-24,82,-28,78,-32,78,-32,78,-33,78,666,666,69,8,
63,6,56,7,48,11,38,19,29,29,21,41,15,53,10,64,9,75,11,86,17,91,26,86,37,82,43,78,46,76,48,73,49,74,333 
};
const int buk_22[] = { // Ц
12,5,20,3,21,14,16,24,5,39,-8,55,-15,68,-19,79,-16,86,-9,88,4,82,24,56,40,37,53,22,58,14,56,15,53,20,50,26,43,39,40,54,35,68,35,75,36,82,
36,88,33,95,30,100,25,106,20,107,16,108,15,106,17,100,21,95,31,87,40,81,44,79,46,80,45,79,46,79,666,666,-37,80,-37,79,-37,78,-37,78,-33,76,-28,72,-22,67,-18,65,-17,65,333 
};
const int buk_23[] = { // Ч
9,2,8,3,2,11,-5,27,-13,43,-14,57,-6,66,5,69,22,64,47,41,58,23,66,11,66,10,66,11,65,12,63,15,58,22,49,33,42,44,33,54,29,63,23,70,19,76,16,82,14,89,17,
90,21,89,27,89,36,83,44,78,47,74,48,74,47,75,47,74,666,666,-33,74,-30,71,-24,64,-15,53,-12,48,333 
};
const int buk_24[] = { // Ш
-2,11,-2,10,-2,8,2,2,13,8,8,22,-1,35,-11,52,-21,67,-24,80,-20,82,-11,79,0,68,14,49,27,29,37,13,41,7,41,6,40,9,33,18,23,34,15,50,7,66,4,75,6,80,13,
79,23,71,34,62,48,44,58,24,65,13,65,12,64,13,57,20,52,31,42,45,36,54,32,64,30,68,28,75,28,80,30,82,33,88,38,87,44,81,48,78,48,77,49,78,48,77,333 
};
const int buk_25[] = { // Щ
-2,11,-2,10,-2,8,2,2,13,8,8,22,-1,35,-11,52,-21,67,-24,80,-20,82,-11,79,0,68,14,49,27,29,37,13,41,7,41,6,40,9,33,18,23,34,15,50,7,66,4,75,6,80,13,
79,23,71,34,62,48,44,58,24,65,13,65,12,64,13,57,20,52,31,42,45,36,54,32,64,30,68,28,75,28,80,30,82,33,88,38,87,44,81,48,78,48,77,49,78,48,77,
666,666,31,80,31,82,32,89,33,94,33,97,31,104,29,108,24,110,18,112,14,110,12,109,12,105,14,99,16,98,20,96,29,91,33,89,33,90,33,89,333 
};
const int buk_26[] = { // Ъ
 
};
const int buk_27[] = { // Ы
9,10,3,24,-6,40,-16,59,-22,72,-21,79,-13,81,0,73,14,58,23,42,20,35,6,38,-8,51,666,666,-31,74,-32,73,-31,74,-32,73,-34,75,-34,77,-30,72,-22,64,-13,57,
-11,53,666,666,47,17,41,29,31,45,26,56,21,68,18,76,16,82,16,89,17,89,23,86,33,78,45,74,45,74,333 
};
const int buk_28[] = { // Ь
 
};
const int buk_29[] = { // Э
8,19,16,10,28,4,43,2,52,5,54,19,53,37,44,55,35,66,23,75,13,80,-2,84,-16,89,-25,86,-30,82,-31,77,-31,77,666,666,-1,90,0,90,5,88,10,85,21,83,31,79,
44,76,49,75,49,75,666,666,2,57,13,52,27,48,42,44,50,42,333 
};
const int buk_30[] = { // Ю
-34,78,-34,79,-33,86,-28,90,-18,80,21,4,21,4,23,4,666,666,49,5,47,6,40,11,30,20,21,32,11,48,4,67,1,76,4,83,8,85,21,75,35,64,48,40,55,23,58,11,
56,3,52,3,666,666,9,87,11,86,21,82,37,75,44,76,46,76,666,666,-10,68,-10,68,-5,63,10,54,19,49,19,50,666,666,-7,30,1,21,13,11,20,3,20,4,333 
};
const int buk_31[] = { // Я
-31,78,-30,76,-28,83,-20,86,-14,83,-7,81,3,73,13,64,21,54,27,44,33,35,37,21,40,14,40,5,35,2,32,2,22,6,11,17,0,26,-8,37,-10,45,-6,49,10,50,25,47,40,39,
52,27,60,16,64,10,62,7,62,7,56,13,50,22,41,33,33,45,26,59,22,70,21,80,21,86,22,88,25,89,32,88,38,84,45,80,49,78,49,79,49,78,333 
};
/////////////////////////////////////////
const int buk_32[] = { // а
46,79,43,80,40,84,37,86,36,86,34,86,32,84,31,81,32,76,36,69,43,58,46,49,46,48,47,49,46,49,47,49,666,666,42,
54,41,52,38,51,34,49,29,50,24,54,19,58,13,63,9,69,5,74,3,81,1,88,3,89,9,89,19,82,27,79,29,78,29,78,333 
};
const int buk_33[] = { // б
33,52,25,55,20,61,14,68,10,77,12,82,18,83,26,80,37,71,41,59,37,53,24,56,666,666,38,72,44,63,48,54,
45,47,40,41,34,39,31,37,29,33,31,28,43,15,666,666,53,8,58,4,666,666,25,83,34,80,44,76,46,75,333 
};
const int buk_34[] = { // в
9,77,12,75,19,71,26,65,35,56,43,45,52,34,56,24,59,15,59,12,58,6,56,4,51,6,44,17,32,36,24,51,
18,67,13,78,10,85,12,88,18,89,29,81,40,71,46,62,47,57,42,50,32,48,25,61,666,666,20,90,25,86,44,75,333 
};
const int buk_35[] = { // г
9,74,10,70,17,59,25,51,33,47,37,48,37,54,31,66,25,76,20,85,17,92,16,96,16,96,18,96,27,89,36,83,45,77,45,76,47,77,333 
};
const int buk_36[] = { // д
30,51,19,59,14,65,10,79,15,83,26,80,38,72,47,63,46,51,35,50,25,59,666,666,31,96,25,109,21,120,17,128,
-9,131,-15,128,-13,125,-7,118,7,109,25,97,40,85,46,78,47,77,47,78,333 
};
const int buk_37[] = { // е
9,77,12,77,22,71,42,59,49,50,45,48,43,47,36,50,27,62,21,73,17,84,14,93,15,94,23,87,38,78,46,74,46,75,333 
};
const int buk_38[] = { // ж
22,45,22,50,24,64,27,78,31,84,32,86,32,87,33,85,666,666,2,91,1,90,2,89,9,82,21,70,35,59,45,50,50,48,50,48,50,47,50,47,666,666,34,47,
34,47,31,50,25,64,21,75,16,90,15,93,15,92,16,92,666,666,3,81,2,80,2,81,3,89,4,91,4,90,666,666,45,79,44,80,39,84,35,89,33,89,36,88,333 
};
const int buk_39[] = { // з
6,78,10,73,19,60,28,49,35,49,35,54,31,63,21,71,21,72,26,63,35,65,37,67,37,72,33,82,24,102,15,113,7,120,-4,126,-12,131,
-15,132,-16,129,-10,118,2,106,18,95,40,77,47,75,46,75,47,74,333
};
const int buk_40[] = { // и
23,49,24,50,23,49,23,49,22,50,20,56,15,63,12,73,8,81,6,89,8,92,16,85,27,72,35,58,38,49,41,45,39,48,34,56,29,66,25,
76,24,86,23,90,24,90,31,88,41,79,45,77,45,77,45,77,333  
};
const int buk_41[] = { // й
23,49,24,50,23,49,23,49,22,50,20,56,15,63,12,73,8,81,6,89,8,92,16,85,27,72,35,58,38,49,41,45,39,48,34,56,29,66,25,
76,24,86,23,90,24,90,31,88,41,79,45,77,45,77,45,77,666,666,22,35,26,40,35,32,41,24,333 
};
const int buk_42[] = { // к
8,73,8,73,9,73,16,64,28,48,34,41,32,42,32,43,28,48,19,72,10,91,8,94,9,92,10,91,10,92,666,666,19,83,
28,64,47,47,58,37,57,39,666,666,28,66,31,74,30,82,28,93,35,86,45,75,45,74,333 
};
const int buk_43[] = { // л
10,77,9,78,7,83,9,86,12,84,23,74,35,59,42,46,43,45,45,43,43,47,37,56,28,74,26,80,25,85,26,85,33,83,42,79,49,73,50,71,49,73,333 
};
const int buk_44[] = { // м
8,79,8,81,7,85,8,89,14,82,25,61,32,48,33,47,33,47,33,46,29,56,22,70,21,81,21,87,21,87,25,84,36,66,46,51,49,47,48,48,47,50,
41,63,33,79,30,88,31,90,32,89,42,80,44,77,45,77,45,77,333
};
const int buk_45[] = { // н
10,76,10,75,15,68,20,64,24,59,26,54,26,53,26,52,25,52,23,54,19,64,14,73,9,81,5,89,3,91,6,91,4,90,6,86,10,80,14,78,20,76,26,
74,29,75,30,74,35,69,40,62,46,54,49,51,48,50,47,48,45,50,38,60,31,72,25,82,23,86,24,88,25,88,32,84,43,79,47,75,47,75,45,76,333 
};
const int buk_46[] = { // о
34,52,23,58,17,64,13,73,10,79,10,82,11,87,15,90,20,88,28,84,34,80,43,74,47,65,47,59,45,56,38,52,32,52,666,666,25,87,34,82,
44,79,48,78,48,78,49,78,48,78,666,666,11,74,16,67,19,64,333 
};
const int buk_47[] = { // п
2,94,2,92,6,86,13,68,22,49,27,39,26,39,27,40,27,41,666,666,18,65,20,59,27,54,35,50,42,47,42,47,45,50,42,58,35,70,28,
81,25,86,24,89,25,90,27,90,34,86,43,78,44,77,44,76,45,76,44,75,333 
};
const int buk_48[] = { // р
4,84,3,83,9,78,21,56,29,44,31,39,30,41,25,54,18,74,9,99,-2,124,-5,130,-4,128,666,666,24,63,29,57,41,50,49,49,53,52,53,60,47,73,37,83,21,86,11,88,11,86,333 
};
const int buk_49[] = { // с
35,46,24,49,18,55,12,62,6,74,4,85,9,89,18,91,25,88,39,81,45,77,46,77,46,76,333 
};
const int buk_50[] = { // т
19,49,18,50,16,57,12,68,7,79,1,88,0,92,0,93,1,92,666,666,17,66,27,55,31,49,31,49,32,50,29,60,25,70,21,77,18,84,17,85,20,81,24,69,29,62,34,58,36,
56,37,59,35,68,29,78,28,84,27,84,30,85,37,79,44,76,43,75,44,75,666,666,20,42,20,41,35,40,45,38,45,37,45,38,46,38,333 
};
const int buk_51[] = { // у
10,74,18,60,22,53,23,50,22,50,21,54,17,69,15,77,18,79,27,73,35,66,43,54,45,50,44,51,38,65,32,79,28,94,25,106,20,
118,14,124,6,129,-4,130,-11,126,-10,122,-7,115,2,107,12,99,28,86,45,79,52,73,52,73,52,73,333
};
const int buk_52[] = { // ф
44,49,42,50,37,49,33,50,27,54,21,58,18,62,14,65,10,70,8,72,6,76,5,82,5,83,6,86,10,87,19,86,24,85,31,82,37,78,43,75,49,69,53,
61,54,54,53,49,42,47,27,57,666,666,41,42,37,49,32,58,25,77,16,97,8,116,4,126,4,126,4,124,333 
};
const int buk_53[] = { // х
27,44,28,45,27,45,28,48,30,56,30,64,30,74,32,81,32,87,33,88,33,88,33,88,33,88,666,666,9,87,8,86,8,86,8,89,8,87,8,88,8,88,8,87,10,87,17,80,
27,70,40,60,49,54,53,50,53,50,53,49,53,50,666,666,33,89,33,89,35,89,39,85,45,80,46,79,47,79,47,78,666,666,6,81,6,81,6,82,8,87,9,88,9,86,333 
};
const int buk_54[] = { // ц
18,48,18,51,14,60,9,76,7,85,8,89,12,91,20,87,30,80,41,65,49,52,49,48,49,48,48,47,46,57,43,62,38,71,35,76,33,86,31,93,31,94,31,93,31,94,31,94,
31,92,31,94,32,94,31,94,32,94,31,94,31,94,32,94,33,94,34,96,35,102,34,103,32,105,24,107,20,105,17,104,18,102,18,102,20,100,26,95,35,88,43,81,46,80,46,79,333
};
const int buk_55[] = { // ч
22,47,20,51,15,59,13,67,16,77,24,75,33,71,44,60,49,50,50,47,50,48,49,49,44,57,37,69,29,78,27,83,25,93,26,93,29,94,38,85,46,75,47,74,48,76,333
};
const int buk_56[] = { // ш
22,47,22,47,20,49,17,54,13,63,7,76,4,86,5,86,13,82,22,72,31,59,33,56,33,52,33,52,33,52,34,53,30,59,25,70,23,75,21,83,22,85,27,86,30,80,37,68,46,
56,47,49,47,49,47,49,46,49,45,49,47,50,45,49,43,53,39,63,35,71,33,76,32,81,31,82,31,83,32,85,32,85,34,87,36,86,40,82,43,78,44,77,44,77,44,77,44,77,
666,666,3,101,3,101,5,100,11,98,21,96,30,96,33,94,33,95,33,95,32,95,333
};
const int buk_57[] = { // щ
22,46,21,47,21,52,18,58,16,68,12,78,13,80,15,81,18,81,25,71,33,59,38,48,41,47,41,47,40,47,37,51,34,58,31,67,29,76,30,81,32,81,35,83,41,75,
47,64,53,54,55,50,54,50,53,52,49,59,45,73,40,83,36,89,34,96,36,99,34,107,32,108,26,108,21,105,20,102,20,103,21,100,28,93,41,82,51,71,51,72,52,72,333
};
const int buk_58[] = { // ъ
4,79,10,77,18,67,25,55,33,46,33,44,33,44,30,47,27,53,22,65,16,76,10,88,10,93,16,94,27,91,36,84,42,79,42,74,42,72,33,71,21,73,18,78,
666,666,17,52,17,52,16,50,17,48,19,48,22,48,25,51,29,50,35,45,36,44,666,666,11,56,12,57,16,52,17,52,19,50,21,50,333
};
const int buk_59[] = { // ы
49,45,49,47,45,51,40,63,35,72,30,81,28,90,28,92,39,84,47,74,46,75,47,75,666,666,25,47,24,46,23,45,22,47,21,48,17,58,11,67,7,76,3,85,4,90,5,91,
14,89,20,84,22,79,22,74,21,71,20,70,11,72,333
};
const int buk_60[] = { // ь
4,79,10,77,18,67,25,55,33,46,33,44,33,44,30,47,27,53,22,65,16,76,10,88,10,93,16,94,27,91,36,84,42,79,42,74,42,72,33,71,21,73,18,78,333
};
const int buk_61[] = { // э
23,51,35,44,45,43,50,49,49,58,43,71,36,82,29,84,23,89,15,90,9,87,6,82,10,75,11,76,666,666,18,71,21,70,35,66,45,64,44,64,45,64,333
};
const int buk_62[] = { // ю
10,76,10,77,13,74,19,66,26,57,26,55,25,53,26,51,27,51,27,52,25,51,26,51,27,51,26,51,25,51,26,51,25,51,21,62,15,75,9,92,7,96,11,87,12,81,14,81,
17,80,25,69,29,65,29,66,29,65,29,65,35,58,28,66,22,77,23,90,32,87,44,74,51,61,49,53,39,55,30,64,333
};
const int buk_63[] = { // я
9,80,8,81,8,86,12,91,17,90,24,82,35,71,43,59,43,49,40,48,32,47,25,51,20,56,16,64,18,67,22,69,33,63,45,57,51,48,50,46,48,47,43,
52,35,65,30,75,27,83,26,89,27,90,30,91,35,85,42,79,46,74,47,73,47,74,48,74,333
};
const int buk_64[] = { // !
29,77,29,76,27,76,27,76,25,76,25,79,29,78,30,75,29,73,26,72,23,75,25,76,31,74,31,74,27,74,24,75,25,79,30,77,31,76,28,76,26,78,
31,78,34,73,30,74,27,77,28,75,666,666,44,26,36,37,33,49,33,55,32,58,40,51,45,40,48,23,52,18,47,21,38,36,36,48,37,51,44,45,49,
27,52,18,52,17,44,34,38,47,40,47,49,30,51,19,48,23,43,37,40,44,45,38,49,22,48,17,38,37,333  
};
const int buk_65[] = { // 
  
};
const int buk_66[] = { // 
  
};
const int buk_67[] = { // 
  
};
const int buk_68[] = { // 
  
};
const int buk_69[] = { // 
  
};
const int buk_70[] = { // 
  
};
const int buk_71[] = { // (
35,38,35,39,35,39,35,40,33,40,30,44,26,50,24,51,22,57,19,65,16,72,14,77,13,81,12,84,13,89,12,93,13,96,14,97,14,97,13,96,
13,93,13,84,16,78,18,70,21,62,23,57,27,49,32,43,33,41,35,40,36,40,32,41,27,47,20,57,17,64,15,73,14,79,14,83,13,91,13,94,15,
98,14,99,16,98,14,91,15,82,16,76,17,70,19,63,23,56,26,49,30,45,32,41,34,39,35,40,35,39,30,43,24,53,20,63,17,70,16,77,17,80,17,85,15,91,14,92,14,92,333  
};
const int buk_72[] = { // )
48,36,48,36,49,38,48,44,48,47,48,54,47,63,46,67,44,76,43,80,40,88,35,92,32,96,31,99,28,100,25,106,24,107,24,108,26,108,28,103,
32,98,37,91,43,85,47,76,49,69,50,62,50,56,50,49,50,45,48,42,48,38,49,37,49,35,48,34,49,35,49,38,50,45,333  
};
const int buk_73[] = { // *
24,63,25,67,29,77,31,79,666,666,20,81,26,72,33,63,666,666,29,63,29,78,29,79,666,666,21,72,30,74,37,72,42,70,333  
};
const int buk_74[] = { // +
37,54,36,55,31,61,26,75,22,84,21,84,21,88,666,666,15,74,17,73,28,71,37,72,42,71,42,72,333  
};
const int buk_75[] = { // ,
22,82,21,82,22,83,21,84,21,86,21,85,23,86,26,83,25,81,22,81,21,84,21,86,22,85,24,81,22,84,21,83,25,82,24,81,24,84,24,89,23,93,22,94,21,97,20,99,19,
100,19,99,19,100,19,100,19,99,21,98,24,94,24,91,25,89,23,89,24,90,24,89,25,93,22,96,21,98,21,98,21,99,21,98,21,98,22,97,24,92,24,91,25,89,24,90,25,89,23,91,23,97,21,99,21,99,20,99,333
};
const int buk_76[] = { // -
16,71,16,71,16,71,16,71,16,71,21,70,31,71,40,71,45,72,45,71,45,71,44,71,45,70,45,70,45,71,44,71,333  
};
const int buk_77[] = { // .
24,82,24,83,23,83,22,83,22,85,23,86,25,86,29,81,27,80,23,79,21,83,22,86,24,86,26,83,23,80,21,80,21,82,25,83,27,80,26,78,22,78,20,83,23,85,25,83,23,81,21,
81,20,84,22,85,25,82,24,80,23,83,25,83,25,82,23,81,23,85,24,84,25,86,23,85,22,88,23,87,24,87,23,84,333  
};
const int buk_78[] = { // 
  
};
const int buk_79[] = { // 0
34,46,34,45,32,44,32,45,28,49,23,56,19,67,15,79,17,84,21,85,30,79,42,69,49,56,49,46,44,43,30,48,21,63,333  
};
const int buk_80[] = { // 1
21,57,21,57,21,58,21,58,24,55,33,45,42,37,44,32,44,32,43,37,37,50,31,68,26,76,26,78,25,79,666,666,11,89,16,86,25,83,33,84,35,85,35,85,333  
};
const int buk_81[] = { // 2
25,46,26,43,27,38,34,34,41,34,46,38,42,47,36,57,26,65,18,73,11,80,5,86,5,87,7,83,14,77,19,76,24,81,29,83,33,82,36,79,38,79,333  
};
const int buk_82[] = { // 3
23,51,25,49,27,44,30,41,36,39,43,37,45,40,44,44,39,53,33,58,30,61,29,61,29,60,34,58,40,59,43,65,40,72,36,79,34,82,31,82,23,86,18,84,15,80,15,78,333  
};
const int buk_83[] = { // 4
37,36,32,45,24,60,19,74,22,72,32,68,40,68,666,666,44,59,34,81,28,97,27,98,29,97,333  
};
const int buk_84[] = { // 5
24,40,37,37,49,33,51,34,666,666,24,51,21,58,22,57,28,50,36,54,41,65,40,73,30,80,17,83,11,82,10,80,333  
};
const int buk_85[] = { // 6
52,40,47,40,41,43,33,49,25,58,21,64,18,71,14,79,16,83,19,87,29,83,37,81,43,72,44,63,34,60,25,66,333  
};
const int buk_86[] = { // 7
25,50,25,49,25,50,25,44,29,42,34,41,41,43,47,44,54,38,58,37,57,37,53,42,44,57,35,70,26,82,20,94,15,98,17,98,666,666,20,72,17,74,17,74,25,71,45,64,48,64,333  
};
const int buk_87[] = { // 8
28,42,33,36,41,34,47,34,47,43,41,55,34,61,26,67,21,73,15,79,15,84,21,88,27,86,35,82,39,73,37,61,27,50,27,42,333  
};
const int buk_88[] = { // 9
35,36,30,40,25,46,23,54,24,62,29,66,40,64,46,56,49,42,44,37,38,40,37,42,666,666,50,48,46,58,43,64,38,72,33,77,25,81,18,85,11,81,11,78,333  
};
const int buk_89[] = { // 
  
};
const int buk_90[] = { // 
  
};
const int buk_91[] = { // 
  
};
const int buk_92[] = { // =
19,69,16,68,17,68,23,67,36,66,42,65,666,666,11,85,18,86,29,83,35,83,37,84,333  
};
const int buk_93[] = { // 
  
};
const int buk_94[] = { // ?
34,29,34,29,34,27,33,24,34,20,37,17,43,16,49,17,51,20,52,25,52,31,49,38,47,43,43,48,41,50,37,51,31,55,27,59,24,64,24,67,23,67,
24,67,24,67,666,666,28,80,25,82,24,86,27,84,29,82,27,81,21,82,21,84,25,84,28,82,26,82,25,82,25,81,666,666,35,26,36,21,40,17,43,
18,47,18,51,21,51,26,49,32,46,39,42,46,37,49,32,53,28,57,25,62,23,64,24,67,25,69,25,68,24,67,333  
};

/////////////////////////
const struct {//структура массивов букв алфавита
    const int *bitmap;
 }
  bukvi[]={buk_0,buk_1,buk_2,buk_3,buk_4,buk_5,buk_6,buk_7,buk_8,buk_9,buk_10,buk_11,buk_12,buk_13,buk_14,buk_15,buk_16,buk_17,buk_18,buk_19,
  buk_20,buk_21,buk_22,buk_23,buk_24,buk_25,buk_26,buk_27,buk_28,buk_29,buk_30,buk_31,buk_32,buk_33,buk_34,buk_35,buk_36,buk_37,buk_38,buk_39,
  buk_40,buk_41,buk_42,buk_43,buk_44,buk_45,buk_46,buk_47,buk_48,buk_49,buk_50,buk_51,buk_52,buk_53,buk_54,buk_55,buk_56,buk_57,buk_58,buk_59,
  buk_60,buk_61,buk_62,buk_63,buk_64,buk_65,buk_66,buk_67,buk_68,buk_69,buk_70,buk_71,buk_72,buk_73,buk_74,buk_75,buk_76,buk_77,buk_78,buk_79,
  buk_80,buk_81,buk_82,buk_83,buk_84,buk_85,buk_86,buk_87,buk_88,buk_89,buk_90,buk_91,buk_92,buk_93,buk_94,};  
 /////////////////////////
//функция рисования буквы из массива данных
void ris_bukvu(int Xb,int Yb,const int *massiv,float M){
  float b=1.0;//коэф. сжатия-растяжения по осям
  float c=1.0;//
  int i=0;
while (massiv[i+2]!=333) {
  if(massiv[i+2]!=666){ 
tft.drawLine(Xb+b*M*massiv[i],Yb+c*M*massiv[i+1] ,Xb+b*M*massiv[i+2] ,Yb+c*M*massiv[i+3] ,tft.color565(255,255,255)); 
//tft.drawLine(Xb+M*massiv[i],Yb+M*massiv[i+1] ,Xb+M*massiv[i+2] ,Yb+M*massiv[i+3] ,tft.color565(200,20,0));//цвет рисуемых символов   
}
else{i=i+2;}
i=i+2;
}
}
///////////////////
// Функция рисования букв строки 
void ris_str(int x,int y,String source,float Ms)
{
  int a=80;//базовый размер в пикселях шаблона в сканере букв
  int ii,k;
 // String target;
  unsigned char n;
  char m[2] = { '0', '\0' };

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

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

    if (n >= 0xC0) {
      switch (n) {
        case 0xD0: {
          n = source[ii]; ii++;
          if (n == 0x81) { n = 0xA8; break; }
          if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
          break;
        }
        case 0xD1: {
          n = source[ii]; ii++;
          if (n == 0x91) { n = 0xB8; break; }
          if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
          break;
        }
      }
    }
    m[0] = n;
    //
   if(n>=192&&n<=255){//условия сопоставления кодов символов и массивов символов для русских букв
   if(n<224){x=x+a*Ms;}else{x=x+a*Ms/2;}   
   ris_bukvu(x,y,bukvi[n-192].bitmap,Ms);
   } 
    if(n==32){x=x+a*Ms/2;}//для пробела
    if(n>32&&n<64){//для цифр и знаков препинания
      x=x+a*Ms/2;
    ris_bukvu(x,y,bukvi[n+31].bitmap,Ms);   
      }
    //
  }

}
//////////////////////













Сканер букв тоже подделал.

Спойлер
//СКАНЕР БУКВ
#include <SPI.h>          
#include <TFT_eSPI.h>       // Hardware-specific library
TFT_eSPI tft = TFT_eSPI();  // Invoke custom library
#include "ris_.h"//файл хранения массивов букв

uint16_t color=tft.color565(0,0,0);
int xx=0;int yy=21;//
byte flag=0;//
long Y=0;//

int xr=200,yr=150;//переменные регулирующие внешний вид шаблона под буквы
int a=80;// 
float k1=0.5;float k2=1.1; float k3=0.15;//

void setup(){
  Serial.begin(9600);
  tft.init();
  tft.setRotation(3);               // Переводим дисплей в альбомную ориентацию
 tft.fillScreen(color);panel();//начальная отрисовка зон экрана
 
 //пример вывода буквы, после просмотра нажмите кнопку очистки
   
  for(int q=0;q<15;q++){ 
   ris_bukvu(50+q*28,50,buk_A,0.35);
  }
  ris_bukvu(xr,yr,buk_A,1.00);
  //
 }
 
void loop()
{
  if(millis()-Y>150&&flag!=3){flag=1;}// условие прерывающие рисование серии отрезков после паузы в 0,15 секунды (не касаемся стилусом экрана)
  uint16_t x, y;                         // Переменные для работы с координатами нажатий
 
  if (tft.getTouch(&x, &y)) {
    Y=millis();//
   if((x!=-1) && (y!=-1))          // Если обе координаты в положительном диапазоне (т.е. если есть нажатие) 
    {
      x += 0 ;                      // Корректируем координату с учетом калибровочных данных
      y += 5;                       // Корректируем координату с учетом калибровочных данных
      x=480-x*0.97;
      y=y*1.00;
   // 
     // 
       
      if(y<20&&x>320&&x<480){  tft.fillRect(0,20,480,320,tft.color565(0,0,0) );xx=0,yy=21;flag=0;panel();Serial.print(333);Serial.print(',');Serial.println('\0');delay(200);}//стираем рисунок
       if(x>=xr+k1*a-a&&y>=yr&&x<xr+a&&y<yr+1.5*k2*a){
      if(y>20&&flag==2){tft.drawLine(x, y, xx, yy,tft.color565(255,255,255));Serial.print(x-xr);Serial.print(',');Serial.print(y-yr);Serial.print(','); xx=x;yy=y;}//рисуем отрезок выбранным цветом
      if(y>20&&flag==1){flag=2;xx=x;yy=y;Serial.print(666);Serial.print(',');Serial.print(666);Serial.print(',');}//начало рисования новой серии отрезков
        }
      
     //   
 
   //   
      }
  }
   delay(20);//
  
}
////////////////////
void panel(){

 tft.fillRect(320,0,160,20,tft.color565(255,0,0));//кнопка очистки экрана
 //рамка-шаблон под буквы
 uint16_t color_1=tft.color565(127,127,127);
 tft.drawLine(xr, yr, xr+a, yr,color_1);
 tft.drawLine(xr+a, yr, xr+k1*a, yr+k2*a,color_1);
 tft.drawLine(xr+k1*a, yr+k2*a, xr+k1*a-a, yr+k2*a,color_1);
 tft.drawLine(xr+k1*a-a, yr+k2*a,xr, yr,color_1);
  
 tft.drawLine(xr+k1*a/2, yr+k2*a/2, xr+k1*a/2+a/2,yr+k2*a/2 ,color_1);
 tft.drawLine(xr+1.5*k1*a-a, yr+1.5*k2*a,xr+k1*a/2, yr+k2*a/2,color_1);
 tft.drawLine(xr+1.5*k1*a-a, yr+1.5*k2*a,xr+1.5*k1*a-a/2, yr+1.5*k2*a,color_1);
 tft.drawLine(xr+k1*a/2+a/2,yr+k2*a/2,xr+1.5*k1*a-a/2, yr+1.5*k2*a,color_1);

 tft.drawLine(xr+(k1+k3)*a, yr+(k2-k3)*a, xr+k1*a-a, yr+(k2-k3)*a,tft.color565(0,200,0));
tft.fillCircle(xr, yr,2,tft.color565(0,200,0));
 
}
///////////////////
void ris_bukvu(int Xb,int Yb,const int *massiv, float M){
 int i=0; 
while (massiv[i+2]!=333) {
  if(massiv[i+2]!=666){ 
tft.drawLine(Xb+M*massiv[i],Yb+M*massiv[i+1] ,Xb+M*massiv[i+2] ,Yb+M*massiv[i+3] ,tft.color565(255,255,255));    
}
else{i=i+2;}
i=i+2;
}
}
///////////////////
Спойлер
const int buk_A[] = { //
-32,80,-31,81,-29,84,-27,88,-22,89,-14,85,-6,79,2,71,10,60,17,46,22,32,28,22,36,12,43,7,44,6,47,7,47,14,46,22,
42,35,35,49,29,64,25,74,23,82,21,85,21,87,20,91,20,90,666,666,25,57,24,50,17,43,7,37,1,39,-3,41,-8,47,-10,55,-9,66,-6,
75,2,81,10,83,22,85,34,83,45,79,49,75,50,75,51,75,51,75,333
};

Если шаблон немного загрубить, сдвинуть все координаты на -3, например, то можно 333 заменить на 126, 666 на 127, а int16_t на int8_t.

А на сэкономленное купить водки!

Не,.. надо сдвинуть к желтому светилу, а это не - 3 :slight_smile: Как бы гармония рушится, но экономия в 2 раза!

Ну, может 126px и не достигают координаты? Тогда двигать не нужно и гармонь останется нетронутой.

Я просто общую мысль по эффективному использованию байта изложил.


По идее, если начало поместить в голубую точку (что вполне было логично с самого начала, но не сообразил), то должно вмещаться от -128 до 127. Опять же, можно рисовать окно-шаблон большим, а значения при выводе в монитор порта уменьшать до приемлемых… Но это уже переделка считай заново :slight_smile: Не в плане программирования, а в плане пользования.

А не логичнее в данном случае пользоваться неортогональными координатами?
Заодно появляется наклон как свободный параметр.

Аффинные координаты? Как то они мне нигде в жизни не попадались :slight_smile:
Исходные x и y всё равно в декартовых даны.


Вектора позволяют баловаться.

1 лайк

Красотища! :slight_smile: