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)
1 |
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
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 6 7 8 |
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
1 2 3 4 5 6 |
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); } } } |
Cái viền chạy bên ngoài hướng viết code sao vậy b?