text:
Chương 8: Đồ họa
Chia sẻ: Men Men | Ngày: | Loại File: DOC | Số trang:24
lượt xem 40
download
Chương 8: Đồ họa
Tham khảo tài liệu 'chương 8: đồ họa', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Chương 8: Đồ họa
- Chương 8 SANS.CHR Đồ họa TRIP.CHR Trong chương này sẽ giới thiệu các hàm để vẽ các đường và Bảng 8-1. Các tệp tin điều khiển đồ họa của TURBO C++ hình cơ bản như đường tròn, cung elip, hình quạt, đường gẫy 446 447 Tên tệp tin Kiểu màn hình đồ họa khúc, hình đa giác, đường thẳng, đường chữ nhật, hình chữ nhật, hình hộp chữ nhật, ... Ngoài ra còn đề cập tới các vấn đề rất lý thú ATT.BGI ATT & T6300 (400 dòng) khác như: xử lý văn bản trên màn hình đồ họa, cửa sổ và kỹ thuật CGA.BGI IBMCGA, MCGA và các máy tương thích tạo ảnh di động. Các hàm đồ họa được khai báo trong tệp EGAVGA.BGI IBM EGA, VGA và các máy tương thích graphics.h. HERC.BGI Hercules monochrome và các máy tương thích IBM8514.BGI IBM 8514 và các máy tương thích § 1. Khái niệm đồ họa PC3270.BGI IBM 3270 PC Để hiểu kỹ thuật lập trình đồ họa, đầu tiên phải hiểu các yếu tố cơ bản của đồ họa. Từ trước đến nay chúng ta chủ yếu làm Màn hình đồ họa gồm nhiều điểm ảnh được sắp xếp trên các việc với kiểu văn bản. Nghĩa là màn hình được thiết lập để hiển đường thẳng ngang và dọc. Điều này đúng cho tất cả các kiểu màn thị 25 dòng, mỗi dòng có thể chứa 80 ký tự. Trong kiểu văn bản, hình đồ họa của máy tính. Khác biệt chủ yếu giữa chúng là kích các ký tự hiển thị trên màn hình đã được phần cứng của máy PC thước và số các điểm ảnh. Trong kiểu CGA (độ phân giải thấp), ấn định trước và ta không thể nào thay đổi được kích thước, kiểu điểm ảnh có kích thước lớn, chiều ngang có 320 điểm ảnh, còn chữ. theo chiều dọc có 200 điểm ảnh. Màn hình VGA có độ phân giải cao hơn: điểm ảnh nhỏ hơn, trên mỗi hàng có 640 điểm ảnh và ở màn hình đồ họa, ta có thể xử lý đến từng chấm điểm (pixel) trên mỗi cột có 480 điểm ảnh. Điểm ảnh càng nhỏ thì số điểm trên màn hình và do vậy muốn vẽ bất kỳ thứ gì cũng được. Sự bài ảnh trên màn hình càng nhiều và chất lượng đồ họa càng cao. trí và số pixel trên màn hình được gọi là độ phân giải (resolution). Do mỗi kiểu màn hình đồ họa có một cách xử lý đồ họa riêng nên Mỗi kiểu đồ họa dùng một hệ tọa độ riêng. Hệ tọa độ cho màn TURBO C cung cấp một tệp tin điều khiển riêng cho từng kiểu đồ hình VGA là 640 x 480 như sau : họa. Bảng 8-1 cho thấy các kiểu đồ họa và các tệp tin điều khiển (0,0) (639,0) chúng. Ngoài các tệp có đuôi BGI chứa chương trình điều khiển đồ họa, TURBO C còn cung cấp các tệp tin đuôi CHR chứa các Font chữ để vẽ các kiểu chữ khác nhau trên màn hình đồ họa. Đó là các tệp: GOTH.CHR LITT.CHR
- main() (0,479) (639,479) { Hình 8.1. Hệ tọa độ VGA int mh=EGA, mode= EGALO; Nhờ hệ tọa độ này, ta có thể tác động hay tham chiếu đến bất initgraph(&mh, &mode, "C:\TC"); kỳ điểm ảnh nào trên màn hình đồ họa. ... Nếu dùng màn hình CGA thì góc dưới phải có tọa độ (319, } 199). Độc lập với kiểu đồ họa đang sử dụng, các hàm getmaxx và Bảng 8-2. Các giá trị khả dĩ của graphdriver, graphmode 448 getmaxy bao giờ cũng cho tọa độ x và y lớn nhất trong kiểu đồ 449 họa đang dùng. graphdriver graphmode Độ phân giải Detect (0) Một chương trình đồ họa thường gồm các phần sau: CGA (1) CGAC0 (0) 320 x 200 - Khởi động hệ thống đồ họa. CGAC1 (1) 320 x 200 - Xác định mầu nền (mầu màn hình), mầu đường vẽ, mầu tô và CGAC2 (2) 320 x 200 kiểu (mẫu) tô. CGAC3 (3) 320 x 200 - Vẽ, tô mầu các hình mà ta mong muốn. CGAHi (4) 640 x 200 - Các thao tác đồ họa khác như cho hiện các dòng chữ... MCGA (2) MCGA0 (0) 320 x 200 - Đóng hệ thống đồ họa để trở về mode văn bản. MCGA1 (1) 320 x 200 MCGA2 (2) 320 x 200 § 2. Khởi động hệ đồ họa MCGA3 (3) 320 x 200 MCGAMed (4) 640 x 200 Mục đích của việc khởi động hệ thống đồ họa là xác định thiết MCGAHi (5) 640 x 480 bị đồ họa (màn hình) và mốt đồ họa sẽ sử dụng trong chương EGA (3) EGALO (0) 640 x 200 trình. Để làm điều này ta dùng hàm: EGAHi (1) 640 x 350 void initgraph(int *graphdriver, int *graphmode,char EGA64 (4) EGA64LO (0) 640 x 200 *driverpath); EGA64Hi (1) 640 x 350 trong đó: driverpath là đường dẫn của thư mục chứa các tệp tin EGAMONO (5) EGAMONOHi (0) 640 x 350 điều khiển đồ họa, graphdriver, graphmode cho biết màn hình và VGA (9) VGALO (0) 640 x 200 mốt đồ họa sẽ sử dụng trong chương trình. Bảng 8-2 cho thấy các VGAMED (1) 640 x 350 giá trị khả dĩ của graphdriver và graphmode. VGAHI (2) 640 x 480 Ví dụ 1. Giả sử máy tính của ta có màn hình EGA, các tệp tin HERCMONO (7) HERCMONOHI 720 x 348 đồ họa chứa trong thư mục C: \TC, khi đó ta có thể khởi động hệ ATT400 (8) ATT400C0 (0) 320 x 200 thống đồ họa như sau: ATT400C1 (1) 320 x 200 #include "graphics.h"
- ATT400C2 (2) 320 x 200 độ phân giải cao nhất, mà còn giúp ta xác định chính xác kiểu màn ATT400C3 (3) 320 x 200 hình đang sử dụng. ATT400MED (4) 640 x 400 Ví dụ 2. Chương trình dưới đây xác định kiểu màn hình đang sử ATT400HI (5) 640 x 400 dụng: PC3270 (10) PC3270HI (0) 720 x 350 #include "graphics.h" IBM8514 (6) IBM8514LO (0) 640 x 480, 256 mầu #include "stdio.h" IBM8514HI (1) 1024 x 768, 256 mầu main() { Chú ý 1. Bảng 8-2 cho các tên hằng và giá trị của chúng mà các int mh=0, mode= 0; biến graphdriver, graphmode có thể nhận. Chẳng hạn hằng DETECT có giá trị 0, hằng VGA có giá trị 9, hằng VGALO có giá initgraph(&mh, &mode, ""); trị 0... Khi lập trình ta có thể dùng tên hằng hoặc giá trị tương ứng 450 printf("\n Giá trị số của màn hình là: %d", mh); 451 của chúng. Chẳng hạn các phép gán trong ví dụ 1 có thể viết theo closegraph(); một cách khác tương đương như sau: } mh=3; mode=0; Nếu chương trình cho kết quả: Chú ý 2. Bảng 8.2 cho thấy độ phân giải phụ thuộc cả vào màn Giá trị số của màn hình là: 3 hình và mode. Ví dụ trong màn hình EGA nếu dùng mode EGALO thì ta có thể khẳng định loại màn hình đang dùng là EGA. thì độ phân giải là 640 x 200, hàm getmaxx cho giá trị 639, hàm Chú ý 4. Nếu chuỗi dùng để xác định driverpath là một chuỗi getmaxy cho giá trị 199 . Nếu cũng màn hình EGA mà dùng mode rỗng (như trong ví dụ 2) thì chương trình dịch sẽ tìm các tệp điều EGAHI thì độ phân giải là 640x 350, hàm getmaxx cho giá trị 639, khiển đồ họa trên thư mục chủ. hàm getmaxy cho giá trị 349. Chú ý 3. Nếu không biết chính xác kiểu màn hình đang sử dụng thì ta gán cho biến graphdriver hằng DETECT hay giá trị 0. Khi đó § 3. Lỗi đồ họa kết quả của hàm initgraph sẽ là: Khi khởi động hệ thống đồ họa nếu máy không tìm thấy các - Kiểu của màn hình đang sử dụng được phát hiện, giá trị số chương trình điều khiển đồ họa thì sẽ phát sinh lỗi đồ họa và việc của nó được gán cho biến graphdriver. khởi động coi như không thành. Lỗi đồ họa còn phát sinh khi dùng - Mode đồ họa ở độ phân giải cao nhất ứng với màn hình đang các hàm đồ hoạ. Trong mọi trường hợp, hàm graphresult cho biết sử dụng cũng được phát hiện và giá trị số của nó được gán cho có lỗi hay không lỗi và đó là lỗi gì. Bảng 8-3 cho các mã lỗi mà biến graphmode. hàm này phát hiện được. Ta có thể dùng hàm grapherrormsg với mã lỗi do hàm graphresult trả về để biết được đó là lỗi gì, ví dụ: Như vậy việc dùng hằng số DETECT chẳng những có thể khởi động được hệ thống đồ họa của màn hình hiện có theo mode có int maloi;
- maloi = graphresult(); Trong cả 3 trường hợp color xác định mã của mầu. Các giá trị printf("\nLỗi đồ họa là: %d", grapherrormsg(maloi)); khả dĩ của color cho trong bảng 8-4, pattern xác định mã của mẫu tô (xem bảng 8-5). Bảng 8-3. Các mã lỗi của Graphresult Mẫu tô và mầu tô sẽ được sử dụng trong các hàm pieslice, Hằng Trị Lỗi phát hiện fillpoly, bar, bar3d và floodfill (xem §5 dưới đây). grOk 0 Không có lỗi grNoInitGraph -1 Chưa khởi động hệ đồ họa 4. Chọn giải mầu grNotDetected -2 Không có phần cứng đồ họa Để thay đổi giải mầu đã được định nghĩa trong bảng 8.4 ta dùng hàm grFileNotFound -3 Không tìm thấy trình điều khiển đồ họa void setpalette(int colornum, int color); grInvalidDriver -4 Trình điều khiển không hợp lệ Ví dụ câu lệnh grNoLoadMem -5 Không đủ RAM cho đồ họa grNoScanMem -6 Vượt vùng RAM trong Scan fill setpalette(0, Lightcyan); grNoFloodMem -7 Vượt vùng RAM trong flood fill biến mầu đầu tiên trong bảng mầu thành xanh lơ nhạt. Các mầu 452 khác không bị ảnh hưởng. 453 grFontNoFound -8 Không tìm thấy tập tin Font Bảng 8-4. Các giá trị khả dĩ của color grNoFontMem -9 Không đủ RAM để nạp Font grInvalidMode -10 Kiểu đồ họa không hợp lệ cho trình điều khiển Tên hằng Giá trị số Mầu hiển thị grError -11 Lỗi đồ họa tổng quát BLACK 0 Đen grIOerror -12 Lỗi đồ họa vào ra BLUE 1 Xanh da trời grInvalidFont -13 Tập tin Font không hợp lệ GREEN 2 Xanh lá cây grInvalidFontNum -14 Số hiệu Font không hợp lệ CYAN 3 Xanh lơ RED 4 Đỏ MAGENTA 5 Tím § 4. Mầu và mẫu BROWN 6 Nâu 1. Để chọn mầu nền ta sử dụng hàm LIHGTGRAY 7 Xám nhạt void setbkcolor(int color); DARKGRAY 8 Xám sẫm 2. Để chọn mầu đường vẽ ta dùng hàm LIGHTBLUE 9 Xanh da trời nhạt void setcolor(int color); LIGHTGREEN 10 Xanh lá cây nhạt LIGHTCYAN 11 Xanh lơ nhạt 3. Để chọn mẫu (kiểu) tô và mầu tô ta dùng hàm LIGHTRED 12 Đỏ nhạt void setfillstyle(int pattern, int color); LIGHTMAGENTA 13 Tím nhạt
- YELLOW 14 Vàng 6. Hàm getcolor trả về mầu đã xác định trước đó bằng hàm WHITE 15 Trắng setcolor. 7. Hàm getbkcolor trả về mầu đã xác định trước đó bằng hàm 5. Để nhận giải mầu hiện hành ta dùng hàm setbkcolor. void getpalette (struct palettetype *palette); 8. Hàm getmaxcolor trả về mã mầu cực đại thuộc giải mầu hiện ở đây palettetype là kiểu đã định nghĩa trước như sau: đang có hiệu lực. Trên 256 K EGA, hàm getmaxcolor luôn cho giá #define MAXCOLORS 15 trị 15. struct palettetype § 5. Vẽ và tô mầu { unsigned char size; Có thể chia các đường và hình thành bốn nhóm chính: unsigned char colors[MAXCOLORS+1]; - Đường tròn và ellipse }; - Đường gấp khúc và hình đa giác ở đây: size là số lượng mầu trong palette, colors là mảng chứa - Đường thẳng mầu với chỉ số mảng chạy từ 0 đến size - 1 - Hình chữ nhật Bảng 8-5. Các giá trị khả dĩ của pattern 454 A. Đường tròn và hình tròn 455 Tên hằng Giá trị số Mô tả kiểu tô Nhóm này gồm cung tròn, đường tròn, cung ellipse và hình quạt. EMPTY_FILL 0 Tô bằng mầu nền 1. Cung tròn. Để vẽ một cung tròn ta dùng hàm SOLID_FILL 1 Tô bằng đường nét liền void arc(int x, int y, int gd, int gc, int r); LINE_FILL 2 Tô bằng - - - ở đây: LTSLASH_FILL 3 Tô bằng /// (x, y) là tọa độ của tâm cung tròn, SLASH_FILL 4 Tô bằng /// in đậm r là bán kính BKSLASH_FILL 5 Tô bằng \\\ in đậm gd là góc đầu LTBKSLASH_FILL 6 Tô bằng \\\ gc là góc cuối HATCH_FILL 7 Tô bằng đường gạch bóng nhạt Chú ý: Trong tất cả các hàm dưới đây, góc tính theo độ và có XHATCH_FILL 8 Tô bằng đường gạch bóng chữ giá trị từ 0 đến 360. thập INTERLEAVE_FILL 9 Tô bằng đường đứt quãng 2. Đường tròn. Để vẽ một đường tròn ta dùng hàm WIDE_DOT_FILL 10 Tô bằng dấu chấm thưa void circle(int x, int y, int r); CLOSE_DOT_FILL 11 Tô bằng dấu chấm mau ở đây:
- (x, y) là tọa độ của tâm; // Mầu nền Green, mầu đường vẽ r là bán kính đường tròn. //White, mầu tô Red, kiểu tô SlashFill 3. Cung ellipse. Để vẽ một cung Ellipse ta dùng hàm setbkcolor (GREEN); void ellipse(int x,int y,int gd,int gc,int xr,int yr); setcolor (WHITE); ở đây: setfillstyle (SLASH_FILL, RED); (x, y) là tọa độ của tâm cung Ellipse // Vẽ: một cung tròn ở góc phần tư thứ nhất, gd là góc đầu // một cung Ellipse ở góc phần tư thứ ba, gc là góc cuối // một đường tròn, một quạt tròn xr là bán trục ngang yr là bán trục đứng. arc(160, 50, 0, 90, 45); ellipse(480, 50, 180, 270, 150, 45); 4. Hình quạt. Để vẽ và tô màu một hình quạt ta dùng hàm circle(160, 150, 45); void pieslice(int x,int y,int gd,int gc,int r); pieslice(480, 150, 90, 360, 45); ở đây: (x,y) là tọa độ tâm hình quạt // Kết thúc chế độ đồ họa gd là góc đầu closegraph(); gc là góc cuối } r là bán kính B. Đường gấp khúc và đa giác 456 457 Ví dụ 1. Chương trình dưới đây sẽ vẽ: một cung tròn ở góc 5. Muốn vẽ một đường gấp khúc đi qua n điểm : (x1,y1), ... , phần tư thứ nhất, một cung ellipse ở góc phần tư thứ ba, một (xn,yn) thì trước hết ta phải đưa các tọa độ vào một mảng a nào đường tròn và một hình quạt quét từ 90 đến 360 độ. đó kiểu int. Nói một cách chính xác hơn, cần gán x1 cho a[0], y1 #include cho a[1], x2 cho a[2], y2 cho a[3],... Sau đó ta viết lời gọi hàm: main() drawpoly(n, a); { Khi điểm cuối (xn, yn) trùng với điểm đầu (x1, y1) ta nhận int mh, mode; được một đường gấp khúc khép kín. // Khởi động đồ họa, màn hình EGA, mode EGALO 6. Giả sử a là mảng đã nói trong điểm 5, khi đó lời gọi hàm mh=EGA; fillpoly(n, a); mode=EGALO; sẽ vẽ và tô mầu một đa giác có đỉnh là các điểm initgraph(&mh, &mode,""); (x1, y1), ... ,(xn, yn).
- Ví dụ 2. Chương trình dưới đây sẽ vẽ một đường gấp khúc và vẽ đường thẳng từ điểm hiện tại tới điểm (x, y) và chuyển con hai hình tam giác. chạy đến điểm (x, y). #include 9. Hàm // Xây dựng các mảng chứa tọa độ các đỉnh void linerel(int dx,int dy); int poly1[]={5,200,190,5,100,300}; vẽ một đường thẳng từ vị trí hiện tại (x, y) của con chạy đến int poly2[]={205,200,390,5,300,300}; điểm (x + dx,y + dy). Con chạy được di chuyển đến vị trí mới. int poly3[]={405,200,590,5,500,300,405,200}; 10. Hàm main() void moveto(int x,int y); { sẽ di chuyển con chạy tới vị trí (x, y). int mh=0, mode=0; Ví dụ 3. Chương trình dưới đây tạo lên một đường gấp khúc initgraph(&mh, &mode, ""); bằng các đoạn thẳng. Đường gấp khúc đi qua các đỉnh: (20, 20), // Mầu nền CYAN, mầu đường vẽ (620, 20), (620, 180), (20, 180) và (320, 100). // YELLOW, mầu tô MAGENTA, mẫu tô SolidFill #include setbkcolor (CYAN); Setcolor (YELLOW); main() setfillstyle (SOLID_FILL, MAGENTA); { drawpoly (3, poly1); // Đường gấp khúc int mh=0, mode=0; fillpoly (3, poly2); // Hình đa giác initgraph(&mh, &mode, ""); fillpoly(4, poly3); // Hình đa giác setbkcolor(GREEN); closegraph(); setcolor(YELLOW); moveto(320,100); } 458 459 line(20,20,620,20); C. Đường thẳng linerel(-300,80); lineto(620,180); 7. Hàm lineto(620,20); void line(int x1,int y1,int x2,int y2); closegraph(); vẽ đường thẳng nối hai điểm (x1, y1) và (x2, y2) nhưng không làm } thay đổi vị trí con chạy. D. Hình chữ nhật 8. Hàm void lineto(int x,int y); 11. Hàm
- void rectangle(int x1,int y1,int x2,int y2); setcolor(RED); sẽ vẽ một đường chữ nhật có các cạnh song song với các cạnh setfillstyle(CLOSE_DOT_FILL,YELLOW); của màn hình. Tọa độ đỉnh trên bên trái của hình chữ nhật là rectangle(5,5,300,160); (x1,y1) và điểm dưới bên phải là (x2,y2). bar(5,175,300,340); 12. Hàm bar3d(320,100,500,340,100,1); void bar(int x1,int y1,int x2,int y2); closegraph(); sẽ vẽ và tô mầu một hình chữ nhật. Các giá trị x1,y1,x2 và y2 có ý } nghĩa như đã nói trong điểm 11. 13. Hàm § 6. Chọn kiểu đường void bar3d(int x1,int y1,int x2,int y2,int depth,int top); 1. Hàm sẽ vẽ một khối hộp chữ nhật, mặt ngoài của nó là hình chữ nhật xác định bởi các tọa độ x1,y1,x2,y2 (như đã nói trong điểm 12). void setlinestyle(int linestyle,int pattern,int thickness); Hình chữ nhật này được tô mầu. Tham số depth ấn định số điểm tác động đến nét vẽ của các thủ tục line, lineto, rectange, ảnh trên bề sâu của khối 3 chiều. Tham số top có thể nhận trị 1 drawpoly, circle,... Hàm này cho phép ta ấn định 3 yếu tố của (TOPON) hay 0 (TOPOFF) và khối 3 chiều sẽ có nắp hay không đường thẳng là dạng, bề dầy và mẫu tự tạo. nắp (xem hình vẽ). + Dạng đường do tham số linestyle khống chế. Sau đây là các giá trị khả dĩ của linestyle và dạng đường thẳng tương ứng. SOLID_LINE = 0 Nét liền DOTTED_LINE = 1 Nét chấm CENTER_LINE = 2 Nét chấm gạch TOPON TOPOFF DASHED_LINE = 3 Nét gạch Ví dụ 4. Chương trình dưới đây sẽ vẽ một đường chữ nhật, USERBIT_LINE = 4 Mẫu tự tạo một hình chữ nhật và một khối hộp chữ nhật có nắp. + Bề dầy do tham số thickness khống chế. Giá trị này có thể là: 460 #include NORM_WIDTH = 1 Bề dầy bình thường 461 main() THICK_WIDTH = 3 Bề dầy gấp ba { + Mẫu tự tạo: Nếu tham số thứ nhất là USERBIT_LINE thì ta int mh=0, mode=0; có thể tạo ra mẫu đường thẳng bằng tham số pattern. Ví dụ xét initgraph(&mh, &mode, ""); đoạn chương trình: setbkcolor(GREEN); int pattern= 0x1010; setlinestyle(USERBIT_LINE, pattern, NORM_WIDTH);
- line(0,0,100,200); getlinesettings(kieu_cu); Giá trị của pattern trong hệ 16 là 0x1010 hay trong hệ 2 là // Thiết lập kiểu mới 0001 0000 0001 0000 setlinestyle(DOTTED_LINE,0,THICK_WIDTH); Chỗ nào có bit 1 điểm ảnh sẽ sáng, bit 0 làm tắt điểm ảnh. line(0,0,100,10); // Phục hồi kiểu cũ 2. Để nhận các giá trị hiện hành của 3 yếu tố trên ta dùng setlinestyle(kieu_cu.linestyle, hàm: kieu_cu.upattern, kieu_cu.thickness); void getlinesettings(struct linesettingstype *lineinfo); Line(0,20,100,20); với kiểu linesettingstype đã được định nghĩa trước như sau: getch(); struct linesettingstype closegraph(); { } int linestyle; 3. Hàm unsigned int upattern; void setwritemode( int writemode); int thickness; sẽ thiết lập kiểu thể hiện đường thẳng cho các hàm line, }; drawpoly, linerel, lineto, rectangle. Kiểu thể hiện do tham số Ví dụ 1. Chương trình dưới đây minh họa cách dùng các hàm writemode khống chế: setlinestyle và getlinesettings để vẽ đường thẳng. - Nếu writemode bằng COPY_PUT = 0, thì đường thẳng được // kiểu đường viết đè lên dòng đang có trên màn hình. #include - Nếu writemode bằng XOR_PUT = 1, thì mầu của đường #include thẳng định vẽ sẽ kết hợp với mầu của từng chấm điểm của main() đường hiện có trên màn hình theo phép toán XOR (chương 3, §3) { để tạo lên một đường thẳng mới. struct linesettingstype kieu_cu; Một ứng dụng của XOR_PUT là: Khi thiết lập kiểu writemode bằng XOR_PUT rồi vẽ lại đường thẳng cùng mầu thì sẽ xóa int mh=0, mode=0; đường thẳng cũ và khôi phục trạng thái của màn hình. initgraph(&mh, &mode, ""); Chương trình dưới đây minh họa cách dùng hàm setwritemode. if462 (graphresult!= grOk) exit(1); Khi thực hiện ta sẽ thấy hình chữ nhật thu nhỏ dần vào tâm màn 463 setbkcolor(GREEN); setcolor(RED); hình. line(0,0,100,0); Ví dụ 2: // Lưu lại kiểu hiện tại // Thu hình;
- #include void setviewport(int x1,int y1,int x2,int y2,int clip); #include trong đó (x1,y1) là tọa độ góc trên bên trái và (x2,y2) là tọa độ góc main() dưới bên phải. Bốn giá trị này phải thỏa mãn: { 0
- Nhờ sử dụng Viewport có thể viết các chương trình đồ họa if (graphresult!= grOk) exit(1); theo tọa độ âm dương. Muốn vậy ta thiết lập viewport sao cho tâm setviewport(getmaxx()/,getmaxy()/2, tuyệt đối của màn hình là góc trên bên trái của viewport và cho clip = 0 để có thể vẽ ra ngoài giới hạn của viewport. Sau đây là đoạn getmaxx(),getmaxy(), 0); chương trình thực hiện công việc trên // Kẻ hệ trục tọa độ int xc, yc; setcolor(BLUE); xc= getmaxx()/2; yc= getmaxy()/2; line(-(getmaxx()/2),0,getmaxx()/2,0); setviewport(xc, yc, getmaxx(), getmaxy(), 0); line(0,-(getmaxy()/2),0,getmaxy()/2); Như thế màn hình sẽ được chia làm 4 phần với tọa độ âm settextjustify(1,1); setcolor(RED); dương như sau: outtextxy(0,0,"(0,0)"); Phần tư trái trên: x âm, y âm for (i=-400;i
- if(i= -400) moveto(x,y); Sự hoạt động của hàm floodfill phụ thuộc vào giá trị của x,y, border và trạng thái màn hình. else lineto(x,y); 466 a) Khi trên màn hình có một đường (cong hoặc gấp khúc) khép 467 } kín mà mã mầu của nó bằng giá trị của border thì: getch(); + Miền giới hạn bởi đường kín sẽ được tô mầu nếu điểm gieo } (x,y) nằm bên trong miền này. + Nếu điểm gieo (x,y) nằm bên ngoài thì phần màn hình bên ngoài miền đóng nói trên được tô màu. § 8. Tô điểm, tô miền b) Khi trên màn hình không có một đường nào như vậy, thì cả 1. Hàm màn hình được tô màu. void putpixel(int x, int y, int color); Ví dụ 1. Chương trình dưới đây sẽ vẽ một đường tròn đỏ trên sẽ tô điểm (x,y) theo mầu xác định bởi color. màn hình xanh. Tọa độ (x,y) của điểm gieo được nạp vào từ bàn phím. Tùy thuộc vào giá trị cụ thể của x,y, chương trình sẽ tô mầu 2. Hàm vàng cho hình tròn hoặc phần màn hình bên ngoài hình tròn. unsigned getpixel(int x, int y); #include sẽ trả về số hiệu mầu của điểm ảnh ở vị trí (x,y). Chú ý: nếu #include điểm này chưa được tô mầu bởi các hàm vẽ hoặc putpixel (mà chỉ main() mới được tạo mầu nền bởi setbkcolor) thì hàm cho giá trị bằng 0. Vì vậy có thể dùng hàm này theo mẫu dưới đây để xác định các { nét vẽ trên màn hình đồ hoạ và vẽ ra giấy. int mh=0, mode=0, x, y; if (getpixel(x,y)!=0) initgraph(&mh, &mode, ""); { if (graphresult!= grOk) exit(1); // Điểm (x,y) được vẽ , đặt một chấm điểm ra giấy setbkcolor(GREEN); } setcolor(RED); 3. Tô miền setfillstyle(11,YELLOW); Để tô mầu cho một miền nào đó trên màn hình ta dùng hàm circle(320,100,50); void floodfill(int x, int y, int border); moveto(1,150); ở đây: outtext(" Toa do diem gieo x,y "); (x,y) là tọa độ của một điểm nào đó gọi là điểm gieo. scanf("%d%d",&x,&y); flooddfill(x,y,RED); tham số border chứa mã của một mầu. }
- { Ví dụ 2. Minh họa cách dùng hàm Putpixel và hàm getpixel để //Vẽ các chấm điểm một cách ngẫu nhiên vẽ các điểm ảnh và sau đó xóa các điểm ảnh. Muốn kết thúc srand(seed); chương trình bấm ESC. 468 i=0; 469 #include while(i
- } VERT_DIR = 1 } // Kết thúc hàm putpixelplay Nếu direction là HORIZ_DIR, văn bản sẽ hiển thị theo hướng nằm ngang từ trái sang phải. Nếu direction là VERT_DIR, văn bản sẽ hiển thị theo chiều đứng từ dưới lên trên. Đối charsize là hệ số phóng to ký tự và có giá trị trong khoảng 470 § 9. Xử lý văn bản trên màn hình đồ hoạ 471 từ 1 đến 10. 1. Hiển thị văn bản trên màn hình đồ hoạ - Nếu charsize = 1, ký tự được thể hiện trong hình chữ nhật 8*8 pixel. Hàm - Nếu charsize = 2, ký tự được thể hiện trong hình chữ nhật void outtext (char *s); 16*16 pixel. sẽ hiện chuỗi ký tự (do s trỏ tới) tại vị trí hiện tại của con trỏ. ... Hàm - Nếu charsize = 10, ký tự được thể hiện trong hình chữ nhật void outtextxy(int x,int y,char *s); 80*80 pixel. sẽ hiện chuỗi ký tự (do s trỏ tới) tại ví trí (x,y). Cuối cùng là tham số font để chọn kiểu chữ và nhận một trong Ví dụ 1: Hai cách sau đây sẽ cho cùng kết quả các hằng sau: outtextxy (100,100," chao ban "); DEFAULT_FONT = 0 và TRIPLEX_FONT = 1 moveto (100,100); SMALL_FONT = 2 outtext (" chao ban "); SANS_SERIF_FONT = 3 Chú ý: Trong mốt đồ họa vẫn cho phép dùng hàm nhập dữ liệu GOTHIC_FONT = 4 scanf và các hàm bắt phím getch, kbhit. Các giá trị do settextstyle thiết lập sẽ dữ nguyên cho đến khi gọi 2. Fonts một settextstyle mới. Như đã nói ở trên: Các Fonts nằm trong các tệp tin .CHR trên Ví dụ 2: đĩa. Các Font này cho các kích thước và kiểu chữ khác nhau sẽ settextstyle (3,VERT_DIR,2); hiện thị trên màn hình đồ hoạ bằng outtext hay outtextxy. Để chọn và nạp Font chúng ta dùng hàm: outtextxy (50,50," HELLO "); void settextstyle(int font,int direction,int charsize); 3. Vị trí hiển thị (Chú ý: hàm chỉ có tác dụng nếu tồn tại các tệp .CHR) Hàm settextjustify cho phép ấn định nơi hiển thị văn bản của Với direction là một trong hai hằng số: outtext theo quan hệ với vị trí hiện tại của con chạy hay của HORIZ_DIR = 0 outtextxy theo quan hệ với toạ độ (x,y).
- Hàm này có dạng settextjustify(0,0); void settextjustify(int horiz, int vert); for (size=1; size
- void text_writeln(int *x,int *y,char *s) text_read (&x,&y,name); { text_writeln (&x,&y,"" ); outtextxy(*x,*y,s); text_write(&x,&y,"chao ban "); *x=Lmargin; text_write(&x,&y,name); *y += textheight(s)+5; getch(); } closegraph(); void text_read(int *x,int *y,char *s) } { int i=0; char ch[2]; ch[1]=0; 474 § 10. Cắt hình, Dán hình và Tạo ảnh chuyển động 475 while(1) { 1. Hàm ch[0]=getch(); unsigned imagesize(int x1,int y1,int x2,int y2) trả về số byte cần thiết để lưu trữ ảnh trong phạm vi hình chữ if(ch[0]==Enter) break; nhật (x1,y1,x2,y2). text_write(x,y,ch); s[i]=ch[0]; ++i; 2. Hàm } #include void *malloc(unsigned n); s[i]=0; trả về con trỏ trỏ tới một vùng nhớ n byte mới được cấp phát. } main() 3. Hàm { void getimage(int x1,int y1,int x2,int y2,void *bitmap); int mh=0,mode=0,x,y,xmax,ymax; sẽ chép các điểm ảnh của hình chữ nhật (x1,y1,x2,y2) và các thông tin về bề rộng, cao của hình chữ nhật vào vùng nhớ do bitmap trỏ char name[25]; tới. Vùng nhớ và biến bitmap cho bởi hàm malloc. Độ lớn của initgraph(&mh,&mode,""); vùng nhớ được xác định bằng hàm imagesize. settextstyle(TRIPLEX_FONT,HORIZ_DIR,3); 4. Hàm x=Lmargin; y=100; void putimage(int x,int y,void *bitmap,int copymode); text_write (&x,&y,"cho ten cua ban: ");
- dùng để sao ảnh lưu trong vùng nhớ bitmap ra màn hình tại vị trí // mới được cấp phát (x,y). Tham số copymode xác định kiểu sao chép ảnh, nó có thể getimage (10,20,30,40,p); nhận các giá trị sau: getch(); COPY_PUT = 0 Sao chép nguyên xi. cleardevice(); XOR_PUT = 1 Các điểm ảnh trong bitmap kết hợp với putimage (100,100,p,COPY_PUT); các getch(); điểm ảnh trên màn hình bằng phép XOR closegraph(); OR_PUT = 2 Các điểm ảnh trong bitmap kết hợp với } các điểm ảnh trên màn hình bằng phép OR 5. Tảo ảnh di động AND_PUT = 3 Các điểm ảnh trong bitmap kết hợp với Nguyên tắc tạo ảnh di động giống như phim hoạt hình: các - Vẽ một hình (trong chuỗi hình mô tả chuyển động) điểm ảnh trên màn hình bằng phép AND - Delay NOT_PUT = 4 ảnh xuất hiện trên màn hình theo dạng - Xoá hình đó đảo - Vẽ hình kế theo ngược (phép NOT) với ảnh trong bitmap. - Delay Nhận xét: Nếu dùng mode XOR_PUT để chép hình, rồi lặp lại ... 476 câu lệnh đó thì hình sẽ bị xoá và màn hình trở lại như cũ. Kỹ đúng 477 thuật này dùng để tạo lên các hình ảnh chuyển động. A) Vẽ hình Ví dụ 1: Chương trình dưới đây minh hoạ cách dùng imagesize, Cách 1: Vẽ lại một ảnh nhưng tại các vị trí khác nhau. malloc, getimage và putimage. Cách 2: Lưu ảnh vào một vùng nhớ rối đưa ảnh ra màn hình tại #include các vị trí khác nhau. #include main() B) Xóa ảnh { Cách 1: Dùng hàm cleardevice int mh=0,mode=0; Cách 2: Dùng hàm putimage (mode XOR_PUT) để xếp chồng char *p; lên ảnh cần xoá. unsigend size; Cách 3: Lưu trạng thái màn hình vào một chỗ nào đó. Vẽ một initgraph (&mh,&mode,""); hình ảnh. Đưa trạng thái cũ màn hình ra xếp đè lên ảnh vừa vẽ. bar(0,0,getmaxx(),getmaxy()); Kỹ thuật tạo ảnh di động được minh hoạ trong các chương size = imagesize(10,20,30,40); trình của §11. p=(char*)malloc(size); // p trỏ tới vùng nhớ size byte
- § 11. Một số chương trình đồ hoạ x[i]=random(getmaxx())-10; Chương trình 1: Đầu tiên vẽ bầu trời đầu sao. Sau đó từng y[i]=random(getmaxy())-10; chùm pháo hoa được bắn lên bầu trời. Khi bấm phím Enter thì việc if (x[i]
- Chương trình 2: Vẽ đồng hồ có 3 kim giờ, phút và giây. Đồng line(x0,y0,x,y); hồ chạy đúng theo giờ hệ thống. Muốn kết thúc chương trình bấm } Enter. // Hàm ke kim giay // Đồng hồ void ke_giay(unsigned giay) #include { #include int ddo; #include ddo = (90 - 6*giay); #include ke(ddo,rgiay,1,mgiay); // Hàm kẻ đoạn thẳng từ tâm đồng hồ theo độ, chiều dài, } // độ dầy và mầu // Hàm ke kim phut void ke(int ddo, unsigned dai, unsigned day,unsigned mau); void ke_phut(unsigned phut) // Kẻ kim giây khi biết số giây { void ke_giay(unsigned giay); int ddo; // Kẻ kim phút khi biết số phút ddo= (90-6*phut); ke(ddo,rphut,3,mphut); void ke_phut(unsigned phut); } // Kẻ kim giờ khi biết số giờ // Hàm ke kim gio void ke_gio(unsigned gio, unsigned phut); void ke_gio(unsigned gio, unsigned phut) void chay_kim_giay(void); void chay_kim_phut(void); { void chay_kim_gio(void); int ddo; int x0,y0,rgio,rphut,rgiay,mgio,mphut,mgiay; ddo = 360 + 90 - 30*(gio%12) - (phut+1)/2; unsigned phutgioht,gioht,phutht,giayht; ke(ddo,rgio,3,mgio); void ke(int ddo, unsigned dai, unsigned day,unsigned mau) } 480 // Hàm chỉnh giây hiện tại và làm chuyển động kim giây 481 { unsigned x,y; float goc; void chay_kim_giay(void) while (ddo>=360) ddo=ddo-360; { goc=(M_PI/180)*ddo; unsigned giay; struct time t; x=x0+ (int)(dai*cos(goc)+0.5); gettime(&t); y=y0- (int)(dai*sin(goc)+0.5); giay=t.ti_sec; setcolor(mau); setlinestyle(0,0,day);
- if (giay!=giayht) gio=t.ti_hour; phut=t.ti_min; { sophut = gio*60+phut; ke_giay(giayht); sophutht = gioht*60+phutgioht; giayht=giay; if ( sophut=12) { } ke_gio(gioht,phutgioht); // Hàm chỉnh phút hiện tại và làm chuyển động kim phút phutgioht=phut; void chay_kim_phut(void) gioht=gio; { ke_gio(gioht,phutgioht); unsigned phut; } struct time t; } gettime(&t); main() phut=t.ti_min; { if (phut!=phutht) struct time t; { char *dso[]={"", "12", "1", "2", "3", "4", "5", "6", "7", "8", "9", ke_phut(phutht); "10", "11"}; phutht=phut; int i,mh=0,mode=0,r,x,y; ke_phut(phutht); float goc; } initgraph(&mh,&mode,""); x0=(getmaxx()/2)-1; y0=(getmaxy()/2)-1; } r=y0-2; // Hàm chỉnh giờ phút hiện tại và làm chuyển động kim giờ 482void chay_kim_gio(void) rgiay = r-10; rphut=r-50; rgio=r-90; 483 mgiay= BROWN; mphut=RED; // mgio:=magenta; { mgio=YELLOW; unsigned h,gio,phut,sophut,sophutht; // Vẽ chu vi đồng hồ struct time t; setcolor(BLUE); setlinestyle(0,0,3); circle(x0,y0,r); gettime(&t);
CÓ THỂ BẠN MUỐN DOWNLOAD
-
GIÁO TRÌNH KỸ THUẬT ĐỒ HỌA - Học viện BCVT
173 p | 405 | 209
-
Bài tập lớn môn đồ hoạ máy tính
1 p | 862 | 167
-
Lập trình C trên Windows : Thư viện đồ họa GDI
37 p | 342 | 147
-
Giáo trình Lập Trình Đồ Họa Trên Java 2D Và 3D
577 p | 288 | 147
-
Lập trình C trên Windows: Thư viện đồ họa GDI (Graphics Device Interface)
37 p | 505 | 105
-
Đồ hoạ, đa phương tiện ( Mutilmedia) và In ấn Đồ họa phần 1
7 p | 160 | 55
-
Chương Mười Hai - Dùng Đồ Họa (Phần I)
25 p | 112 | 48
-
Tương tác người máy - Chương 6: Đồ họa thông tin
25 p | 132 | 47
-
Lập trình đồ họa trong C (phần 8)
50 p | 100 | 42
-
Chương 6 - Đồ họa và âm thanh
29 p | 73 | 23
-
Bài giảng Maple - Lập trình tính toán: Chương 4 - Đồ họa trong Matlab
35 p | 45 | 22
-
Bài giảng Chương 2: Lập trình giao diện đồ họa (TT) - Nguyễn Phúc Hào
25 p | 22 | 7
-
Card đồ họa hay đầu DVD dân dụng?
3 p | 34 | 6
-
Bài giảng Lập trình C nâng cao - Chương 4: Đồ họa máy tính
16 p | 15 | 4
-
Bài giảng Lập trình Windows: Chương 4 - Xử lý đồ họa & văn bản
13 p | 36 | 3
-
Bài giảng Chương 2: Lập trình giao diện đồ họa - Nguyễn Phúc Hào
17 p | 19 | 3
-
Bài giảng Lập trình Windows: Chương 4 - Lập trình đồ họa với thư viện GDI (Graphics Device Interface)
47 p | 24 | 2

markdown:
# Chương 8: Đồ họa
Chia sẻ: Men Men | Ngày: | Loại File: DOC | Số trang:24
lượt xem 40
download
![](http://image1.tailieu.vn/document/thumbnail/2010/20100526/tmaccounttemp1/80x100/chuong_8_6697.jpg)
##
Chương 8: Đồ họa
[Vui lòng tải xuống để xem tài liệu đầy đủ](javascript:void(0);)
Download
![](http://static1.tailieu.vn/b2013az/templates/version1/default/images/down16x21.png)
Tham khảo tài liệu 'chương 8: đồ họa', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
Bình luận(0)
[Đăng nhập để gửi bình luận!](javascript:void(0);)
##
Nội dung Text: Chương 8: Đồ họa
- Chương 8 SANS.CHR Đồ họa TRIP.CHR Trong chương này sẽ giới thiệu các hàm để vẽ các đường và Bảng 8-1. Các tệp tin điều khiển đồ họa của TURBO C++ hình cơ bản như đường tròn, cung elip, hình quạt, đường gẫy 446 447 Tên tệp tin Kiểu màn hình đồ họa khúc, hình đa giác, đường thẳng, đường chữ nhật, hình chữ nhật, hình hộp chữ nhật, ... Ngoài ra còn đề cập tới các vấn đề rất lý thú ATT.BGI ATT & T6300 (400 dòng) khác như: xử lý văn bản trên màn hình đồ họa, cửa sổ và kỹ thuật CGA.BGI IBMCGA, MCGA và các máy tương thích tạo ảnh di động. Các hàm đồ họa được khai báo trong tệp EGAVGA.BGI IBM EGA, VGA và các máy tương thích graphics.h. HERC.BGI Hercules monochrome và các máy tương thích IBM8514.BGI IBM 8514 và các máy tương thích § 1. Khái niệm đồ họa PC3270.BGI IBM 3270 PC Để hiểu kỹ thuật lập trình đồ họa, đầu tiên phải hiểu các yếu tố cơ bản của đồ họa. Từ trước đến nay chúng ta chủ yếu làm Màn hình đồ họa gồm nhiều điểm ảnh được sắp xếp trên các việc với kiểu văn bản. Nghĩa là màn hình được thiết lập để hiển đường thẳng ngang và dọc. Điều này đúng cho tất cả các kiểu màn thị 25 dòng, mỗi dòng có thể chứa 80 ký tự. Trong kiểu văn bản, hình đồ họa của máy tính. Khác biệt chủ yếu giữa chúng là kích các ký tự hiển thị trên màn hình đã được phần cứng của máy PC thước và số các điểm ảnh. Trong kiểu CGA (độ phân giải thấp), ấn định trước và ta không thể nào thay đổi được kích thước, kiểu điểm ảnh có kích thước lớn, chiều ngang có 320 điểm ảnh, còn chữ. theo chiều dọc có 200 điểm ảnh. Màn hình VGA có độ phân giải cao hơn: điểm ảnh nhỏ hơn, trên mỗi hàng có 640 điểm ảnh và ở màn hình đồ họa, ta có thể xử lý đến từng chấm điểm (pixel) trên mỗi cột có 480 điểm ảnh. Điểm ảnh càng nhỏ thì số điểm trên màn hình và do vậy muốn vẽ bất kỳ thứ gì cũng được. Sự bài ảnh trên màn hình càng nhiều và chất lượng đồ họa càng cao. trí và số pixel trên màn hình được gọi là độ phân giải (resolution). Do mỗi kiểu màn hình đồ họa có một cách xử lý đồ họa riêng nên Mỗi kiểu đồ họa dùng một hệ tọa độ riêng. Hệ tọa độ cho màn TURBO C cung cấp một tệp tin điều khiển riêng cho từng kiểu đồ hình VGA là 640 x 480 như sau : họa. Bảng 8-1 cho thấy các kiểu đồ họa và các tệp tin điều khiển (0,0) (639,0) chúng. Ngoài các tệp có đuôi BGI chứa chương trình điều khiển đồ họa, TURBO C còn cung cấp các tệp tin đuôi CHR chứa các Font chữ để vẽ các kiểu chữ khác nhau trên màn hình đồ họa. Đó là các tệp: GOTH.CHR LITT.CHR
- main() (0,479) (639,479) { Hình 8.1. Hệ tọa độ VGA int mh=EGA, mode= EGALO; Nhờ hệ tọa độ này, ta có thể tác động hay tham chiếu đến bất initgraph(&mh, &mode, "C:\TC"); kỳ điểm ảnh nào trên màn hình đồ họa. ... Nếu dùng màn hình CGA thì góc dưới phải có tọa độ (319, } 199). Độc lập với kiểu đồ họa đang sử dụng, các hàm getmaxx và Bảng 8-2. Các giá trị khả dĩ của graphdriver, graphmode 448 getmaxy bao giờ cũng cho tọa độ x và y lớn nhất trong kiểu đồ 449 họa đang dùng. graphdriver graphmode Độ phân giải Detect (0) Một chương trình đồ họa thường gồm các phần sau: CGA (1) CGAC0 (0) 320 x 200 - Khởi động hệ thống đồ họa. CGAC1 (1) 320 x 200 - Xác định mầu nền (mầu màn hình), mầu đường vẽ, mầu tô và CGAC2 (2) 320 x 200 kiểu (mẫu) tô. CGAC3 (3) 320 x 200 - Vẽ, tô mầu các hình mà ta mong muốn. CGAHi (4) 640 x 200 - Các thao tác đồ họa khác như cho hiện các dòng chữ... MCGA (2) MCGA0 (0) 320 x 200 - Đóng hệ thống đồ họa để trở về mode văn bản. MCGA1 (1) 320 x 200 MCGA2 (2) 320 x 200 § 2. Khởi động hệ đồ họa MCGA3 (3) 320 x 200 MCGAMed (4) 640 x 200 Mục đích của việc khởi động hệ thống đồ họa là xác định thiết MCGAHi (5) 640 x 480 bị đồ họa (màn hình) và mốt đồ họa sẽ sử dụng trong chương EGA (3) EGALO (0) 640 x 200 trình. Để làm điều này ta dùng hàm: EGAHi (1) 640 x 350 void initgraph(int *graphdriver, int *graphmode,char EGA64 (4) EGA64LO (0) 640 x 200 *driverpath); EGA64Hi (1) 640 x 350 trong đó: driverpath là đường dẫn của thư mục chứa các tệp tin EGAMONO (5) EGAMONOHi (0) 640 x 350 điều khiển đồ họa, graphdriver, graphmode cho biết màn hình và VGA (9) VGALO (0) 640 x 200 mốt đồ họa sẽ sử dụng trong chương trình. Bảng 8-2 cho thấy các VGAMED (1) 640 x 350 giá trị khả dĩ của graphdriver và graphmode. VGAHI (2) 640 x 480 Ví dụ 1. Giả sử máy tính của ta có màn hình EGA, các tệp tin HERCMONO (7) HERCMONOHI 720 x 348 đồ họa chứa trong thư mục C: \TC, khi đó ta có thể khởi động hệ ATT400 (8) ATT400C0 (0) 320 x 200 thống đồ họa như sau: ATT400C1 (1) 320 x 200 #include "graphics.h"
- ATT400C2 (2) 320 x 200 độ phân giải cao nhất, mà còn giúp ta xác định chính xác kiểu màn ATT400C3 (3) 320 x 200 hình đang sử dụng. ATT400MED (4) 640 x 400 Ví dụ 2. Chương trình dưới đây xác định kiểu màn hình đang sử ATT400HI (5) 640 x 400 dụng: PC3270 (10) PC3270HI (0) 720 x 350 #include "graphics.h" IBM8514 (6) IBM8514LO (0) 640 x 480, 256 mầu #include "stdio.h" IBM8514HI (1) 1024 x 768, 256 mầu main() { Chú ý 1. Bảng 8-2 cho các tên hằng và giá trị của chúng mà các int mh=0, mode= 0; biến graphdriver, graphmode có thể nhận. Chẳng hạn hằng DETECT có giá trị 0, hằng VGA có giá trị 9, hằng VGALO có giá initgraph(&mh, &mode, ""); trị 0... Khi lập trình ta có thể dùng tên hằng hoặc giá trị tương ứng 450 printf("\n Giá trị số của màn hình là: %d", mh); 451 của chúng. Chẳng hạn các phép gán trong ví dụ 1 có thể viết theo closegraph(); một cách khác tương đương như sau: } mh=3; mode=0; Nếu chương trình cho kết quả: Chú ý 2. Bảng 8.2 cho thấy độ phân giải phụ thuộc cả vào màn Giá trị số của màn hình là: 3 hình và mode. Ví dụ trong màn hình EGA nếu dùng mode EGALO thì ta có thể khẳng định loại màn hình đang dùng là EGA. thì độ phân giải là 640 x 200, hàm getmaxx cho giá trị 639, hàm Chú ý 4. Nếu chuỗi dùng để xác định driverpath là một chuỗi getmaxy cho giá trị 199 . Nếu cũng màn hình EGA mà dùng mode rỗng (như trong ví dụ 2) thì chương trình dịch sẽ tìm các tệp điều EGAHI thì độ phân giải là 640x 350, hàm getmaxx cho giá trị 639, khiển đồ họa trên thư mục chủ. hàm getmaxy cho giá trị 349. Chú ý 3. Nếu không biết chính xác kiểu màn hình đang sử dụng thì ta gán cho biến graphdriver hằng DETECT hay giá trị 0. Khi đó § 3. Lỗi đồ họa kết quả của hàm initgraph sẽ là: Khi khởi động hệ thống đồ họa nếu máy không tìm thấy các - Kiểu của màn hình đang sử dụng được phát hiện, giá trị số chương trình điều khiển đồ họa thì sẽ phát sinh lỗi đồ họa và việc của nó được gán cho biến graphdriver. khởi động coi như không thành. Lỗi đồ họa còn phát sinh khi dùng - Mode đồ họa ở độ phân giải cao nhất ứng với màn hình đang các hàm đồ hoạ. Trong mọi trường hợp, hàm graphresult cho biết sử dụng cũng được phát hiện và giá trị số của nó được gán cho có lỗi hay không lỗi và đó là lỗi gì. Bảng 8-3 cho các mã lỗi mà biến graphmode. hàm này phát hiện được. Ta có thể dùng hàm grapherrormsg với mã lỗi do hàm graphresult trả về để biết được đó là lỗi gì, ví dụ: Như vậy việc dùng hằng số DETECT chẳng những có thể khởi động được hệ thống đồ họa của màn hình hiện có theo mode có int maloi;
- maloi = graphresult(); Trong cả 3 trường hợp color xác định mã của mầu. Các giá trị printf("\nLỗi đồ họa là: %d", grapherrormsg(maloi)); khả dĩ của color cho trong bảng 8-4, pattern xác định mã của mẫu tô (xem bảng 8-5). Bảng 8-3. Các mã lỗi của Graphresult Mẫu tô và mầu tô sẽ được sử dụng trong các hàm pieslice, Hằng Trị Lỗi phát hiện fillpoly, bar, bar3d và floodfill (xem §5 dưới đây). grOk 0 Không có lỗi grNoInitGraph -1 Chưa khởi động hệ đồ họa 4. Chọn giải mầu grNotDetected -2 Không có phần cứng đồ họa Để thay đổi giải mầu đã được định nghĩa trong bảng 8.4 ta dùng hàm grFileNotFound -3 Không tìm thấy trình điều khiển đồ họa void setpalette(int colornum, int color); grInvalidDriver -4 Trình điều khiển không hợp lệ Ví dụ câu lệnh grNoLoadMem -5 Không đủ RAM cho đồ họa grNoScanMem -6 Vượt vùng RAM trong Scan fill setpalette(0, Lightcyan); grNoFloodMem -7 Vượt vùng RAM trong flood fill biến mầu đầu tiên trong bảng mầu thành xanh lơ nhạt. Các mầu 452 khác không bị ảnh hưởng. 453 grFontNoFound -8 Không tìm thấy tập tin Font Bảng 8-4. Các giá trị khả dĩ của color grNoFontMem -9 Không đủ RAM để nạp Font grInvalidMode -10 Kiểu đồ họa không hợp lệ cho trình điều khiển Tên hằng Giá trị số Mầu hiển thị grError -11 Lỗi đồ họa tổng quát BLACK 0 Đen grIOerror -12 Lỗi đồ họa vào ra BLUE 1 Xanh da trời grInvalidFont -13 Tập tin Font không hợp lệ GREEN 2 Xanh lá cây grInvalidFontNum -14 Số hiệu Font không hợp lệ CYAN 3 Xanh lơ RED 4 Đỏ MAGENTA 5 Tím § 4. Mầu và mẫu BROWN 6 Nâu 1. Để chọn mầu nền ta sử dụng hàm LIHGTGRAY 7 Xám nhạt void setbkcolor(int color); DARKGRAY 8 Xám sẫm 2. Để chọn mầu đường vẽ ta dùng hàm LIGHTBLUE 9 Xanh da trời nhạt void setcolor(int color); LIGHTGREEN 10 Xanh lá cây nhạt LIGHTCYAN 11 Xanh lơ nhạt 3. Để chọn mẫu (kiểu) tô và mầu tô ta dùng hàm LIGHTRED 12 Đỏ nhạt void setfillstyle(int pattern, int color); LIGHTMAGENTA 13 Tím nhạt
- YELLOW 14 Vàng 6. Hàm getcolor trả về mầu đã xác định trước đó bằng hàm WHITE 15 Trắng setcolor. 7. Hàm getbkcolor trả về mầu đã xác định trước đó bằng hàm 5. Để nhận giải mầu hiện hành ta dùng hàm setbkcolor. void getpalette (struct palettetype *palette); 8. Hàm getmaxcolor trả về mã mầu cực đại thuộc giải mầu hiện ở đây palettetype là kiểu đã định nghĩa trước như sau: đang có hiệu lực. Trên 256 K EGA, hàm getmaxcolor luôn cho giá #define MAXCOLORS 15 trị 15. struct palettetype § 5. Vẽ và tô mầu { unsigned char size; Có thể chia các đường và hình thành bốn nhóm chính: unsigned char colors[MAXCOLORS+1]; - Đường tròn và ellipse }; - Đường gấp khúc và hình đa giác ở đây: size là số lượng mầu trong palette, colors là mảng chứa - Đường thẳng mầu với chỉ số mảng chạy từ 0 đến size - 1 - Hình chữ nhật Bảng 8-5. Các giá trị khả dĩ của pattern 454 A. Đường tròn và hình tròn 455 Tên hằng Giá trị số Mô tả kiểu tô Nhóm này gồm cung tròn, đường tròn, cung ellipse và hình quạt. EMPTY_FILL 0 Tô bằng mầu nền 1. Cung tròn. Để vẽ một cung tròn ta dùng hàm SOLID_FILL 1 Tô bằng đường nét liền void arc(int x, int y, int gd, int gc, int r); LINE_FILL 2 Tô bằng - - - ở đây: LTSLASH_FILL 3 Tô bằng /// (x, y) là tọa độ của tâm cung tròn, SLASH_FILL 4 Tô bằng /// in đậm r là bán kính BKSLASH_FILL 5 Tô bằng \\\ in đậm gd là góc đầu LTBKSLASH_FILL 6 Tô bằng \\\ gc là góc cuối HATCH_FILL 7 Tô bằng đường gạch bóng nhạt Chú ý: Trong tất cả các hàm dưới đây, góc tính theo độ và có XHATCH_FILL 8 Tô bằng đường gạch bóng chữ giá trị từ 0 đến 360. thập INTERLEAVE_FILL 9 Tô bằng đường đứt quãng 2. Đường tròn. Để vẽ một đường tròn ta dùng hàm WIDE_DOT_FILL 10 Tô bằng dấu chấm thưa void circle(int x, int y, int r); CLOSE_DOT_FILL 11 Tô bằng dấu chấm mau ở đây:
- (x, y) là tọa độ của tâm; // Mầu nền Green, mầu đường vẽ r là bán kính đường tròn. //White, mầu tô Red, kiểu tô SlashFill 3. Cung ellipse. Để vẽ một cung Ellipse ta dùng hàm setbkcolor (GREEN); void ellipse(int x,int y,int gd,int gc,int xr,int yr); setcolor (WHITE); ở đây: setfillstyle (SLASH_FILL, RED); (x, y) là tọa độ của tâm cung Ellipse // Vẽ: một cung tròn ở góc phần tư thứ nhất, gd là góc đầu // một cung Ellipse ở góc phần tư thứ ba, gc là góc cuối // một đường tròn, một quạt tròn xr là bán trục ngang yr là bán trục đứng. arc(160, 50, 0, 90, 45); ellipse(480, 50, 180, 270, 150, 45); 4. Hình quạt. Để vẽ và tô màu một hình quạt ta dùng hàm circle(160, 150, 45); void pieslice(int x,int y,int gd,int gc,int r); pieslice(480, 150, 90, 360, 45); ở đây: (x,y) là tọa độ tâm hình quạt // Kết thúc chế độ đồ họa gd là góc đầu closegraph(); gc là góc cuối } r là bán kính B. Đường gấp khúc và đa giác 456 457 Ví dụ 1. Chương trình dưới đây sẽ vẽ: một cung tròn ở góc 5. Muốn vẽ một đường gấp khúc đi qua n điểm : (x1,y1), ... , phần tư thứ nhất, một cung ellipse ở góc phần tư thứ ba, một (xn,yn) thì trước hết ta phải đưa các tọa độ vào một mảng a nào đường tròn và một hình quạt quét từ 90 đến 360 độ. đó kiểu int. Nói một cách chính xác hơn, cần gán x1 cho a[0], y1 #include cho a[1], x2 cho a[2], y2 cho a[3],... Sau đó ta viết lời gọi hàm: main() drawpoly(n, a); { Khi điểm cuối (xn, yn) trùng với điểm đầu (x1, y1) ta nhận int mh, mode; được một đường gấp khúc khép kín. // Khởi động đồ họa, màn hình EGA, mode EGALO 6. Giả sử a là mảng đã nói trong điểm 5, khi đó lời gọi hàm mh=EGA; fillpoly(n, a); mode=EGALO; sẽ vẽ và tô mầu một đa giác có đỉnh là các điểm initgraph(&mh, &mode,""); (x1, y1), ... ,(xn, yn).
- Ví dụ 2. Chương trình dưới đây sẽ vẽ một đường gấp khúc và vẽ đường thẳng từ điểm hiện tại tới điểm (x, y) và chuyển con hai hình tam giác. chạy đến điểm (x, y). #include 9. Hàm // Xây dựng các mảng chứa tọa độ các đỉnh void linerel(int dx,int dy); int poly1[]={5,200,190,5,100,300}; vẽ một đường thẳng từ vị trí hiện tại (x, y) của con chạy đến int poly2[]={205,200,390,5,300,300}; điểm (x + dx,y + dy). Con chạy được di chuyển đến vị trí mới. int poly3[]={405,200,590,5,500,300,405,200}; 10. Hàm main() void moveto(int x,int y); { sẽ di chuyển con chạy tới vị trí (x, y). int mh=0, mode=0; Ví dụ 3. Chương trình dưới đây tạo lên một đường gấp khúc initgraph(&mh, &mode, ""); bằng các đoạn thẳng. Đường gấp khúc đi qua các đỉnh: (20, 20), // Mầu nền CYAN, mầu đường vẽ (620, 20), (620, 180), (20, 180) và (320, 100). // YELLOW, mầu tô MAGENTA, mẫu tô SolidFill #include setbkcolor (CYAN); Setcolor (YELLOW); main() setfillstyle (SOLID_FILL, MAGENTA); { drawpoly (3, poly1); // Đường gấp khúc int mh=0, mode=0; fillpoly (3, poly2); // Hình đa giác initgraph(&mh, &mode, ""); fillpoly(4, poly3); // Hình đa giác setbkcolor(GREEN); closegraph(); setcolor(YELLOW); moveto(320,100); } 458 459 line(20,20,620,20); C. Đường thẳng linerel(-300,80); lineto(620,180); 7. Hàm lineto(620,20); void line(int x1,int y1,int x2,int y2); closegraph(); vẽ đường thẳng nối hai điểm (x1, y1) và (x2, y2) nhưng không làm } thay đổi vị trí con chạy. D. Hình chữ nhật 8. Hàm void lineto(int x,int y); 11. Hàm
- void rectangle(int x1,int y1,int x2,int y2); setcolor(RED); sẽ vẽ một đường chữ nhật có các cạnh song song với các cạnh setfillstyle(CLOSE_DOT_FILL,YELLOW); của màn hình. Tọa độ đỉnh trên bên trái của hình chữ nhật là rectangle(5,5,300,160); (x1,y1) và điểm dưới bên phải là (x2,y2). bar(5,175,300,340); 12. Hàm bar3d(320,100,500,340,100,1); void bar(int x1,int y1,int x2,int y2); closegraph(); sẽ vẽ và tô mầu một hình chữ nhật. Các giá trị x1,y1,x2 và y2 có ý } nghĩa như đã nói trong điểm 11. 13. Hàm § 6. Chọn kiểu đường void bar3d(int x1,int y1,int x2,int y2,int depth,int top); 1. Hàm sẽ vẽ một khối hộp chữ nhật, mặt ngoài của nó là hình chữ nhật xác định bởi các tọa độ x1,y1,x2,y2 (như đã nói trong điểm 12). void setlinestyle(int linestyle,int pattern,int thickness); Hình chữ nhật này được tô mầu. Tham số depth ấn định số điểm tác động đến nét vẽ của các thủ tục line, lineto, rectange, ảnh trên bề sâu của khối 3 chiều. Tham số top có thể nhận trị 1 drawpoly, circle,... Hàm này cho phép ta ấn định 3 yếu tố của (TOPON) hay 0 (TOPOFF) và khối 3 chiều sẽ có nắp hay không đường thẳng là dạng, bề dầy và mẫu tự tạo. nắp (xem hình vẽ). + Dạng đường do tham số linestyle khống chế. Sau đây là các giá trị khả dĩ của linestyle và dạng đường thẳng tương ứng. SOLID_LINE = 0 Nét liền DOTTED_LINE = 1 Nét chấm CENTER_LINE = 2 Nét chấm gạch TOPON TOPOFF DASHED_LINE = 3 Nét gạch Ví dụ 4. Chương trình dưới đây sẽ vẽ một đường chữ nhật, USERBIT_LINE = 4 Mẫu tự tạo một hình chữ nhật và một khối hộp chữ nhật có nắp. + Bề dầy do tham số thickness khống chế. Giá trị này có thể là: 460 #include NORM_WIDTH = 1 Bề dầy bình thường 461 main() THICK_WIDTH = 3 Bề dầy gấp ba { + Mẫu tự tạo: Nếu tham số thứ nhất là USERBIT_LINE thì ta int mh=0, mode=0; có thể tạo ra mẫu đường thẳng bằng tham số pattern. Ví dụ xét initgraph(&mh, &mode, ""); đoạn chương trình: setbkcolor(GREEN); int pattern= 0x1010; setlinestyle(USERBIT_LINE, pattern, NORM_WIDTH);
- line(0,0,100,200); getlinesettings(kieu_cu); Giá trị của pattern trong hệ 16 là 0x1010 hay trong hệ 2 là // Thiết lập kiểu mới 0001 0000 0001 0000 setlinestyle(DOTTED_LINE,0,THICK_WIDTH); Chỗ nào có bit 1 điểm ảnh sẽ sáng, bit 0 làm tắt điểm ảnh. line(0,0,100,10); // Phục hồi kiểu cũ 2. Để nhận các giá trị hiện hành của 3 yếu tố trên ta dùng setlinestyle(kieu_cu.linestyle, hàm: kieu_cu.upattern, kieu_cu.thickness); void getlinesettings(struct linesettingstype *lineinfo); Line(0,20,100,20); với kiểu linesettingstype đã được định nghĩa trước như sau: getch(); struct linesettingstype closegraph(); { } int linestyle; 3. Hàm unsigned int upattern; void setwritemode( int writemode); int thickness; sẽ thiết lập kiểu thể hiện đường thẳng cho các hàm line, }; drawpoly, linerel, lineto, rectangle. Kiểu thể hiện do tham số Ví dụ 1. Chương trình dưới đây minh họa cách dùng các hàm writemode khống chế: setlinestyle và getlinesettings để vẽ đường thẳng. - Nếu writemode bằng COPY_PUT = 0, thì đường thẳng được // kiểu đường viết đè lên dòng đang có trên màn hình. #include - Nếu writemode bằng XOR_PUT = 1, thì mầu của đường #include thẳng định vẽ sẽ kết hợp với mầu của từng chấm điểm của main() đường hiện có trên màn hình theo phép toán XOR (chương 3, §3) { để tạo lên một đường thẳng mới. struct linesettingstype kieu_cu; Một ứng dụng của XOR_PUT là: Khi thiết lập kiểu writemode bằng XOR_PUT rồi vẽ lại đường thẳng cùng mầu thì sẽ xóa int mh=0, mode=0; đường thẳng cũ và khôi phục trạng thái của màn hình. initgraph(&mh, &mode, ""); Chương trình dưới đây minh họa cách dùng hàm setwritemode. if462 (graphresult!= grOk) exit(1); Khi thực hiện ta sẽ thấy hình chữ nhật thu nhỏ dần vào tâm màn 463 setbkcolor(GREEN); setcolor(RED); hình. line(0,0,100,0); Ví dụ 2: // Lưu lại kiểu hiện tại // Thu hình;
- #include void setviewport(int x1,int y1,int x2,int y2,int clip); #include trong đó (x1,y1) là tọa độ góc trên bên trái và (x2,y2) là tọa độ góc main() dưới bên phải. Bốn giá trị này phải thỏa mãn: { 0
- Nhờ sử dụng Viewport có thể viết các chương trình đồ họa if (graphresult!= grOk) exit(1); theo tọa độ âm dương. Muốn vậy ta thiết lập viewport sao cho tâm setviewport(getmaxx()/,getmaxy()/2, tuyệt đối của màn hình là góc trên bên trái của viewport và cho clip = 0 để có thể vẽ ra ngoài giới hạn của viewport. Sau đây là đoạn getmaxx(),getmaxy(), 0); chương trình thực hiện công việc trên // Kẻ hệ trục tọa độ int xc, yc; setcolor(BLUE); xc= getmaxx()/2; yc= getmaxy()/2; line(-(getmaxx()/2),0,getmaxx()/2,0); setviewport(xc, yc, getmaxx(), getmaxy(), 0); line(0,-(getmaxy()/2),0,getmaxy()/2); Như thế màn hình sẽ được chia làm 4 phần với tọa độ âm settextjustify(1,1); setcolor(RED); dương như sau: outtextxy(0,0,"(0,0)"); Phần tư trái trên: x âm, y âm for (i=-400;i
- if(i= -400) moveto(x,y); Sự hoạt động của hàm floodfill phụ thuộc vào giá trị của x,y, border và trạng thái màn hình. else lineto(x,y); 466 a) Khi trên màn hình có một đường (cong hoặc gấp khúc) khép 467 } kín mà mã mầu của nó bằng giá trị của border thì: getch(); + Miền giới hạn bởi đường kín sẽ được tô mầu nếu điểm gieo } (x,y) nằm bên trong miền này. + Nếu điểm gieo (x,y) nằm bên ngoài thì phần màn hình bên ngoài miền đóng nói trên được tô màu. § 8. Tô điểm, tô miền b) Khi trên màn hình không có một đường nào như vậy, thì cả 1. Hàm màn hình được tô màu. void putpixel(int x, int y, int color); Ví dụ 1. Chương trình dưới đây sẽ vẽ một đường tròn đỏ trên sẽ tô điểm (x,y) theo mầu xác định bởi color. màn hình xanh. Tọa độ (x,y) của điểm gieo được nạp vào từ bàn phím. Tùy thuộc vào giá trị cụ thể của x,y, chương trình sẽ tô mầu 2. Hàm vàng cho hình tròn hoặc phần màn hình bên ngoài hình tròn. unsigned getpixel(int x, int y); #include sẽ trả về số hiệu mầu của điểm ảnh ở vị trí (x,y). Chú ý: nếu #include điểm này chưa được tô mầu bởi các hàm vẽ hoặc putpixel (mà chỉ main() mới được tạo mầu nền bởi setbkcolor) thì hàm cho giá trị bằng 0. Vì vậy có thể dùng hàm này theo mẫu dưới đây để xác định các { nét vẽ trên màn hình đồ hoạ và vẽ ra giấy. int mh=0, mode=0, x, y; if (getpixel(x,y)!=0) initgraph(&mh, &mode, ""); { if (graphresult!= grOk) exit(1); // Điểm (x,y) được vẽ , đặt một chấm điểm ra giấy setbkcolor(GREEN); } setcolor(RED); 3. Tô miền setfillstyle(11,YELLOW); Để tô mầu cho một miền nào đó trên màn hình ta dùng hàm circle(320,100,50); void floodfill(int x, int y, int border); moveto(1,150); ở đây: outtext(" Toa do diem gieo x,y "); (x,y) là tọa độ của một điểm nào đó gọi là điểm gieo. scanf("%d%d",&x,&y); flooddfill(x,y,RED); tham số border chứa mã của một mầu. }
- { Ví dụ 2. Minh họa cách dùng hàm Putpixel và hàm getpixel để //Vẽ các chấm điểm một cách ngẫu nhiên vẽ các điểm ảnh và sau đó xóa các điểm ảnh. Muốn kết thúc srand(seed); chương trình bấm ESC. 468 i=0; 469 #include while(i
- } VERT_DIR = 1 } // Kết thúc hàm putpixelplay Nếu direction là HORIZ_DIR, văn bản sẽ hiển thị theo hướng nằm ngang từ trái sang phải. Nếu direction là VERT_DIR, văn bản sẽ hiển thị theo chiều đứng từ dưới lên trên. Đối charsize là hệ số phóng to ký tự và có giá trị trong khoảng 470 § 9. Xử lý văn bản trên màn hình đồ hoạ 471 từ 1 đến 10. 1. Hiển thị văn bản trên màn hình đồ hoạ - Nếu charsize = 1, ký tự được thể hiện trong hình chữ nhật 8*8 pixel. Hàm - Nếu charsize = 2, ký tự được thể hiện trong hình chữ nhật void outtext (char *s); 16*16 pixel. sẽ hiện chuỗi ký tự (do s trỏ tới) tại vị trí hiện tại của con trỏ. ... Hàm - Nếu charsize = 10, ký tự được thể hiện trong hình chữ nhật void outtextxy(int x,int y,char *s); 80*80 pixel. sẽ hiện chuỗi ký tự (do s trỏ tới) tại ví trí (x,y). Cuối cùng là tham số font để chọn kiểu chữ và nhận một trong Ví dụ 1: Hai cách sau đây sẽ cho cùng kết quả các hằng sau: outtextxy (100,100," chao ban "); DEFAULT_FONT = 0 và TRIPLEX_FONT = 1 moveto (100,100); SMALL_FONT = 2 outtext (" chao ban "); SANS_SERIF_FONT = 3 Chú ý: Trong mốt đồ họa vẫn cho phép dùng hàm nhập dữ liệu GOTHIC_FONT = 4 scanf và các hàm bắt phím getch, kbhit. Các giá trị do settextstyle thiết lập sẽ dữ nguyên cho đến khi gọi 2. Fonts một settextstyle mới. Như đã nói ở trên: Các Fonts nằm trong các tệp tin .CHR trên Ví dụ 2: đĩa. Các Font này cho các kích thước và kiểu chữ khác nhau sẽ settextstyle (3,VERT_DIR,2); hiện thị trên màn hình đồ hoạ bằng outtext hay outtextxy. Để chọn và nạp Font chúng ta dùng hàm: outtextxy (50,50," HELLO "); void settextstyle(int font,int direction,int charsize); 3. Vị trí hiển thị (Chú ý: hàm chỉ có tác dụng nếu tồn tại các tệp .CHR) Hàm settextjustify cho phép ấn định nơi hiển thị văn bản của Với direction là một trong hai hằng số: outtext theo quan hệ với vị trí hiện tại của con chạy hay của HORIZ_DIR = 0 outtextxy theo quan hệ với toạ độ (x,y).
- Hàm này có dạng settextjustify(0,0); void settextjustify(int horiz, int vert); for (size=1; size
- void text_writeln(int *x,int *y,char *s) text_read (&x,&y,name); { text_writeln (&x,&y,"" ); outtextxy(*x,*y,s); text_write(&x,&y,"chao ban "); *x=Lmargin; text_write(&x,&y,name); *y += textheight(s)+5; getch(); } closegraph(); void text_read(int *x,int *y,char *s) } { int i=0; char ch[2]; ch[1]=0; 474 § 10. Cắt hình, Dán hình và Tạo ảnh chuyển động 475 while(1) { 1. Hàm ch[0]=getch(); unsigned imagesize(int x1,int y1,int x2,int y2) trả về số byte cần thiết để lưu trữ ảnh trong phạm vi hình chữ if(ch[0]==Enter) break; nhật (x1,y1,x2,y2). text_write(x,y,ch); s[i]=ch[0]; ++i; 2. Hàm } #include void *malloc(unsigned n); s[i]=0; trả về con trỏ trỏ tới một vùng nhớ n byte mới được cấp phát. } main() 3. Hàm { void getimage(int x1,int y1,int x2,int y2,void *bitmap); int mh=0,mode=0,x,y,xmax,ymax; sẽ chép các điểm ảnh của hình chữ nhật (x1,y1,x2,y2) và các thông tin về bề rộng, cao của hình chữ nhật vào vùng nhớ do bitmap trỏ char name[25]; tới. Vùng nhớ và biến bitmap cho bởi hàm malloc. Độ lớn của initgraph(&mh,&mode,""); vùng nhớ được xác định bằng hàm imagesize. settextstyle(TRIPLEX_FONT,HORIZ_DIR,3); 4. Hàm x=Lmargin; y=100; void putimage(int x,int y,void *bitmap,int copymode); text_write (&x,&y,"cho ten cua ban: ");
- dùng để sao ảnh lưu trong vùng nhớ bitmap ra màn hình tại vị trí // mới được cấp phát (x,y). Tham số copymode xác định kiểu sao chép ảnh, nó có thể getimage (10,20,30,40,p); nhận các giá trị sau: getch(); COPY_PUT = 0 Sao chép nguyên xi. cleardevice(); XOR_PUT = 1 Các điểm ảnh trong bitmap kết hợp với putimage (100,100,p,COPY_PUT); các getch(); điểm ảnh trên màn hình bằng phép XOR closegraph(); OR_PUT = 2 Các điểm ảnh trong bitmap kết hợp với } các điểm ảnh trên màn hình bằng phép OR 5. Tảo ảnh di động AND_PUT = 3 Các điểm ảnh trong bitmap kết hợp với Nguyên tắc tạo ảnh di động giống như phim hoạt hình: các - Vẽ một hình (trong chuỗi hình mô tả chuyển động) điểm ảnh trên màn hình bằng phép AND - Delay NOT_PUT = 4 ảnh xuất hiện trên màn hình theo dạng - Xoá hình đó đảo - Vẽ hình kế theo ngược (phép NOT) với ảnh trong bitmap. - Delay Nhận xét: Nếu dùng mode XOR_PUT để chép hình, rồi lặp lại ... 476 câu lệnh đó thì hình sẽ bị xoá và màn hình trở lại như cũ. Kỹ đúng 477 thuật này dùng để tạo lên các hình ảnh chuyển động. A) Vẽ hình Ví dụ 1: Chương trình dưới đây minh hoạ cách dùng imagesize, Cách 1: Vẽ lại một ảnh nhưng tại các vị trí khác nhau. malloc, getimage và putimage. Cách 2: Lưu ảnh vào một vùng nhớ rối đưa ảnh ra màn hình tại #include các vị trí khác nhau. #include main() B) Xóa ảnh { Cách 1: Dùng hàm cleardevice int mh=0,mode=0; Cách 2: Dùng hàm putimage (mode XOR_PUT) để xếp chồng char *p; lên ảnh cần xoá. unsigend size; Cách 3: Lưu trạng thái màn hình vào một chỗ nào đó. Vẽ một initgraph (&mh,&mode,""); hình ảnh. Đưa trạng thái cũ màn hình ra xếp đè lên ảnh vừa vẽ. bar(0,0,getmaxx(),getmaxy()); Kỹ thuật tạo ảnh di động được minh hoạ trong các chương size = imagesize(10,20,30,40); trình của §11. p=(char*)malloc(size); // p trỏ tới vùng nhớ size byte
- § 11. Một số chương trình đồ hoạ x[i]=random(getmaxx())-10; Chương trình 1: Đầu tiên vẽ bầu trời đầu sao. Sau đó từng y[i]=random(getmaxy())-10; chùm pháo hoa được bắn lên bầu trời. Khi bấm phím Enter thì việc if (x[i]
- Chương trình 2: Vẽ đồng hồ có 3 kim giờ, phút và giây. Đồng line(x0,y0,x,y); hồ chạy đúng theo giờ hệ thống. Muốn kết thúc chương trình bấm } Enter. // Hàm ke kim giay // Đồng hồ void ke_giay(unsigned giay) #include { #include int ddo; #include ddo = (90 - 6*giay); #include ke(ddo,rgiay,1,mgiay); // Hàm kẻ đoạn thẳng từ tâm đồng hồ theo độ, chiều dài, } // độ dầy và mầu // Hàm ke kim phut void ke(int ddo, unsigned dai, unsigned day,unsigned mau); void ke_phut(unsigned phut) // Kẻ kim giây khi biết số giây { void ke_giay(unsigned giay); int ddo; // Kẻ kim phút khi biết số phút ddo= (90-6*phut); ke(ddo,rphut,3,mphut); void ke_phut(unsigned phut); } // Kẻ kim giờ khi biết số giờ // Hàm ke kim gio void ke_gio(unsigned gio, unsigned phut); void ke_gio(unsigned gio, unsigned phut) void chay_kim_giay(void); void chay_kim_phut(void); { void chay_kim_gio(void); int ddo; int x0,y0,rgio,rphut,rgiay,mgio,mphut,mgiay; ddo = 360 + 90 - 30*(gio%12) - (phut+1)/2; unsigned phutgioht,gioht,phutht,giayht; ke(ddo,rgio,3,mgio); void ke(int ddo, unsigned dai, unsigned day,unsigned mau) } 480 // Hàm chỉnh giây hiện tại và làm chuyển động kim giây 481 { unsigned x,y; float goc; void chay_kim_giay(void) while (ddo>=360) ddo=ddo-360; { goc=(M_PI/180)*ddo; unsigned giay; struct time t; x=x0+ (int)(dai*cos(goc)+0.5); gettime(&t); y=y0- (int)(dai*sin(goc)+0.5); giay=t.ti_sec; setcolor(mau); setlinestyle(0,0,day);
- if (giay!=giayht) gio=t.ti_hour; phut=t.ti_min; { sophut = gio*60+phut; ke_giay(giayht); sophutht = gioht*60+phutgioht; giayht=giay; if ( sophut=12) { } ke_gio(gioht,phutgioht); // Hàm chỉnh phút hiện tại và làm chuyển động kim phút phutgioht=phut; void chay_kim_phut(void) gioht=gio; { ke_gio(gioht,phutgioht); unsigned phut; } struct time t; } gettime(&t); main() phut=t.ti_min; { if (phut!=phutht) struct time t; { char *dso[]={"", "12", "1", "2", "3", "4", "5", "6", "7", "8", "9", ke_phut(phutht); "10", "11"}; phutht=phut; int i,mh=0,mode=0,r,x,y; ke_phut(phutht); float goc; } initgraph(&mh,&mode,""); x0=(getmaxx()/2)-1; y0=(getmaxy()/2)-1; } r=y0-2; // Hàm chỉnh giờ phút hiện tại và làm chuyển động kim giờ 482void chay_kim_gio(void) rgiay = r-10; rphut=r-50; rgio=r-90; 483 mgiay= BROWN; mphut=RED; // mgio:=magenta; { mgio=YELLOW; unsigned h,gio,phut,sophut,sophutht; // Vẽ chu vi đồng hồ struct time t; setcolor(BLUE); setlinestyle(0,0,3); circle(x0,y0,r); gettime(&t);
CÓ THỂ BẠN MUỐN DOWNLOAD
-
GIÁO TRÌNH KỸ THUẬT ĐỒ HỌA - Học viện BCVT
173 p |
405 |
209
-
Bài tập lớn môn đồ hoạ máy tính
1 p |
862 |
167
-
Lập trình C trên Windows : Thư viện đồ họa GDI
37 p |
342 |
147
-
Giáo trình Lập Trình Đồ Họa Trên Java 2D Và 3D
577 p |
288 |
147
-
Lập trình C trên Windows: Thư viện đồ họa GDI (Graphics Device Interface)
37 p |
505 |
105
-
Đồ hoạ, đa phương tiện ( Mutilmedia) và In ấn Đồ họa phần 1
7 p |
160 |
55
-
Chương Mười Hai - Dùng Đồ Họa (Phần I)
25 p |
112 |
48
-
Tương tác người máy - Chương 6: Đồ họa thông tin
25 p |
132 |
47
-
Lập trình đồ họa trong C (phần 8)
50 p |
100 |
42
-
Chương 6 - Đồ họa và âm thanh
29 p |
73 |
23
-
Bài giảng Maple - Lập trình tính toán: Chương 4 - Đồ họa trong Matlab
35 p |
45 |
22
-
Bài giảng Chương 2: Lập trình giao diện đồ họa (TT) - Nguyễn Phúc Hào
25 p |
22 |
7
-
Card đồ họa hay đầu DVD dân dụng?
3 p |
34 |
6
-
Bài giảng Lập trình C nâng cao - Chương 4: Đồ họa máy tính
16 p |
15 |
4
-
Bài giảng Lập trình Windows: Chương 4 - Xử lý đồ họa & văn bản
13 p |
36 |
3
-
Bài giảng Chương 2: Lập trình giao diện đồ họa - Nguyễn Phúc Hào
17 p |
19 |
3
-
Bài giảng Lập trình Windows: Chương 4 - Lập trình đồ họa với thư viện GDI (Graphics Device Interface)
47 p |
24 |
2

Set-Cookie: TLDEVNamespace=for4jtt7cqg557m025ut5254c7; path=/; domain=.tailieu.vn; HttpOnly


text:
Chuyện cô bé 16 tuổi làm cảm động cả trời đất
Chia sẻ: Nguyễn Thị Hoàng Hạ | Ngày: | Loại File: DOC | Số trang:7
lượt xem 72
download
Chuyện cô bé 16 tuổi làm cảm động cả trời đất
Chuyện cô bé 16 tuổi làm cảm động cả trời đất TP - Ngày 24/8/1998, một đám tang vô cùng đặc biệt được tổ chức tại huyện Gia Tường, tỉnh Sơn Đông (Trung Quốc). Người chết là một cô gái mới 16 tuổi trên là Thẩm Xuân Linh.
Bình luận(1) Đăng nhập để gửi bình luận!
Nội dung Text: Chuyện cô bé 16 tuổi làm cảm động cả trời đất
- Chuyện cô bé 16 tuổi làm cảm động cả trời đất TP - Ngày 24/8/1998, một đám tang vô cùng đặc biệt được tổ chức tại huyện Gia Tường, tỉnh Sơn Đông (Trung Quốc). Người chết là một cô gái mới 16 tuổi trên là Thẩm Xuân Linh. Nhưng cô được nhận những nghi lễ long trọng nhất của làng, những người anh trai của cô mặc tấm áo tang chỉ được mặc khi đưa tang cha đẻ. Anh trai cô quỳ rất lâu trước linh cữu em gái, người trong làng ai cũng đeo băng tang. Nhưng không ai biết rằng, cô gái mười sáu tuổi này thực ra không hề có máu mủ ruột thịt gì với những người còn sống, cũng như với dân làng này, thậm chí cô chỉ là một đứa con gái riêng của mẹ kế mà ngay cả tên trong sổ hộ khẩu của làng cũng không có. Tôi là con ruột của gia đình này Tháng 6 năm 1994, mẹ của Thái Xuân Linh góa chồng, đem Xuân Linh và đứa em trai từ Long Châu Tập, huyện Phạm Trạch, tỉnh Sơn Đông (TQ) sang huyện Gia Tường với gia đình mới. Bố dượng của Xuân Linh làm nghề thợ mộc, tên là Thẩm Thụ Bình, tính tình hiền lành đôn hậu. Bố dượng có cha mẹ già 70 tuổi, và bốn đứa con trai còn đang đi học. Trong đó anh con cả Thẩm Kiến Quốc đang học Đại học Giao thông ở Tây An. Ba cậu con trai còn lại học trường phổ thông trong huyện. Gánh nặng gia đình quá lớn, nhưng bố dượng cô giỏi nghề thợ mộc, trong nhà cũng chỉ chi tiêu dè sẻn, nên cuộc sống gia đình cũng tạm đủ. Khi ba mẹ con Thái Xuân Linh gia nhập đại gia đình ấy, cả nhà đều vui vẻ chào đón, hay có thể bởi nhà toàn đàn ông, giờ có một cô em gái mới, cả ông bà nội lẫn bố dượng đều rất yêu quý Xuân Linh. Khi đó, Linh chỉ vì bố mất, nhà nghèo khó, cô đành bỏ học ở nhà. Bố dượng dứt khoát đưa tiền cho cô đi học trở lại. Trong nhà vốn đã bốn đứa con đi học, giờ thêm Xuân Linh, gánh nặng càng lớn. Ông bố dượng chỉ có cách dành thời gian làm thêm lúc nông nhàn mới đủ cho chi tiêu trong gia đình. Xuân Linh vô cùng trân trọng cơ hội được đi học, ngay học kỳ đầu tiên quay lại trường, cô đứng thứ ba trong khối. Ngoài học tập, cô lo liệu việc nhà, lúc nào rảnh rỗi thì giặt quần áo cho các anh, vác gỗ cho bố dượng, ông bố dượng thường khen ngợi:
- - Bố thật là có phúc mới có đứa con gái ngoan ngoãn thế này. Thời gian hạnh phúc chẳng bao lâu, đầu mùa hạ năm 1995, bố dượng cô trong lúc làm công trình đã ngã từ tầng ba xuống, bị liệt giường. Cột trụ trong gia đình đã gẫy, nguồn kinh tế chính của gia đình bị cắt đứt, và tiền chữa bệnh của bố dượng cô đã mang lại một khoản nợ rất lớn cho gia đình. Thật đáng tiếc, khi mẹ Xuân Linh được bác sĩ cho biết, bệnh của chồng mới sẽ không bao giờ khỏi, cả đời nằm liệt giường, mẹ cô đã rất đau khổ. Bà không thể chịu đựng nổi sự rủi ro liên tiếp từ hai đời chồng, lại biết không gánh vác được một gánh nặng quá lớn từ gia đình chồng, mất hết hy vọng và niềm tin vào cuộc sống. Bà ôm đứa con trai nhỏ ra đi, bỏ lại một nhà đầy người già, bệnh tật, trẻ con cho dù Xuân Linh năn nỉ, cầu xin mẹ như thế nào. Thấy bố như thế, người con trai thứ hai định xin nhập ngũ, ông bố không đồng ý bởi anh thứ hai và thứ ba sắp cùng thi tốt nghiệp phổ thông, thành tích luôn đứng đầu trường. Người con thứ ba cũng đòi bỏ học, muốn đi làm để gánh vác gia đình. Vào lúc cả nhà bàn cãi, Xuân Linh đề nghị cho em nghỉ học, thay mẹ chèo chống gia đình này. Bố dượng cô rơi nước mắt, ngay cả ông bà nội cũng khóc. Bố dượng cô đau khổ nói: - Xuân Linh, bố xin lỗi con! Các anh con đã học chừng đó năm rồi, giờ bỏ đi uổng phí quá, bố biết là làm thế con sẽ thiệt thòi Ba người anh trai đều nắm chặt tay em gái, cùng thề với bố, cho dù sau này ai thi đỗ đại học, cũng đều nhớ công người em gái. Mẹ Xuân Linh bỏ đi, nguồn kinh tế của gia đình lại mất hẳn chút hỗ trợ cuối cùng. Ông bà nội đều thở dài, bố dượng gạt nước mắt, các anh trai Xuân Linh cũng lo âu, cả nhà rơi vào tình trạng thấp thỏm bất an, buồn thảm. Những người làng an ủi cô bé: - Ở đây cháu không có người thân, hay là cháu quay về nhà ông bà ở bên Phạm Trạch đi! - Không, cháu không đi được, mẹ cháu bỏ đi rồi cháu không thể cũng bỏ đi nốt! Xuân Linh nói với bố dượng: - Bố ạ, mẹ con bỏ đi rồi, là mẹ con nhẫn tâm; nhưng con hứa con không bao giờ bỏ nhà đi, con sẽ ở lại đây cùng vượt qua hoạn nạn với mọi người, từ hôm nay con xin được là con đẻ của bố! Năm đó, Xuân Linh mới 12 tuổi, đổi từ họ Thái sang họ Thẩm. Làm đồng, việc nhà, chăm sóc người lớn, tất cả mọi việc Xuân Linh đều gánh vác, cô bé làm việc như một phụ nữ thực thụ trong một gia đình nông dân, thức dậy lúc mặt trời mọc, trời tối hẳn mới nghỉ ngơi, cẩn trọng tính toán từng món một trong gia đình để lo liệu qua ngày. Xuân Linh biết, để gia cảnh đỡ khó, thì sức khỏe của bố phải tốt lên, cho nên vào những lúc nông nhàn, cô bé không quên chăm sóc chu đáo cho bố. Mùa hè năm 1996, thời tiết nóng bức, bệnh tình bố dượng cô nặng lên, Xuân Linh quyết định đưa bố lên nằm viện trên thành phố Tề Ninh. Thu xếp xong việc nhà, cô kéo bố lên thành phố chữa bệnh. Đường đất 80 km, cô kéo xe hết đúng hai ngày một đêm. Khi đến nơi, chân cô đã lở ra, vai kéo sưng u lên một cục lớn.
- Để tiết kiệm tiền, Xuân Linh đã ngủ trong nhà để xe đạp của bệnh viện, người trông xe tưởng cô là ăn mày, đã mấy lần xua cô ra ngoài. Xuân Linh đành kể hết sự tình, ông già trông xe cảm động quá, không chỉ cho cô mang chiếc xe kéo đặt vào tận bên trong nhà xe, còn kiếm cho cô một cái màn chống muỗi. Dưới sự chăm sóc của con gái nhỏ, bệnh của bố dượng cô dần ổn định hơn, cô lại kéo bố về quê trên chiếc xe ấy. Vừa về đến quê, là vào vụ thu hoạch lúa mạch, các anh đều đang ở trường, ông bà nội chỉ có thể giúp cô nấu cơm và bó những túm lúa, thế là hơn bảy mẫu đất lúa mạch đang chín, lại một mình Xuân Linh cắt. Để kịp thu hoạch, suốt mấy ngày liên tục cô bé ngủ lại ngoài ruộng lúa, mệt tới mức không chống đỡ nổi nữa thì nằm ngủ luôn trên lúa mạch, ngủ dậy lại cắt tiếp. Vì quá lo lắng, lại vì lao lực, miệng Xuân Linh nở những mụn nước nhỏ, tay chân xước máu. Thật sự cô bé đã kiệt sức, còn lại hai mẫu lúa mạch nữa. Đều là lương thực gia đình trông vào đó! Cô bé bất lực đứng giữa ruộng lúa mạch khóc nức nở không thành tiếng, khóc tới mức hàng xóm chung quanh thấy thương hại quá, bèn tới năm tay mười tay giúp cô gặt nốt mảnh ruộng. Đợt thu hoạch khó nhọc đó đổi lại được lương thực đủ ăn cho cả gia đình. Anh thứ hai đã đỗ kết quả rất cao trong kỳ thi tốt nghiệp trung học, nhờ kết quả đó, anh được tuyển vào trường đại học Đồng Tề ở tận Thượng Hải. Cầm giấy báo nhập học của anh thứ hai, Xuân Linh chạy như bay về nhà quên hết mệt nhọc, nhảy lên vui sướng. Nhìn đứa em gái vừa bé vừa đen, người anh thứ ba là Thẩm Kiến Văn rớt nước mắt tủi thân vì thi trượt đại học. Thẩm Kiến Văn buồn rầu nói: - Anh xin lỗi, em đã vất vả vì cả gia đình, mà anh lại thi trượt! Vừa nói anh ba vừa khóc. Xuân Linh hốt hoảng nắm lấy tay anh: - Năm nay thi trượt thì năm sau thi tiếp, anh đừng nản chí như thế! Thẩm Kiến Văn quyết định không thi đại học nữa, ở nhà kiếm sống giúp em gái. Xuân Linh không đồng tình: - Em chịu vất vả cũng chỉ vì muốn các anh học lên đại học mà thôi! Anh thất bại là em cũng thất bại! Ba nghìn Nhân dân tệ học phí là gánh nặng quá lớn với cả gia đình. Vào lúc bất lực ấy, Thẩm Xuân Linh nghĩ đến chuyện đi bán máu. Lần thứ nhất đến nơi bán máu, vì quá nhỏ tuổi, bác sĩ không đồng ý! Lần thứ hai, cô nói dối tuổi mình, cuối cùng được bán 200 ml máu. Cầm được 400 tệ tiền bán máu, nỗi buồn bã của cô vẫn không bớt đi. Vì 400 tệ so với 3.000 tệ thì còn quá ít ỏi. Như cốc nước hắt vào đống lửa, chả thấm vào đâu. Ba ngày sau, cô quay trở lại trạm y tế. Lần này, nói kiểu gì bác sĩ cũng quyết không lấy máu của Xuân Linh. Quá lo lắng, cô đành quỳ xuống cầu xin bác sĩ, và kể cho ông biết lý do. Bác sĩ trầm ngâm rất lâu, cuối cùng ông thở dài bảo: - Thôi được, chỉ một lần này thôi nhé! Lần sau cháu đừng đến đây nữa, cháu còn quá nhỏ, cơ thể còn đang phải lớn nữa! Ông bác sĩ chỉ rút một lượng máu rất nhỏ tượng trưng, rồi móc túi ra đưa cho cô 700 tệ, làm Xuân Linh vô cùng cảm động. Về nhà, Xuân Linh đưa tiền cho bố dượng, bố vội hỏi tiền ở đâu ra mà nhiều thế này, cô nói dối là đi vay người ta.
- Bố cô cầm tay con xem xét, lại móc từ túi cô ra hai tờ giấy bán máu. Cả nhà cô đều kinh hãi. Nhưng số tiền đó còn lâu mới đủ được, dù chỉ một nửa học phí cho người anh. Bố dượng cô quyết định bán đi một phần mảnh đất từ ngôi nhà cũ của họ, ông bà nội cũng bán ba cây dương vốn định dành gỗ để đóng quan tài cho ông bà sau này. Khi bố dượng không đồng ý bán ba cây dương, ông bà nói: - Máu của Xuân Linh còn không tiếc, chúng tôi còn cần quan tài để làm gì nữa! Dưới sự nỗ lực của toàn gia đình, tiền học cho anh hai, anh ba cuối cùng đã thu xếp xong. Để anh Thẩm Tiến Quân có thứ để lên trường, suốt mấy tối liền Xuân Linh thức khuya khâu vỏ chăn mới và giầy vải cho anh. Vào lúc lên đường, Xuân Linh ra bến xe tiễn anh, cô nói: - Anh ạ, nhà mình tuy nghèo, nhưng khảng khái, anh phải học cho ra học, anh đừng lo lắng chuyện ở nhà, cũng đừng tự khắc nghiệt với bản thân mình quá, anh cần tiền tiêu cứ viết thư về cho nhà nhé, em sẽ lo cho anh! Thẩm Tiến Quân không nén được, ôm lấy đứa em nhỏ vào lòng, cảm động trào nước mắt. Có thể bỏ rơi cha, không được phép bỏ rơi em Những người anh lên đường đi học rồi, Xuân Linh bắt đầu tính toán xem làm cách nào kiếm tiền để chữa bệnh cho bố, lo học phí cho các anh trai. Ban đầu, cô định theo chân các chị trong làng ra ngoài đi làm kiếm tiền, nhưng ở nhà còn hai người già và một người bệnh đều cần chăm sóc, cô chỉ có thể ở lại. Cân nhắc kỹ, cô quyết định trồng bông. Trồng bông không giống như trồng những cây khác, không chỉ phí sức trồng trọt, ngay khoản phun thuốc sâu cho bông cũng rất nguy hiểm, nhưng Xuân Linh tính nhẩm ra, một năm trồng bông có thể thu lãi được 8-9 nghìn Nhân dân tệ (16-18 triệu VND), cô không trù trừ bắt tay vào làm ngay. Cô háo hức trồng xuống cây bông, nhưng chẳng mấy lâu, khu vực Lỗ Tây Nam (mấy huyện thuộc Sơn Đông) gặp dịch sâu xanh trên lá bông (Helicoverpa armigera) tràn tới, vụ dịch làm Xuân Linh cuống quýt, cô bé người còn chưa cao bằng ngọn cây bông đã cõng bình xịt thuốc sâu nặng hơn 20kg sau lưng đi dọc ruộng bông để xịt thuốc. Cô nghe người ta nói, lúc chính ngọ thời tiết nóng nực nhất, là lúc trừ sâu có hiệu quả lớn nhất. Cô liền chọn lúc giữa trưa nắng to đi phun thuốc sâu, mặt trời rát bỏng trút nóng xuống cánh đồng bông hầm hập như một lò hấp khí nóng, làm Xuân Linh không thở nổi. Cô chỉ có thể chạy phun một hàng rồi chạy ra hít thở không khí. Một ngày vào lúc chính ngọ, vì thùng thuốc sâu bị rò chảy, cô trúng độc, ngất đi. Người làng khiêng Xuân Linh về. Lúc tỉnh lại, cô không để ý đến sự ngăn cản của người bố nằm liệt giường, lại đòi chạy ra ruộng bông luôn. Năm đó, bông được mùa thu hoạch lớn, nhưng vì thế mà giá thu mua bị dìm xuống rất thấp, và Xuân Linh vẫn không thể kiếm được khoản tiền như cô mong muốn. Đầu óc thông minh của Xuân Linh lại suy tính, cô đang nghĩ có cách nào kiếm được tiền nhanh nhất. Lúc nông nhàn, cô đã từng theo người làng đi thu mua hoa hòe, cành liễu (dùng như sợi bàng, sợi chiếu cói của VN), cũng từng đi bán mũ nan, đậu tương. Sau này, cô nghe người ta nói táo Tứ Thủy ở huyện bên rất rẻ, cô lại cùng ông bác trong làng đi Tứ Thủy buôn táo.
- Hàng ngày, sau bữa tối, cô kéo xe kéo lên đường, lúc trời hơi rạng thì tới được vườn táo, chất đầy xe táo rồi quay về ngay. Đàn ông thanh niên kéo một xe, cô cũng kéo một xe. Dọc đường, người ta đều ăn táo giải khát, cô thì chưa từng ăn một quả táo nào, ngay cả những quả dập nát cũng giữ lại phần bố, cho ông bà ăn. Anh thứ tư Thẩm Kiến Hoa thấy đứa em 14 tuổi vất vả như thế, quá áy náy, quyết định bỏ học và cũng trốn nghĩa vụ quân sự, ở nhà kiếm sống thay em. Xuân Linh khuyên anh thế này: - Em hâm mộ nhất trên đời này là quân nhân, anh ở nhà rồi sau này anh sẽ ra sao? Anh cứ đi đi, em vẫn còn chống đỡ gia đình này được. Ngày anh tư lên đường, Xuân Linh rút từ trong túi ra một ít tiền lẻ nhàu nát dúi vào tay anh trai: - Đây là 80 tệ, tiền em dành riêng ra, anh giữ lấy để tiêu vặt, vào bộ đội rồi anh nhớ cố gắng. Thẩm Kiến Hoa mắt rưng rưng. Mùa xuân năm 1997 là mùa xuân vui sướng hạnh phúc nhất của Xuân Linh. Tết năm đó, ngoài người anh thứ tư đang ở bộ đội, cả ba anh trai đều quay về nhà ăn tết. Và ai cũng mang quà về cho cô em gái. Người anh cả là sinh viên mang tặng em một bộ quần áo mới, người anh thứ hai cũng là sinh viên tặng em một chiếc khăn màu hồng, người anh thứ ba đang ôn thi cũng mua cho em một hộp kem trang điểm. Xuân Linh ôm tất cả quà vào lòng vui sướng, nhảy lên cười, lúc đó cô bé quay trở lại vẻ ngây thơ con nít vốn có. Bố gọi ba đứa con trai đến bên giường: - Các con phải báo đáp cho Linh, vì nó đã quá khổ sở rồi. Ngày sau các con trưởng thành, các con có quyền quên bố đi, nhưng không bao giờ được phép quên Xuân Linh. Tình thân vĩnh viễn Công việc nhà nông bận rộn, nhưng Xuân Linh không quên bệnh của bố dượng, hễ có hy vọng, ngại gì đường xa núi cao, cô đều kéo bố đi. Trời xanh không phụ người có công, bệnh của bố dượng đã đỡ hơn rất nhiều, đã có lúc ông chống được gậy đứng lên. Những người anh học hành tấn tới. Anh cả Thẩm Kiến Quốc sau khi tốt nghiệp đại học đã thi đỗ để học tiếp Thạc sĩ. Người anh thứ tư Thẩm Kiến Hoa đã được vào Đảng trong quân ngũ, được đề bạt lên làm trung đội trưởng. Tháng 9/1997, người anh thứ ba Thẩm Kiến Văn cũng thi đỗ cao đẳng, được Học viện Đông y Sơn Đông nhận vào học. Tháng 3/1998, bà nội bỗng dưng bệnh nặng, lúc lâm chung, bà cụ nắm chặt lấy tay Xuân Linh nói: “Xuân Linh, cả đời bà chẳng có gì tiếc nuối, vì đã có một đứa cháu ngoan như cháu, bà chỉ thương xót cháu thôi!” Nói rồi bà lần từ dưới gối ra một chiếc vòng tay bằng ngọc đưa cho Xuân Linh, Xuân Linh không dám cầm. Ông nội nói: “Xuân Linh, đấy là thứ bà nội định để dành cho cháu dâu đầu, nhưng bà nội nghĩ, cái vòng này nên để dành cho cháu, cháu hãy nhận cho bà mãn nguyện đi!”. Xuân Linh nuốt nước mắt rưng rưng nhận lấy. Sau khi bà nội mất, người anh thứ tư viết thư về, nói sẽ chuẩn bị thi vào trường quân sự, nhưng khi biết bà nội vừa mất, trong nhà đã lo liệu hết tiền, anh bèn quyết định bỏ cuộc. Xuân Linh đọc thư, lo lắng, cô liền tìm người nhờ gửi thư cho anh trai khuyên ngăn, và gửi kèm theo đó 200 tệ, để anh trai mua sách vở ôn thi. Cô nói: “Anh ạ, thi vào trường quân sự là việc lớn cả đời anh, đừng để khó khăn trước mắt làm ngăn cản việc cả đời”.
- Đúng lúc đó, mẹ Xuân Linh đã bỏ đi biệt tăm tích lâu nay, bỗng gửi thư về cho cô, thì ra mấy năm nay, mẹ cô bỏ đi rồi đã làm một tờ giấy li hôn giả mạo với bố dượng, rồi sang huyện Bình Dương ăn ở với một ông có tiệm thực phẩm, cuộc sống khá sung túc. Mẹ cô nghe qua người khác mới biết con gái mình mấy năm nay chịu cực khổ vô vàn, trong lòng bà rất ăn năn. Mẹ cô gửi thư tới muốn bảo con gái bỏ sang huyện Bình Dương, hứa sẽ tìm cho cô một gia đình đàng hoàng để gả chồng. Đọc lá thư của mẹ, Xuân Linh nước mắt dào dạt, rất muốn được sống một cuộc sống đơn giản vô lo của một cô con gái bên cạnh mẹ. Nhưng cô cũng không thể nào bỏ rơi gia đình này, cái gia đình nghèo khổ hoạn nạn, nhưng cả nhà đều chân tình yêu thương cô! Bố dượng biết con gái khó xử, khuyên cô: - Xuân Linh, đi tìm mẹ con đi! Bố không trách con, cả nhà ta đã khổ, kéo theo cả đời con khổ theo thì bố không nỡ lòng nào! Xuân Linh cắn chặt môi, quỳ xuống trước giường bệnh của bố: - Bố ạ, khổ sở nữa con cũng chịu được, bố đừng đuổi con đi! Xuân Linh nhờ người viết thư trả lời mẹ rằng, cô không muốn theo mẹ. Một ngày tháng 9/1998, vì muốn kiếm tiền cho anh trai thứ tư ôn thi, cô lại nghĩ đến việc đi bán máu. Sau rất nhiều lần cầu xin, cuối cùng bác sĩ đã đồng ý, lấy 300ml máu của cô. Vốn thân thể gầy gò yếu ớt vì thiếu dinh dưỡng, giờ Xuân Linh càng yếu. Nhưng cô lấy lại tinh thần, đi ra bưu điện gửi mấy trăm tệ đó cho anh. Lúc liêu xiêu qua đường, vì không còn tinh thần để ý kỹ, cô bị một xe tải lớn chở các cuộn sắt gạt ngã, bánh xe lớn nghiến qua người Xuân Linh. Tin dữ đến, ông nội cô không chịu đựng nổi, đổ bệnh liệt giường, bố dượng Xuân Linh cũng ngất đi nhiều lần. Người anh thứ ba Thẩm Kiến Văn là người đầu tiên biết tin này, anh chạy về nhà, chỉ còn biết khóc bên thi thể em. Người anh thứ hai Thẩm Kiến Quân nhận được điện báo, suốt hai ngày đi tàu về không ăn không ngủ, khóc từ Thượng Hải về đến Sơn Đông. Ở tít tận Tây An, người anh cả Thẩm Kiến Quốc đang học thạc sĩ được tin cũng khóc rụng rời, không thể về dự đám tang được, anh điện về nhà: “Em gái yêu quý, em dùng tấm lòng người mẹ để gánh vác cả gia đình này, dùng đôi vai yếu ớt để dựng lên một niềm hy vọng, cả gia đình mãi mãi yêu em.” Vừa nhận được giấy báo nhập học của Học viện Lục quân Quế Lâm, người anh thứ tư Thẩm Kiến Hoa cũng đồng thời nhận tin em chết, anh ngã ngất đi trên thao trường. Tỉnh dậy liền vội vã về quê. Nhưng ở quê, những người chết trẻ vị thành niên không được phép tổ chức đám ma, ngay cả nghĩa trang của dòng họ cũng không được phép vào chôn cùng. Xuân Linh đến đây sống bốn năm, họ tên thì đã đổi, nhưng hộ khẩu thì không có, ngay cả tư cách là dân chúng của địa phương cũng không có, không được coi là người làng. Nhưng những người già trong làng cảm động trước cuộc đời hiếu nghĩa của Xuân Linh. Người già nói, đứa con gái tốt đẹp thế, chết rồi thì tại sao còn phải để nó phải chịu tức tưởi nữa. Nhà văn Lưu Hồng, người đã từng đến viết bài phỏng vấn Xuân Linh hồi trước cũng đến dự tang lễ, và viết một bài ai điếu cho cô bé: “Em, là một đóa hoa giữa thung lũng, một vệt mây ở bên trời, lặng lẽ đến, lại lặng lẽ đi.
- Đôi vai nhỏ gánh đầy tình người, tâm hồn nhỏ nâng đỡ cả gia đình, tuổi còn trẻ như thơ như họa, như tơ như khói, lại đầy gian nan khốn khó vất vả. Em đi rồi, nhẹ như thế, như đám mây bên trời xa, câu chuyện để lại nặng như thế, ân tình cao như núi Thái Sơn...”. Những người con gái đều có những son phấn của riêng mình, có lẽ Xuân Linh cả đời chưa chạm vào son phấn, nhưng cô vẫn là người con gái đẹp nhất. Năm 2007, Đài truyền hình Trung ương Trung Quốc dự định làm một bộ phim truyền hình 100 tập về 100 tấm gương tốt cảm động thời nay, lấy tên phim là “Câu chuyện của chúng tôi” để giáo dục thế hệ trẻ Trung Quốc, câu chuyện về Xuân Linh sẽ được dựng lại ở tập mười sáu. Trang Hạ Chọn lọc từ các trang tin Trung Quốc
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Vài chỉ dẫn để viết tin phát thanh-truyền hình
6 p | 535 | 247
-
Sổ tay của phóng viên - Lê Phong (dịch)
50 p | 334 | 178
-
Nhiệm vụ của người biên tập
5 p | 546 | 156
-
Nhiệm vụ của người biên tập
11 p | 303 | 91
-
Nhiệm vụ người biên tập
6 p | 161 | 72
-
Vài hướng dẫn để viết tin phát thanh-truyền hình
10 p | 162 | 67
-
Tổng quan về CNN
13 p | 122 | 50
-
Sử dụng lời trích dẫn hiệu quả
7 p | 100 | 34
-
Các nguyên tắc hoạt động của báo chí
26 p | 98 | 28
-
Nhà tiên tri Vanga
3 p | 80 | 25
-
Bí mật về truyền thuyết mắt quỷ
2 p | 143 | 23
-
Những kỹ năng viết cơ bản
6 p | 56 | 18
-
Sử dụng các lời trích dẫn hiệu quả
14 p | 44 | 11
-
Ảnh báo chí: Mỗi khuôn hình là một lát cắt cuộc đời
9 p | 53 | 11
-
Nghệ thuật điêu khắc... răng
84 p | 101 | 9
-
Tình Cha Con
9 p | 113 | 9
-
Kí ức về tương lai
4 p | 66 | 4

markdown:
# Chuyện cô bé 16 tuổi làm cảm động cả trời đất
Chia sẻ: Nguyễn Thị Hoàng Hạ | Ngày: | Loại File: DOC | Số trang:7
lượt xem 72
download
![](http://image1.tailieu.vn/document/thumbnail/2009/20091010/quynhnhu/80x100/chuyen_co_be_16_tuoi_lam_cam_dong_ca_troi_dat_1244.jpg)
##
Chuyện cô bé 16 tuổi làm cảm động cả trời đất
[Vui lòng tải xuống để xem tài liệu đầy đủ](javascript:void(0);)
Download
![](http://static1.tailieu.vn/b2013az/templates/version1/default/images/down16x21.png)
Chuyện cô bé 16 tuổi làm cảm động cả trời đất TP - Ngày 24/8/1998, một đám tang vô cùng đặc biệt được tổ chức tại huyện Gia Tường, tỉnh Sơn Đông (Trung Quốc). Người chết là một cô gái mới 16 tuổi trên là Thẩm Xuân Linh.
Bình luận(1)
[Đăng nhập để gửi bình luận!](javascript:void(0);)
##
Nội dung Text: Chuyện cô bé 16 tuổi làm cảm động cả trời đất
- Chuyện cô bé 16 tuổi làm cảm động cả trời đất TP - Ngày 24/8/1998, một đám tang vô cùng đặc biệt được tổ chức tại huyện Gia Tường, tỉnh Sơn Đông (Trung Quốc). Người chết là một cô gái mới 16 tuổi trên là Thẩm Xuân Linh. Nhưng cô được nhận những nghi lễ long trọng nhất của làng, những người anh trai của cô mặc tấm áo tang chỉ được mặc khi đưa tang cha đẻ. Anh trai cô quỳ rất lâu trước linh cữu em gái, người trong làng ai cũng đeo băng tang. Nhưng không ai biết rằng, cô gái mười sáu tuổi này thực ra không hề có máu mủ ruột thịt gì với những người còn sống, cũng như với dân làng này, thậm chí cô chỉ là một đứa con gái riêng của mẹ kế mà ngay cả tên trong sổ hộ khẩu của làng cũng không có. Tôi là con ruột của gia đình này Tháng 6 năm 1994, mẹ của Thái Xuân Linh góa chồng, đem Xuân Linh và đứa em trai từ Long Châu Tập, huyện Phạm Trạch, tỉnh Sơn Đông (TQ) sang huyện Gia Tường với gia đình mới. Bố dượng của Xuân Linh làm nghề thợ mộc, tên là Thẩm Thụ Bình, tính tình hiền lành đôn hậu. Bố dượng có cha mẹ già 70 tuổi, và bốn đứa con trai còn đang đi học. Trong đó anh con cả Thẩm Kiến Quốc đang học Đại học Giao thông ở Tây An. Ba cậu con trai còn lại học trường phổ thông trong huyện. Gánh nặng gia đình quá lớn, nhưng bố dượng cô giỏi nghề thợ mộc, trong nhà cũng chỉ chi tiêu dè sẻn, nên cuộc sống gia đình cũng tạm đủ. Khi ba mẹ con Thái Xuân Linh gia nhập đại gia đình ấy, cả nhà đều vui vẻ chào đón, hay có thể bởi nhà toàn đàn ông, giờ có một cô em gái mới, cả ông bà nội lẫn bố dượng đều rất yêu quý Xuân Linh. Khi đó, Linh chỉ vì bố mất, nhà nghèo khó, cô đành bỏ học ở nhà. Bố dượng dứt khoát đưa tiền cho cô đi học trở lại. Trong nhà vốn đã bốn đứa con đi học, giờ thêm Xuân Linh, gánh nặng càng lớn. Ông bố dượng chỉ có cách dành thời gian làm thêm lúc nông nhàn mới đủ cho chi tiêu trong gia đình. Xuân Linh vô cùng trân trọng cơ hội được đi học, ngay học kỳ đầu tiên quay lại trường, cô đứng thứ ba trong khối. Ngoài học tập, cô lo liệu việc nhà, lúc nào rảnh rỗi thì giặt quần áo cho các anh, vác gỗ cho bố dượng, ông bố dượng thường khen ngợi:
- - Bố thật là có phúc mới có đứa con gái ngoan ngoãn thế này. Thời gian hạnh phúc chẳng bao lâu, đầu mùa hạ năm 1995, bố dượng cô trong lúc làm công trình đã ngã từ tầng ba xuống, bị liệt giường. Cột trụ trong gia đình đã gẫy, nguồn kinh tế chính của gia đình bị cắt đứt, và tiền chữa bệnh của bố dượng cô đã mang lại một khoản nợ rất lớn cho gia đình. Thật đáng tiếc, khi mẹ Xuân Linh được bác sĩ cho biết, bệnh của chồng mới sẽ không bao giờ khỏi, cả đời nằm liệt giường, mẹ cô đã rất đau khổ. Bà không thể chịu đựng nổi sự rủi ro liên tiếp từ hai đời chồng, lại biết không gánh vác được một gánh nặng quá lớn từ gia đình chồng, mất hết hy vọng và niềm tin vào cuộc sống. Bà ôm đứa con trai nhỏ ra đi, bỏ lại một nhà đầy người già, bệnh tật, trẻ con cho dù Xuân Linh năn nỉ, cầu xin mẹ như thế nào. Thấy bố như thế, người con trai thứ hai định xin nhập ngũ, ông bố không đồng ý bởi anh thứ hai và thứ ba sắp cùng thi tốt nghiệp phổ thông, thành tích luôn đứng đầu trường. Người con thứ ba cũng đòi bỏ học, muốn đi làm để gánh vác gia đình. Vào lúc cả nhà bàn cãi, Xuân Linh đề nghị cho em nghỉ học, thay mẹ chèo chống gia đình này. Bố dượng cô rơi nước mắt, ngay cả ông bà nội cũng khóc. Bố dượng cô đau khổ nói: - Xuân Linh, bố xin lỗi con! Các anh con đã học chừng đó năm rồi, giờ bỏ đi uổng phí quá, bố biết là làm thế con sẽ thiệt thòi Ba người anh trai đều nắm chặt tay em gái, cùng thề với bố, cho dù sau này ai thi đỗ đại học, cũng đều nhớ công người em gái. Mẹ Xuân Linh bỏ đi, nguồn kinh tế của gia đình lại mất hẳn chút hỗ trợ cuối cùng. Ông bà nội đều thở dài, bố dượng gạt nước mắt, các anh trai Xuân Linh cũng lo âu, cả nhà rơi vào tình trạng thấp thỏm bất an, buồn thảm. Những người làng an ủi cô bé: - Ở đây cháu không có người thân, hay là cháu quay về nhà ông bà ở bên Phạm Trạch đi! - Không, cháu không đi được, mẹ cháu bỏ đi rồi cháu không thể cũng bỏ đi nốt! Xuân Linh nói với bố dượng: - Bố ạ, mẹ con bỏ đi rồi, là mẹ con nhẫn tâm; nhưng con hứa con không bao giờ bỏ nhà đi, con sẽ ở lại đây cùng vượt qua hoạn nạn với mọi người, từ hôm nay con xin được là con đẻ của bố! Năm đó, Xuân Linh mới 12 tuổi, đổi từ họ Thái sang họ Thẩm. Làm đồng, việc nhà, chăm sóc người lớn, tất cả mọi việc Xuân Linh đều gánh vác, cô bé làm việc như một phụ nữ thực thụ trong một gia đình nông dân, thức dậy lúc mặt trời mọc, trời tối hẳn mới nghỉ ngơi, cẩn trọng tính toán từng món một trong gia đình để lo liệu qua ngày. Xuân Linh biết, để gia cảnh đỡ khó, thì sức khỏe của bố phải tốt lên, cho nên vào những lúc nông nhàn, cô bé không quên chăm sóc chu đáo cho bố. Mùa hè năm 1996, thời tiết nóng bức, bệnh tình bố dượng cô nặng lên, Xuân Linh quyết định đưa bố lên nằm viện trên thành phố Tề Ninh. Thu xếp xong việc nhà, cô kéo bố lên thành phố chữa bệnh. Đường đất 80 km, cô kéo xe hết đúng hai ngày một đêm. Khi đến nơi, chân cô đã lở ra, vai kéo sưng u lên một cục lớn.
- Để tiết kiệm tiền, Xuân Linh đã ngủ trong nhà để xe đạp của bệnh viện, người trông xe tưởng cô là ăn mày, đã mấy lần xua cô ra ngoài. Xuân Linh đành kể hết sự tình, ông già trông xe cảm động quá, không chỉ cho cô mang chiếc xe kéo đặt vào tận bên trong nhà xe, còn kiếm cho cô một cái màn chống muỗi. Dưới sự chăm sóc của con gái nhỏ, bệnh của bố dượng cô dần ổn định hơn, cô lại kéo bố về quê trên chiếc xe ấy. Vừa về đến quê, là vào vụ thu hoạch lúa mạch, các anh đều đang ở trường, ông bà nội chỉ có thể giúp cô nấu cơm và bó những túm lúa, thế là hơn bảy mẫu đất lúa mạch đang chín, lại một mình Xuân Linh cắt. Để kịp thu hoạch, suốt mấy ngày liên tục cô bé ngủ lại ngoài ruộng lúa, mệt tới mức không chống đỡ nổi nữa thì nằm ngủ luôn trên lúa mạch, ngủ dậy lại cắt tiếp. Vì quá lo lắng, lại vì lao lực, miệng Xuân Linh nở những mụn nước nhỏ, tay chân xước máu. Thật sự cô bé đã kiệt sức, còn lại hai mẫu lúa mạch nữa. Đều là lương thực gia đình trông vào đó! Cô bé bất lực đứng giữa ruộng lúa mạch khóc nức nở không thành tiếng, khóc tới mức hàng xóm chung quanh thấy thương hại quá, bèn tới năm tay mười tay giúp cô gặt nốt mảnh ruộng. Đợt thu hoạch khó nhọc đó đổi lại được lương thực đủ ăn cho cả gia đình. Anh thứ hai đã đỗ kết quả rất cao trong kỳ thi tốt nghiệp trung học, nhờ kết quả đó, anh được tuyển vào trường đại học Đồng Tề ở tận Thượng Hải. Cầm giấy báo nhập học của anh thứ hai, Xuân Linh chạy như bay về nhà quên hết mệt nhọc, nhảy lên vui sướng. Nhìn đứa em gái vừa bé vừa đen, người anh thứ ba là Thẩm Kiến Văn rớt nước mắt tủi thân vì thi trượt đại học. Thẩm Kiến Văn buồn rầu nói: - Anh xin lỗi, em đã vất vả vì cả gia đình, mà anh lại thi trượt! Vừa nói anh ba vừa khóc. Xuân Linh hốt hoảng nắm lấy tay anh: - Năm nay thi trượt thì năm sau thi tiếp, anh đừng nản chí như thế! Thẩm Kiến Văn quyết định không thi đại học nữa, ở nhà kiếm sống giúp em gái. Xuân Linh không đồng tình: - Em chịu vất vả cũng chỉ vì muốn các anh học lên đại học mà thôi! Anh thất bại là em cũng thất bại! Ba nghìn Nhân dân tệ học phí là gánh nặng quá lớn với cả gia đình. Vào lúc bất lực ấy, Thẩm Xuân Linh nghĩ đến chuyện đi bán máu. Lần thứ nhất đến nơi bán máu, vì quá nhỏ tuổi, bác sĩ không đồng ý! Lần thứ hai, cô nói dối tuổi mình, cuối cùng được bán 200 ml máu. Cầm được 400 tệ tiền bán máu, nỗi buồn bã của cô vẫn không bớt đi. Vì 400 tệ so với 3.000 tệ thì còn quá ít ỏi. Như cốc nước hắt vào đống lửa, chả thấm vào đâu. Ba ngày sau, cô quay trở lại trạm y tế. Lần này, nói kiểu gì bác sĩ cũng quyết không lấy máu của Xuân Linh. Quá lo lắng, cô đành quỳ xuống cầu xin bác sĩ, và kể cho ông biết lý do. Bác sĩ trầm ngâm rất lâu, cuối cùng ông thở dài bảo: - Thôi được, chỉ một lần này thôi nhé! Lần sau cháu đừng đến đây nữa, cháu còn quá nhỏ, cơ thể còn đang phải lớn nữa! Ông bác sĩ chỉ rút một lượng máu rất nhỏ tượng trưng, rồi móc túi ra đưa cho cô 700 tệ, làm Xuân Linh vô cùng cảm động. Về nhà, Xuân Linh đưa tiền cho bố dượng, bố vội hỏi tiền ở đâu ra mà nhiều thế này, cô nói dối là đi vay người ta.
- Bố cô cầm tay con xem xét, lại móc từ túi cô ra hai tờ giấy bán máu. Cả nhà cô đều kinh hãi. Nhưng số tiền đó còn lâu mới đủ được, dù chỉ một nửa học phí cho người anh. Bố dượng cô quyết định bán đi một phần mảnh đất từ ngôi nhà cũ của họ, ông bà nội cũng bán ba cây dương vốn định dành gỗ để đóng quan tài cho ông bà sau này. Khi bố dượng không đồng ý bán ba cây dương, ông bà nói: - Máu của Xuân Linh còn không tiếc, chúng tôi còn cần quan tài để làm gì nữa! Dưới sự nỗ lực của toàn gia đình, tiền học cho anh hai, anh ba cuối cùng đã thu xếp xong. Để anh Thẩm Tiến Quân có thứ để lên trường, suốt mấy tối liền Xuân Linh thức khuya khâu vỏ chăn mới và giầy vải cho anh. Vào lúc lên đường, Xuân Linh ra bến xe tiễn anh, cô nói: - Anh ạ, nhà mình tuy nghèo, nhưng khảng khái, anh phải học cho ra học, anh đừng lo lắng chuyện ở nhà, cũng đừng tự khắc nghiệt với bản thân mình quá, anh cần tiền tiêu cứ viết thư về cho nhà nhé, em sẽ lo cho anh! Thẩm Tiến Quân không nén được, ôm lấy đứa em nhỏ vào lòng, cảm động trào nước mắt. Có thể bỏ rơi cha, không được phép bỏ rơi em Những người anh lên đường đi học rồi, Xuân Linh bắt đầu tính toán xem làm cách nào kiếm tiền để chữa bệnh cho bố, lo học phí cho các anh trai. Ban đầu, cô định theo chân các chị trong làng ra ngoài đi làm kiếm tiền, nhưng ở nhà còn hai người già và một người bệnh đều cần chăm sóc, cô chỉ có thể ở lại. Cân nhắc kỹ, cô quyết định trồng bông. Trồng bông không giống như trồng những cây khác, không chỉ phí sức trồng trọt, ngay khoản phun thuốc sâu cho bông cũng rất nguy hiểm, nhưng Xuân Linh tính nhẩm ra, một năm trồng bông có thể thu lãi được 8-9 nghìn Nhân dân tệ (16-18 triệu VND), cô không trù trừ bắt tay vào làm ngay. Cô háo hức trồng xuống cây bông, nhưng chẳng mấy lâu, khu vực Lỗ Tây Nam (mấy huyện thuộc Sơn Đông) gặp dịch sâu xanh trên lá bông (Helicoverpa armigera) tràn tới, vụ dịch làm Xuân Linh cuống quýt, cô bé người còn chưa cao bằng ngọn cây bông đã cõng bình xịt thuốc sâu nặng hơn 20kg sau lưng đi dọc ruộng bông để xịt thuốc. Cô nghe người ta nói, lúc chính ngọ thời tiết nóng nực nhất, là lúc trừ sâu có hiệu quả lớn nhất. Cô liền chọn lúc giữa trưa nắng to đi phun thuốc sâu, mặt trời rát bỏng trút nóng xuống cánh đồng bông hầm hập như một lò hấp khí nóng, làm Xuân Linh không thở nổi. Cô chỉ có thể chạy phun một hàng rồi chạy ra hít thở không khí. Một ngày vào lúc chính ngọ, vì thùng thuốc sâu bị rò chảy, cô trúng độc, ngất đi. Người làng khiêng Xuân Linh về. Lúc tỉnh lại, cô không để ý đến sự ngăn cản của người bố nằm liệt giường, lại đòi chạy ra ruộng bông luôn. Năm đó, bông được mùa thu hoạch lớn, nhưng vì thế mà giá thu mua bị dìm xuống rất thấp, và Xuân Linh vẫn không thể kiếm được khoản tiền như cô mong muốn. Đầu óc thông minh của Xuân Linh lại suy tính, cô đang nghĩ có cách nào kiếm được tiền nhanh nhất. Lúc nông nhàn, cô đã từng theo người làng đi thu mua hoa hòe, cành liễu (dùng như sợi bàng, sợi chiếu cói của VN), cũng từng đi bán mũ nan, đậu tương. Sau này, cô nghe người ta nói táo Tứ Thủy ở huyện bên rất rẻ, cô lại cùng ông bác trong làng đi Tứ Thủy buôn táo.
- Hàng ngày, sau bữa tối, cô kéo xe kéo lên đường, lúc trời hơi rạng thì tới được vườn táo, chất đầy xe táo rồi quay về ngay. Đàn ông thanh niên kéo một xe, cô cũng kéo một xe. Dọc đường, người ta đều ăn táo giải khát, cô thì chưa từng ăn một quả táo nào, ngay cả những quả dập nát cũng giữ lại phần bố, cho ông bà ăn. Anh thứ tư Thẩm Kiến Hoa thấy đứa em 14 tuổi vất vả như thế, quá áy náy, quyết định bỏ học và cũng trốn nghĩa vụ quân sự, ở nhà kiếm sống thay em. Xuân Linh khuyên anh thế này: - Em hâm mộ nhất trên đời này là quân nhân, anh ở nhà rồi sau này anh sẽ ra sao? Anh cứ đi đi, em vẫn còn chống đỡ gia đình này được. Ngày anh tư lên đường, Xuân Linh rút từ trong túi ra một ít tiền lẻ nhàu nát dúi vào tay anh trai: - Đây là 80 tệ, tiền em dành riêng ra, anh giữ lấy để tiêu vặt, vào bộ đội rồi anh nhớ cố gắng. Thẩm Kiến Hoa mắt rưng rưng. Mùa xuân năm 1997 là mùa xuân vui sướng hạnh phúc nhất của Xuân Linh. Tết năm đó, ngoài người anh thứ tư đang ở bộ đội, cả ba anh trai đều quay về nhà ăn tết. Và ai cũng mang quà về cho cô em gái. Người anh cả là sinh viên mang tặng em một bộ quần áo mới, người anh thứ hai cũng là sinh viên tặng em một chiếc khăn màu hồng, người anh thứ ba đang ôn thi cũng mua cho em một hộp kem trang điểm. Xuân Linh ôm tất cả quà vào lòng vui sướng, nhảy lên cười, lúc đó cô bé quay trở lại vẻ ngây thơ con nít vốn có. Bố gọi ba đứa con trai đến bên giường: - Các con phải báo đáp cho Linh, vì nó đã quá khổ sở rồi. Ngày sau các con trưởng thành, các con có quyền quên bố đi, nhưng không bao giờ được phép quên Xuân Linh. Tình thân vĩnh viễn Công việc nhà nông bận rộn, nhưng Xuân Linh không quên bệnh của bố dượng, hễ có hy vọng, ngại gì đường xa núi cao, cô đều kéo bố đi. Trời xanh không phụ người có công, bệnh của bố dượng đã đỡ hơn rất nhiều, đã có lúc ông chống được gậy đứng lên. Những người anh học hành tấn tới. Anh cả Thẩm Kiến Quốc sau khi tốt nghiệp đại học đã thi đỗ để học tiếp Thạc sĩ. Người anh thứ tư Thẩm Kiến Hoa đã được vào Đảng trong quân ngũ, được đề bạt lên làm trung đội trưởng. Tháng 9/1997, người anh thứ ba Thẩm Kiến Văn cũng thi đỗ cao đẳng, được Học viện Đông y Sơn Đông nhận vào học. Tháng 3/1998, bà nội bỗng dưng bệnh nặng, lúc lâm chung, bà cụ nắm chặt lấy tay Xuân Linh nói: “Xuân Linh, cả đời bà chẳng có gì tiếc nuối, vì đã có một đứa cháu ngoan như cháu, bà chỉ thương xót cháu thôi!” Nói rồi bà lần từ dưới gối ra một chiếc vòng tay bằng ngọc đưa cho Xuân Linh, Xuân Linh không dám cầm. Ông nội nói: “Xuân Linh, đấy là thứ bà nội định để dành cho cháu dâu đầu, nhưng bà nội nghĩ, cái vòng này nên để dành cho cháu, cháu hãy nhận cho bà mãn nguyện đi!”. Xuân Linh nuốt nước mắt rưng rưng nhận lấy. Sau khi bà nội mất, người anh thứ tư viết thư về, nói sẽ chuẩn bị thi vào trường quân sự, nhưng khi biết bà nội vừa mất, trong nhà đã lo liệu hết tiền, anh bèn quyết định bỏ cuộc. Xuân Linh đọc thư, lo lắng, cô liền tìm người nhờ gửi thư cho anh trai khuyên ngăn, và gửi kèm theo đó 200 tệ, để anh trai mua sách vở ôn thi. Cô nói: “Anh ạ, thi vào trường quân sự là việc lớn cả đời anh, đừng để khó khăn trước mắt làm ngăn cản việc cả đời”.
- Đúng lúc đó, mẹ Xuân Linh đã bỏ đi biệt tăm tích lâu nay, bỗng gửi thư về cho cô, thì ra mấy năm nay, mẹ cô bỏ đi rồi đã làm một tờ giấy li hôn giả mạo với bố dượng, rồi sang huyện Bình Dương ăn ở với một ông có tiệm thực phẩm, cuộc sống khá sung túc. Mẹ cô nghe qua người khác mới biết con gái mình mấy năm nay chịu cực khổ vô vàn, trong lòng bà rất ăn năn. Mẹ cô gửi thư tới muốn bảo con gái bỏ sang huyện Bình Dương, hứa sẽ tìm cho cô một gia đình đàng hoàng để gả chồng. Đọc lá thư của mẹ, Xuân Linh nước mắt dào dạt, rất muốn được sống một cuộc sống đơn giản vô lo của một cô con gái bên cạnh mẹ. Nhưng cô cũng không thể nào bỏ rơi gia đình này, cái gia đình nghèo khổ hoạn nạn, nhưng cả nhà đều chân tình yêu thương cô! Bố dượng biết con gái khó xử, khuyên cô: - Xuân Linh, đi tìm mẹ con đi! Bố không trách con, cả nhà ta đã khổ, kéo theo cả đời con khổ theo thì bố không nỡ lòng nào! Xuân Linh cắn chặt môi, quỳ xuống trước giường bệnh của bố: - Bố ạ, khổ sở nữa con cũng chịu được, bố đừng đuổi con đi! Xuân Linh nhờ người viết thư trả lời mẹ rằng, cô không muốn theo mẹ. Một ngày tháng 9/1998, vì muốn kiếm tiền cho anh trai thứ tư ôn thi, cô lại nghĩ đến việc đi bán máu. Sau rất nhiều lần cầu xin, cuối cùng bác sĩ đã đồng ý, lấy 300ml máu của cô. Vốn thân thể gầy gò yếu ớt vì thiếu dinh dưỡng, giờ Xuân Linh càng yếu. Nhưng cô lấy lại tinh thần, đi ra bưu điện gửi mấy trăm tệ đó cho anh. Lúc liêu xiêu qua đường, vì không còn tinh thần để ý kỹ, cô bị một xe tải lớn chở các cuộn sắt gạt ngã, bánh xe lớn nghiến qua người Xuân Linh. Tin dữ đến, ông nội cô không chịu đựng nổi, đổ bệnh liệt giường, bố dượng Xuân Linh cũng ngất đi nhiều lần. Người anh thứ ba Thẩm Kiến Văn là người đầu tiên biết tin này, anh chạy về nhà, chỉ còn biết khóc bên thi thể em. Người anh thứ hai Thẩm Kiến Quân nhận được điện báo, suốt hai ngày đi tàu về không ăn không ngủ, khóc từ Thượng Hải về đến Sơn Đông. Ở tít tận Tây An, người anh cả Thẩm Kiến Quốc đang học thạc sĩ được tin cũng khóc rụng rời, không thể về dự đám tang được, anh điện về nhà: “Em gái yêu quý, em dùng tấm lòng người mẹ để gánh vác cả gia đình này, dùng đôi vai yếu ớt để dựng lên một niềm hy vọng, cả gia đình mãi mãi yêu em.” Vừa nhận được giấy báo nhập học của Học viện Lục quân Quế Lâm, người anh thứ tư Thẩm Kiến Hoa cũng đồng thời nhận tin em chết, anh ngã ngất đi trên thao trường. Tỉnh dậy liền vội vã về quê. Nhưng ở quê, những người chết trẻ vị thành niên không được phép tổ chức đám ma, ngay cả nghĩa trang của dòng họ cũng không được phép vào chôn cùng. Xuân Linh đến đây sống bốn năm, họ tên thì đã đổi, nhưng hộ khẩu thì không có, ngay cả tư cách là dân chúng của địa phương cũng không có, không được coi là người làng. Nhưng những người già trong làng cảm động trước cuộc đời hiếu nghĩa của Xuân Linh. Người già nói, đứa con gái tốt đẹp thế, chết rồi thì tại sao còn phải để nó phải chịu tức tưởi nữa. Nhà văn Lưu Hồng, người đã từng đến viết bài phỏng vấn Xuân Linh hồi trước cũng đến dự tang lễ, và viết một bài ai điếu cho cô bé: “Em, là một đóa hoa giữa thung lũng, một vệt mây ở bên trời, lặng lẽ đến, lại lặng lẽ đi.
- Đôi vai nhỏ gánh đầy tình người, tâm hồn nhỏ nâng đỡ cả gia đình, tuổi còn trẻ như thơ như họa, như tơ như khói, lại đầy gian nan khốn khó vất vả. Em đi rồi, nhẹ như thế, như đám mây bên trời xa, câu chuyện để lại nặng như thế, ân tình cao như núi Thái Sơn...”. Những người con gái đều có những son phấn của riêng mình, có lẽ Xuân Linh cả đời chưa chạm vào son phấn, nhưng cô vẫn là người con gái đẹp nhất. Năm 2007, Đài truyền hình Trung ương Trung Quốc dự định làm một bộ phim truyền hình 100 tập về 100 tấm gương tốt cảm động thời nay, lấy tên phim là “Câu chuyện của chúng tôi” để giáo dục thế hệ trẻ Trung Quốc, câu chuyện về Xuân Linh sẽ được dựng lại ở tập mười sáu. Trang Hạ Chọn lọc từ các trang tin Trung Quốc
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Vài chỉ dẫn để viết tin phát thanh-truyền hình
6 p |
535 |
247
-
Sổ tay của phóng viên - Lê Phong (dịch)
50 p |
334 |
178
-
Nhiệm vụ của người biên tập
5 p |
546 |
156
-
Nhiệm vụ của người biên tập
11 p |
303 |
91
-
Nhiệm vụ người biên tập
6 p |
161 |
72
-
Vài hướng dẫn để viết tin phát thanh-truyền hình
10 p |
162 |
67
-
Tổng quan về CNN
13 p |
122 |
50
-
Sử dụng lời trích dẫn hiệu quả
7 p |
100 |
34
-
Các nguyên tắc hoạt động của báo chí
26 p |
98 |
28
-
Nhà tiên tri Vanga
3 p |
80 |
25
-
Bí mật về truyền thuyết mắt quỷ
2 p |
143 |
23
-
Những kỹ năng viết cơ bản
6 p |
56 |
18
-
Sử dụng các lời trích dẫn hiệu quả
14 p |
44 |
11
-
Ảnh báo chí: Mỗi khuôn hình là một lát cắt cuộc đời
9 p |
53 |
11
-
Nghệ thuật điêu khắc... răng
84 p |
101 |
9
-
Tình Cha Con
9 p |
113 |
9
-
Kí ức về tương lai
4 p |
66 |
4

WARC-Type: response

Content-Type: application/http; msgtype=response

WARC-Identified-Payload-Type: application/xhtml+xml

Server: Apache/2.2.31 (CentOS)

Connection: close

Pragma: no-cache

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

Set-Cookie: TLDEVNamespace=koihvu5338l67cvee4gj681gs3; path=/; domain=.tailieu.vn; HttpOnly

Vary: Accept-Encoding

Content-Type: text/html; charset=UTF-8