Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Разное > Курилка

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.05.2018, 21:26   #1
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию Графический дисплей и Atmega328. Технические аспекты рисования.

Учусь рисовать на lcd5110. Кружочки (кривые), квадратики это все рисую с помощью adafruitGFX.
А вот как нарисовать допустим линию, вращающуюся относительно точки на угол заданный извне?
Например имитация аналогового спидометра?
Tohin вне форума   Ответить с цитированием
Старый 23.05.2018, 23:07   #2
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Нужно рисовать линию , потом стирать ее и рисовать новую линию уже развернутую под углом
Admin вне форума   Ответить с цитированием
Старый 24.05.2018, 07:07   #3
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию

Это я примерно понимаю. Но при перерисовке одного объекта страдают и соседние области. То есть надо перерисовывать все содержимое дисплея?
С расчетом точек начала и конца линии у меня тоже проблема. До 90 градусов тригонометрия помогает. А вот с 90 уже не очень - это отдельно проверять надо?
А как решаются сложные алгоритмы? Ну например вращающийся квадрат?
У меня с практическим применением математики туговато.. Нет ли сайтика с примерами таких алгоритмов?
Tohin вне форума   Ответить с цитированием
Старый 24.05.2018, 08:41   #4
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Цитата:
Это я примерно понимаю. Но при перерисовке одного объекта страдают и соседние области. То есть надо перерисовывать все содержимое дисплея?
Есть несколько методов, один из них - Фон спрайта должен быть прозрачным. Для этого цвет фона выбирают такой, которого нет на самом спрайте(обычно=0), иначе неизбежны "дырки" в изображении. При выводе проверяем наличие прозрачного фона, если есть – не выводим. На каждом шаге необходимо восстановить фон. Его нужно предварительно сохранять, размер сохраняемого фона должен быть равен размеру спрайта

Цитата:
С расчетом точек начала и конца линии у меня тоже проблема. До 90 градусов тригонометрия помогает. А вот с 90 уже не очень - это отдельно проверять надо?
Линии рассчитывают по алгоритму Брезенхэма
Еще понадобится создать фунцию setPixel, которая будет рисовать точку
PHP код:
void drawLine(int x1int y1int x2int y2
{
    const 
int deltaX abs(x2 x1);
    const 
int deltaY abs(y2 y1);
    const 
int signX x1 x2 : -1;
    const 
int signY y1 y2 : -1;
    
//
    
int error deltaX deltaY;
    
//
    
setPixel(x2y2);
    while(
x1 != x2 || y1 != y2
   {
        
setPixel(x1y1);
        const 
int error2 error 2;
        
//
        
if(error2 > -deltaY
        {
            
error -= deltaY;
            
x1 += signX;
        }
       
            
error += deltaX;
            
y1 += signY;
        }
    }



Цитата:
У меня с практическим применением математики туговато.. Нет ли сайтика с примерами таких алгоритмов?
Я думаю что проще подсмотреть или использовать библиотеку GLCD или GFX
В этих либах есть все функции рисования
Admin вне форума   Ответить с цитированием
Старый 25.05.2018, 22:05   #5
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию

Так я и использую AdafruitGFX, с рисованием линии проблемы нет. Что там с фоном спрайта предположить затрудняюсь, ИМХО там тупо ставится курсор в первую непустую позицию и выставляются биты по-порядку дальше. И-за этого пропадает часть изображения попавшая в поле работы.
Можно конечно придумать хитрые алгоритмы, но мне сейчас проще перерисовывать весь экран.
Возвращаясь к линии.
В библиотеке есть функция:
drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t color),

Ок. допустим точка x0y0 мне известна и не меняется. Как расчитать точку x1y1 если известен угол от 0 до 359 градусов?
Tohin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 02:43. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика