Jump to content

    

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

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

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

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

Edited by MrYuran

Share this post


Link to post
Share on other sites
А почему именно на 100, а не 180 или 256?
0-100%, но возможны и варианты:-)

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Использовать целочисленный алгоритм рисования линии Брезенхама. Кажется так называется...

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

Share this post


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

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

//------------------------------------------------------------------------------
//
//    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 просто записывает значение пиксела в буфер экрана. Реализация рабочая, используется в реальных проектах.

 

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

Share this post


Link to post
Share on other sites

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

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

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

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

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this