Jump to content

    
Sign in to follow this  
Newegor

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

Recommended Posts

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

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
Использовать целочисленный алгоритм рисования линии Брезенхама. Кажется так называется...

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

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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this