Перейти к содержанию
    

Алгоритм поворота стрелки прибора на ЖКИ

Есть задача выводить на ЖКИ стрелочный прибор. Может у кого есть уже наработки по этому вопросу? Интересует наиболее простая реализация, желательно целочисленная.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Массив координат конца стрелки (X,Y) на 100 позиций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть упрощенные формулы для синуса и косинуса (вам же мегаточность не нужна).

Я в студенческие годы на ассемблере выводил дуги и кружочки напрямую в адаптер VGA :)

Щас покопался - похоже, наврал.

Наверняка по параметрическому уравнению кружочки рисовал...

 

Массив координат конца стрелки (X,Y) на 100 позиций.

А почему именно на 100, а не 180 или 256?

Да, массив - самое простое.

Изменено пользователем MrYuran

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему именно на 100, а не 180 или 256?
0-100%, но возможны и варианты:-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да. Действительно, идея с массивом как-то в голову не пришла. Буду скорее всего ее пробовать. Спасибо :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использовать целочисленный алгоритм рисования линии Брезенхама. Кажется так называется...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использовать целочисленный алгоритм рисования линии Брезенхама. Кажется так называется...

В таком простом варианте получается довольно некрасиво(пробовал)...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть задача выводить на ЖКИ стрелочный прибор. Может у кого есть уже наработки по этому вопросу? Интересует наиболее простая реализация, желательно целочисленная.

Для рисования линий на растровых дисплеях неплохо подходит алгоритм Брейзенхейма. Вот одна из реализаций:

//------------------------------------------------------------------------------
//
//    Description: the function draws line from point 'p1' to point 'p2' 
//                 with pixels (colour, intensity, transparency) defined 
//                 by argument 'pix'. 
//
void gui::draw_line(TPoint p1, TPoint p2, uint8_t pix)
{
   int16_t dx = (p2.x - p1.x >= 0 ? 1 : -1);
   int16_t dy = (p2.y - p1.y >= 0 ? 1 : -1);

   int16_t lenX = abs(p2.x - p1.x);
   int16_t lenY = abs(p2.y - p1.y);

   int16_t len = max(lenX, lenY);

   if (len == 0)
   {
       draw_pixel(p1, pix);
       return;
   }

   if (lenY <= lenX)
   {
       int16_t x = p1.x;
       int16_t y = p1.y;
       int16_t d = -lenX;

       len++;
       while(len--)
       {
           draw_pixel(TPoint(x, y), pix);
           x += dx;
           d += 2*lenY;
           if(d > 0) 
           {
               d -= 2*lenX;
               y += dy;
           }
       }
   }
   else
   {
       int16_t x = p1.x;
       int16_t y = p1.y;
       int16_t d = -lenY;

       len++;
       while(len--)
       {
           draw_pixel(TPoint(x, y), pix);
           y += dy;
           d += 2*lenX;
           if (d > 0) 
           {
               d -= 2*lenY;
               x += dx;
           }
       }
   }
}

 

где TPoint:

    struct TPoint
    {
        int16_t x;
        int16_t y;
        ... // остальное определение: конструкторы, операторы
    };

 

а фукнция draw_pixel просто записывает значение пиксела в буфер экрана. Реализация рабочая, используется в реальных проектах.

 

Если вам больше подойдет реализация в полярных координатах (эта, как видно из кода, для декартовых), то их тоже есть, можно поискать на просторах инета. Ну, и погуглите на слово Брейзенхейм.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Однажды делал круговую диаграмму на AVR с ЖКИ. Коэффициент, определяющий наклон линии (стрелки), равен, как известно тангенсу этого угла (если стрелку рассматривать как y=kx). Т.е., вся задача сводилась к простому вычислению tg. Я тогда вывел довольно простое приближение:

tg(x) = x/(pi/2-abs(x))

А если к этому еще прибавить 0.44*(-x^3+x*pi^2/16), будет еще точнее.

Конечно, с таблицей координат это вряд ли сможет конкурировать по простоте. А мне нужна была независимость от размеров

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...