ham do hoa trong led ma tran
Bài này mình giới thiệu 1 số hàm xử lí cơ bản để các bạn thoại mái vẽ với lên led ma trận Các bạn tham khảo thêm ở đây nhé: https://voer.edu.vn/m/gioi-thieu-cac-thuat-toan-ve-va-to-cac-duong-co-ban/6d58afd1
Chúng ta có hàm cơ bản nhất như sau ( đã xây dựng ở các bài trước)
void Matrix_setpx ( int x , int y , int color ) ; // với x,y là tọa độ color là màu sắc(ở đây ví dụ màu mang 2 giá trị ON,OFF)
Hàm vẽ đường ngang
Hàm này sẽ vẽ ra 1 đường ngang với chiều dài nhập vào cùng với tọa độ bắt đầu
void Matrix_veduongngang ( int x , int y , int dodai , int color )
{
char dem ;
for ( dem = 0 ; dem < dodai ; dem ++ )
{
Matrix_setpx ( x + dem , y , color ) ;
}
}
Hàm vẽ đường dọc
Hàm này sẽ vẽ ra 1 đường dọc với chiều cao nhập vào cùng với tọa độ bắt đầu
void Matrix_veduongdoc ( int x , int y , int docao , int color )
{
char dem ;
for ( dem = 0 ; dem < docao ; dem ++ )
{
Matrix_setpx ( x , y + dem , color ) ;
}
}
Hàm vẽ đường thẳng
Hàm này sẽ nối 2 pixel lại với nhau Tham khảo: https://www.youtube.com/watch?v=GMGtW671UCI&vl=vi
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
void Matrix_veduongthang ( int x , int y , int x1 , int y1 , int color )
{
int dx , dy , err , ystep ;
int steep = abs ( y1 - y ) > abs ( x1 - x ) ;
int xtd , ytd ;
if ( x == x1 )
{
ytd = y1 - y ;
ytd = abs ( ytd ) ;
if ( y1 > y ) Matrix_veduongdoc ( x , y , ytd + 1 , color ) ;
else Matrix_veduongdoc ( x1 , y1 , ytd + 1 , color ) ;
return ;
}
if ( y == y1 )
{
xtd = x1 - x ;
xtd = abs ( xtd ) ;
if ( x1 > x ) Matrix_veduongngang ( x , y , xtd + 1 , color ) ;
else Matrix_veduongngang ( x1 , y1 , xtd + 1 , color ) ;
return ;
}
if ( steep )
{
swap ( x , y ) ;
swap ( x1 , y1 ) ;
}
if ( x > x1 )
{
swap ( x , x1 ) ;
swap ( y , y1 ) ;
}
dx = x1 - x ;
dy = abs ( y1 - y ) ;
err = dx / 2 ;
if ( y < y1 ) ystep = 1 ;
else ystep = - 1 ;
for ( ; x <= x1 ; x ++ )
{
if ( steep )
{
Matrix_setpx ( y , x , color ) ;
}
else
{
Matrix_setpx ( x , y , color ) ;
}
err -= dy ;
if ( err < 0 )
{
y += ystep ;
err += dx ;
}
}
}
Hàm vẽ hình chữ nhật
Hàm này sẽ vẽ ra 1 hình chữ nhật với tọa độ bắt đầu ở góc trên cùng bên trái, cùng với chiều dài và rộng được nhập vào
void Matrix_vehinhchunhat ( int x , int y , int rong , int cao , int color )
{
int x1 , y1 ;
x1 = x + rong - 1 ;
y1 = y + cao - 1 ;
Matrix_veduongdoc ( x , y , cao , color ) ; Matrix_veduongdoc ( x1 , y , cao , color ) ;
Matrix_veduongngang ( x , y , rong , color ) ; Matrix_veduongngang ( x , y1 , rong , color ) ;
}
Hàm vẽ hình chữ nhật được tô kín
void Matrix_vehinhchunhat_kin ( int x , int y , int rong , int cao , int color )
{
int x1 ;
x1 = x + rong ;
for ( ; x < x1 ; x ++ ) Matrix_veduongdoc ( x , y , cao , color ) ;
}
Hàm vẽ hình tròn
Hàm này sẽ vẽ 1 đường tròn rỗng bên trong, với tọa độ xy là tâm của hình tròn là bán hình tròn Tham khảo: https://www.stdio.vn/articles/thuat-toan-midpoint-ve-duong-tron-276
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
void Matrix_vehinhtron ( int x0 , int y0 , int r , int color )
{
int ddF_x , f , x0x , x0y , x0_x , x0_y , y0x , y0y , y0_x , y0_y , ddF_y , x , y ;
if ( r < 1 ) { return ; } //thoát
f = 1 - r ;
ddF_x = 1 ;
ddF_y = - 2 * r ;
x = 0 ;
y = r ;
Matrix_setpx ( x0 , y0 + r , color ) ;
Matrix_setpx ( x0 , y0 - r , color ) ;
Matrix_setpx ( x0 + r , y0 , color ) ;
Matrix_setpx ( x0 - r , y0 , color ) ;
while ( x < y )
{
if ( f >= 0 )
{
y -- ;
ddF_y += 2 ;
f += ddF_y ;
}
x ++ ;
ddF_x += 2 ;
f += ddF_x ;
x0x = x0 + x ; x0y = x0 + y ; x0_x = x0 - x ; x0_y = x0 - y ;
y0x = y0 + x ; y0y = y0 + y ; y0_x = y0 - x ; y0_y = y0 - y ;
Matrix_setpx ( x0x , y0_y , color ) ;
Matrix_setpx ( x0y , y0_x , color ) ;
Matrix_setpx ( x0_x , y0_y , color ) ;
Matrix_setpx ( x0_y , y0_x , color ) ;
Matrix_setpx ( x0_y , y0x , color ) ;
Matrix_setpx ( x0_x , y0y , color ) ;
Matrix_setpx ( x0y , y0x , color ) ;
Matrix_setpx ( x0x , y0y , color ) ;
}
}
Hàm vẽ hình tròn đặc
Hàm này sẽ vẽ 1 đường tròn đặc ruột, với tọa độ xy là tâm của hình tròn là bán hình tròn
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
void Matrix_vehinhtron_kin ( int x0 , int y0 , int r , int color )
{
int i , f , y0x , y0y , ddF_x , ddF_y , x , y ;
if ( r < 1 ) { return ; } //thoát
f = 1 - r ;
ddF_x = 1 ;
ddF_y = - 2 * r ;
x = 0 ;
y = r ;
for ( i = y0 - r ; i <= y0 + r ; i ++ ) set_px ( x0 , i , cR , cG , cB ) ;
while ( x < y )
{
if ( f >= 0 )
{
y -- ;
ddF_y += 2 ;
f += ddF_y ;
}
x ++ ;
ddF_x += 2 ;
f += ddF_x ;
y0y = y0 + y ;
y0x = y0 + x ;
for ( i = y0 - y ; i <= y0y ; i ++ )
{
Matrix_setpx ( x0 + x , i , color ) ;
Matrix_setpx ( x0 - x , i , color ) ;
}
for ( i = y0 - x ; i <= y0x ; i ++ )
{
Matrix_setpx ( x0 + y , i , color ) ;
Matrix_setpx ( x0 - y , i , color ) ;
}
}
}
Từ tác giả:
Nếu có bất kì thắc mắc nào trong bài viết, vui lòng để lại comment dưới mỗi bài ! Mình sẽ không trả lời thắc mắc của các bạn ở facebook hay email !
Nếu trong phần code bạn nhìn thấy nhưng thứ kiểu như & thì đó là lỗi hiển thị, cụ thể 3 kí tự < > & bị biến đổi thành như thế
& là &
< là <
> là >
Cái viền chạy bên ngoài hướng viết code sao vậy b?