Возникли проблемы с рисованием стрелок аналоговых часов - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть возможность сделать аналоговые часы в стартовом комплекте C PIC18.Мне нужно нарисовать все стрелки часов, иначе секунд, минут и часов.

Я инициализировал все 60 точек диаметра часов в двумерном массиве со значениями x и y и имею значения часовcenter.

Для того, чтобы нарисовать руки, которые я предоставил для этого задания с помощью функции DrawLine, которая выглядит следующим образом:

void drawLine( BYTE x0, BYTE y0, BYTE x1, BYTE y1, LineWidth lw )

x0, y0 - то, где начинается линияи x1, y1 - то, где заканчивается строка.

функция drawLine работает как XOR, поэтому, если я вызову ее снова для тех же значений, линия исчезнет с экрана.

экранзначения, когда они равны x = 0, y = 0 начинаются с верхнего левого угла экрана.

Я построил функцию для рисования часовой стрелки часов.У меня есть значение i, которое увеличивается на 1 для каждой координаты часов, и это выглядит так:

center[0][0]+(cord[i][0]-center[0][0])/2

Но по какой-то причине это работает только в 4-м квадранте часов (иначе, когда ямежду 15 и 30), иначе линии, которые он рисует, не похожи на стрелку часов.

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

BYTE cord[60][2] = {
{67,0},{71,1},{74,2},{79,3},{81,4},
{82,5},{84,6},{88,9},{91,12},{92,14},
{93,16},{95,18},{96,21},{97,25},{98,29},
{98,32},{98,35},{97,39},{96,43},{95,45},
{93,47},{92,50},{89,53},{85,56},{84,58},
{82,58},{79,60},{76,61},{73,62},{70,63},
{67,63},{64,63},{60,62},{57,61},{54,60},
{51,58},{47,56},{45,54},{43,52},{41,50},
{40,47},{38,44},{37,41},{36,38},{35,35},
{35,32},{35,29},{36,26},{37,22},{38,18},
{40,16},{41,13},{44,10},{47,7},{49,6},
{51,5},{52,4},{54,3},{57,2},{61,1}};




void main(void)
{
    BYTE xtemp, ytemp ;
    BYTE i = 0;
    BYTE center[1][2] = {{67,32}};
    InitializeSystem();

    while(1)                            
    {
        xtemp = center[0][0]+(cord[i][0]-center[0][0])/2;
        ytemp =  center[0][1]+(cord[i][1]-center[0][1])/2;
        drawLine( center[0][0], center[0][1], xtemp, ytemp, thick ) ;
        DelayMs(50);
        drawLine( center[0][0], center[0][1], xtemp, ytemp, thick );
        i++;
            if(i>60)
                i = 0;

    }
}

1 Ответ

1 голос
/ 03 апреля 2019

Нет стандартного типа данных BYTE, включенного в C. Я думаю, у вас есть typedef с беззнаковым типом.
Когда вы делаете подписанный расчет, как:

   xtemp = center[0][0]+(cord[i][0]-center[0][0])/2;

вам нужен подписанный тип со знаком, например int.

...