-
Notifications
You must be signed in to change notification settings - Fork 0
/
graphic.c
122 lines (110 loc) · 4.21 KB
/
graphic.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
extern void GLCD_SetPixel(char x, char y, char color);
const char color = 1;
void GLCD_Rectangle(unsigned char x, unsigned char y, unsigned char b,
unsigned char a)
{
unsigned char j; // zmienna pomocnicza
// rysowanie linii pionowych (boki)
for (j = 0; j < a; j++)
{
GLCD_SetPixel(x, y + j, color);
GLCD_SetPixel(x + b - 1, y + j, color);
}
// rysowanie linii poziomych (podstawy)
for (j = 0; j < b; j++)
{
GLCD_SetPixel(x + j, y, color);
GLCD_SetPixel(x + j, y + a - 1, color);
}
}
void GLCD_Circle(unsigned char cx, unsigned char cy, unsigned char radius)
{
int x, y, xchange, ychange, radiusError;
x = radius;
y = 0;
xchange = 1 - 2 * radius;
ychange = 1;
radiusError = 0;
while (x >= y)
{
GLCD_SetPixel(cx + x, cy + y, color);
GLCD_SetPixel(cx - x, cy + y, color);
GLCD_SetPixel(cx - x, cy - y, color);
GLCD_SetPixel(cx + x, cy - y, color);
GLCD_SetPixel(cx + y, cy + x, color);
GLCD_SetPixel(cx - y, cy + x, color);
GLCD_SetPixel(cx - y, cy - x, color);
GLCD_SetPixel(cx + y, cy - x, color);
y++;
radiusError += ychange;
ychange += 2;
if (2 * radiusError + xchange > 0)
{
x--;
radiusError += xchange;
xchange += 2;
}
}
}
void GLCD_Line(int X1, int Y1, int X2, int Y2)
{
int CurrentX, CurrentY, Xinc, Yinc, Dx, Dy, TwoDx, TwoDy,
TwoDxAccumulatedError, TwoDyAccumulatedError;
Dx = (X2 - X1); // obliczenie sk�adowej poziomej
Dy = (Y2 - Y1); // obliczenie sk�adowej pionowej
TwoDx = Dx + Dx; // podwojona sk�adowa pozioma
TwoDy = Dy + Dy; // podwojona sk�adowa pionowa
CurrentX = X1; // zaczynamy od X1
CurrentY = Y1; // oraz Y1
Xinc = 1; // ustalamy krok zwi�kszania pozycji w poziomie
Yinc = 1; // ustalamy krok zwi�kszania pozycji w pionie
if (Dx < 0) // jesli sk�adowa pozioma jest ujemna
{
Xinc = -1; // to b�dziemy si� "cofa�" (krok ujemny)
Dx = -Dx; // zmieniamy znak sk�adowej na dodatni
TwoDx = -TwoDx; // jak r�wnie� podwojonej sk�adowej
}
if (Dy < 0) // je�li sk�adowa pionowa jest ujemna
{
Yinc = -1; // to b�dziemy si� "cofa�" (krok ujemny)
Dy = -Dy; // zmieniamy znak sk�adowej na dodatki
TwoDy = -TwoDy; // jak r�wniez podwojonej sk�adowej
}
GLCD_SetPixel(X1, Y1, color); // stawiamy pierwszy krok (zapalamy pierwszy piksel)
if ((Dx != 0) || (Dy != 0)) // sprawdzamy czy linia sk�ada si� z wi�cej ni� jednego punktu ;)
{
// sprawdzamy czy sk�adowa pionowa jest mniejsza lub r�wna sk�adowej poziomej
if (Dy <= Dx) // je�li tak, to idziemy "po iksach"
{
TwoDxAccumulatedError = 0; // zerujemy zmienn�
do // ruszamy w drog�
{
CurrentX += Xinc; // do aktualnej pozycji dodajemy krok
TwoDxAccumulatedError += TwoDy; // a tu dodajemy podwojon� sk�adow� pionow�
if (TwoDxAccumulatedError > Dx) // je�li TwoDxAccumulatedError jest wi�kszy od Dx
{
CurrentY += Yinc; // zwi�kszamy aktualn� pozycj� w pionie
TwoDxAccumulatedError -= TwoDx; // i odejmujemy TwoDx
}
GLCD_SetPixel(CurrentX, CurrentY, color); // stawiamy nast�pny krok (zapalamy piksel)
}
while (CurrentX != X2); // idziemy tak d�ugo, a� osi�gniemy punkt docelowy
}
else // w przeciwnym razie idziemy "po igrekach"
{
TwoDyAccumulatedError = 0;
do
{
CurrentY += Yinc;
TwoDyAccumulatedError += TwoDx;
if (TwoDyAccumulatedError > Dy)
{
CurrentX += Xinc;
TwoDyAccumulatedError -= TwoDy;
}
GLCD_SetPixel(CurrentX, CurrentY, color);
}
while (CurrentY != Y2);
}
}
}