BÀI 1 VẼ BẦU TRỜI ĐẦY SAO
uses crt,graph;
var gd, gm, i : integer;
BEGIN
gd := 0; initgraph(gd,gm,'C:\TP\BGI');
for i := 1 to 1000 do
putpixel(random(640),random(480),random(15)+1);
readkey;
END.
BÀI 2 VẼ LÁ CỜ ĐỎ SAO VÀNG
uses crt,graph;
var gd, gm, i, goc, r : integer;
p : array[1 5,1 2] of integer; { lưu toạ độ các đỉnh ngôi sao }
BEGIN
gd := 0; initgraph(gd,gm,'C:\TP\BGI');
goc := 18; r := 100;
for i := 1 to 5 do begin
p[i,1] := round(r*cos(goc*pi/180));
p[i,2] :=-round(r*sin(goc*pi/180)); {dùng dấu – vì trục y của màn hình ngược}
goc := goc + 2*72;
end;
SetFillStyle(1,red); {vẽ lá cờ là hình chữ nhật tô màu đỏ}
Bar(100,100,540,380);
SetViewPort(320,240,600,400,false); {chuyển gốc toạ độ ra giữa màn hình}
SetColor(yellow);
SetFillStyle(1,yellow);
FillPoly(5,p); {tô đa giác hình sao, phần giữa không được tô}
FloodFill(0,0,yellow); {nên phải tô phần giữa bằng FloodFill}
readkey;
END.
BÀI 3 VẼ BÓNG CHUYỂN ĐỘNG KIỂU BẬT TƯỜNG
uses crt,graph;
var gd,gm,x,y,dx,dy,r : integer;
BEGIN
gd := 0; initgraph(gd,gm,'C:\TP\BGI');
x := 100; y := 100; dx := 6; dy := 5; r := 30;
repeat
setcolor(yellow);
circle(x,y,r); {vẽ đường tròn màu vàng}
delay(20);
setcolor(0);
circle(x,y,r); {vẽ đường tròn màu trùng màu nền <=> xoá }
if (x>=640-r) or (x<r) then dx:=-dx;{nếu chạm cạnh trái/phải thì đổi hướng}
if (y>=480-r) or (y<r) then dy:=-dy;{nếu chạm cạnh trên/dưới thì đổi hướng}
x := x + dx; y := y + dy; {cập nhật toạ độ}
until keypressed; {có phím nhấn thì dừng}
END.
Trang 2BÀI 4 VẼ BÁNH XE LĂN KHÔNG TRƯỢT
uses crt,graph;
var gd,gm,x,y,dx,da,r,a : integer;
procedure banhxe(x,y,r,c,n,a : integer); {vẽ bánh xe có n nan hoa với màu c}
var goc,dx,dy,i : integer; {a là góc của nan hoa đầu tiên}
begin
SetColor(c); goc := a;
circle(x,y,r);
for i := 1 to n do begin
dx := round(r* cos(goc * pi/180)); {dx, dy là toạ độ tương đối của đầu nan hoa}
dy :=-round(r* sin(goc * pi/180)); {so với tâm bánh xe}
Line(x,y,x+dx,y+dy); {toạ độ tâm bánh xe ở (x,y) }
goc := goc + 360 div n; {360 div n là góc giữa 2 nan hoa kề nhau}
end;
end;
BEGIN
gd := 0; initgraph(gd,gm,'C:\TP\BGI');
x := 30; y := 200; dx := 3; a := 30; r := 30;
da:=round(dx/r*180/pi);{công thức tính da theo dx để đảm bảo lăn không trượt: dx=R*da}
repeat
banhxe(x,y,r,yellow,12,a); {vẽ bánh xe}
delay(40);
banhxe(x,y,r,black,12,a); {vẽ bánh xe với màu nền => xoá}
if (x>=640-r) then x := r; {nếu sang cạnh bên phải thì quay lại bên trái}
x := x + dx;
if a < 0 then a := a + 360;
a := a - da; {quay ngược chiều dương nên phải trừ}
until keypressed;
END.
BÀI 5 VẼ CHUYỂN ĐỘNG CỦA TRÁI ĐẤT VÀ MẶT TRĂNG
uses crt,graph;
var gd,gm,x,y,x1,y1,da,da1,r,r1,goc,goc1 : integer;
procedure hinhtron(x,y,r,c : integer); {vẽ hình tròn có màu c}
var goc,dx,dy,i : integer;
begin
SetColor(c);
circle(x,y,r);
SetFillStyle(1,c);
FloodFill(x,y,c);
end;
BEGIN
gd := 0; initgraph(gd,gm,'C:\TP\BGI');
SetViewPort(320,240,600,400,false); {chuyển gốc toạ độ ra góc}
goc := 0; goc1 := 0; {goc là góc chuyển động của Trái đất, goc1 là của Mặt trăng}
da :=360 div 360;da1 := 360 div 30; {Trái đất quay 1o 1 lần, tương ứng 1 năm 360 ngày }
hinhtron(0,0,50,lightred); {vẽ Mặt trời}
repeat
x := round(240*cos(goc*pi/180)); {toạ độ tương đối của Trái đất với Mặt trời}
y :=-round(200*sin(goc*pi/180)); {chú ý quỹ đạo hình elip}
hinhtron(x,y,20,lightblue); {vẽ Trái đất}
x1 := round(60*cos(goc1*pi/180));{toạ độ tương đối của Mặt trăng so với Trái đất}
y1 :=-round(50*sin(goc1*pi/180));
Trang 3hinhtron(x+x1,y+y1,8,yellow); {vẽ Mặt trăng}
delay(60);
hinhtron(x,y,20,0); {xoá bằng cách vẽ bằng màu nền}
hinhtron(x+x1,y+y1,8,0);
if goc < 0 then goc := goc + 360; {cập nhật góc chuyển động}
goc := goc - da;
if goc1 < 0 then goc1 := goc1 + 360;
goc1 := goc1 - da1;
until keypressed;
END.
BÀI 6 VẼ CÁC ĐƯỜNG CONG TRONG MẶT PHẲNG 2D
uses crt,graph;
var gd, gm, xo, yo, w, h : integer;
x1,y1,x2,y2, xtl, ytl : real;
(* Khởi tạo các tham số của cửa sổ và khung nhìn *)
procedure khoitao_cuaso;
begin
xo := 20; yo := 40; w := 600; h := 400;
xtl := 50; ytl := 50; {chọn trước tỉ lệ ngang và dọc, cho bằng nhau}
x2 := w/xtl/2; x1 := -x2; {căn cửa sổ để tâm là gốc toạ độ}
y2 := h/ytl/2; y1 := -y2;
end;
{Các hàm chuyển toạ độ thực thành toạ độ màn hình}
function tox(x : real): integer;
begin
tox := xo + round((x-x1)*xtl);
end;
function toy(y : real): integer;
begin
toy := yo + round((y2-y)*ytl);
end;
{Thủ tục vẽ đoạn thẳng trong mặt phẳng thực 2D}
procedure Line2D(x1,y1,x2,y2: real);
begin
Line(tox(x1),toy(y1),tox(x2),toy(y2));
end;
{Thủ tục vẽ trục toạ độ}
procedure vetruc;
var i : integer;
x : string;
begin
Line2D(x1,0,x2,0); {vẽ trục x}
Line2D(x2-0.2,+0.1,x2,0); {vẽ hình mũi tên trên trục x}
Line2D(x2-0.2,-0.1,x2,0);
Line2D(0,y1,0,y2); {vẽ trục y}
Line2D(+0.1,y2-0.2,0,y2); {vẽ hình mũi tên trên trục y}
Line2D(-0.1,y2-0.2,0,y2);
SetColor(lightgreen);
SetTextJustify(1,1);
for i := round(x1) + 1 to round(x2) - 1 do {vạch và ghi toạ độ trên trục x}
if i <> 0 then begin
str(i,x); {vạch i nguyên, chuyển số thành chữ}
outtextxy(tox(i),toy(-0.4),x); {để vẽ chữ lên màn hình}
Line2D(i,-0.1,i,0.1); {vẽ 1 đoạn thẳng làm vạch}
end;
Trang 4for i := round(y1) + 1 to round(y2) - 1 do
if i <> 0 then begin
str(i,x);
outtextxy(tox(-0.4),toy(i),x);
Line2D(-0.1,i,0.1,i);
end;
end;
{Vẽ đường cong hàm số y = sinx, x = x1 -> x2}
procedure duongsin;
var x,y,a,b,dx : real;
i,n : integer;
begin
setcolor(yellow);
a := x1; b := x2; n := 100; dx := (b-a)/n;
x := a; y := sin(x);
moveto(tox(x),toy(y)); {dùng 2 hàm toX, toY để chuyển toạ độ thực thành toạ độ màn hình}
for i := 1 to n do begin
x := x + dx; y := sin(x);
lineto(tox(x),toy(y));
end;
end;
{Vẽ đường cong tham số y = cos3t, y = sin5t, t= 0 2pi}
procedure thamso;
var t,x,y,a,b,dt : real;
i,n : integer;
begin
setcolor(lightred);
a := 0; b := 2*pi; n := 100; dt := (b-a)/n;
t := a; x := cos(3*t) ; y := sin(5*t);
moveto(tox(x),toy(y));
for i := 1 to n do begin
t := t + dt; x := cos(3*t) ; y := sin(5*t);
lineto(tox(x),toy(y));
end;
end;
{Vẽ đường cong toạ độ cực r = 3cos3p, p= 0 2pi}
procedure tdcuc;
var r,p,x,y,a,b,dp : real;
i,n : integer;
begin
setcolor(13);
a := 0; b := 2*pi; n := 100; dp := (b-a)/n;
p := a; r := 3*cos(3*p);
x := r*cos(p) ; y := r*sin(p); {công thức đổi toạ độ cực sang toạ độ Đề các 2D}
moveto(tox(x),toy(y));
for i := 1 to n do begin
p := p + dp; r := 3*cos(3*p); x := r*cos(p) ; y := r*sin(p);
lineto(tox(x),toy(y));
end;
end;
BEGIN
gd := 0; initgraph(gd,gm,'C:\TP\BGI');
khoitao_cuaso;
vetruc;
duongsin;
thamso;
tdcuc;
readkey;
END.
Trang 5BÀI 7 MINH HOẠ CÁC PHÉP BIẾN ĐỔI 2D
uses crt,graph;
var gd, gm, xo, yo, w, h, n : integer;
x1,y1,x2,y2, xtl, ytl : real;
x,y : array[1 4] of real;
procedure khoitao_cuaso;
begin
gd := 0; initgraph(gd,gm,'C:\TP\BGI');
xo := 20; yo := 40; w := 600; h := 400;
xtl := 30; ytl := 30;
x2 := w/xtl/2; x1 := -x2;
y2 := h/ytl/2; y1 := -y2;
end;
function tox(x : real): integer;
begin
tox := xo + round((x-x1)*xtl);
end;
function toy(y : real): integer;
begin
toy := yo + round((y2-y)*ytl);
end;
procedure Line2D(x1,y1,x2,y2: real);
begin
Line(tox(x1),toy(y1),tox(x2),toy(y2));
end;
procedure vetruc;
var i : integer;
x : string;
begin
Line2D(x1,0,x2,0);
Line2D(x2-0.2,+0.1,x2,0);
Line2D(x2-0.2,-0.1,x2,0);
Line2D(0,y1,0,y2);
Line2D(+0.1,y2-0.2,0,y2);
Line2D(-0.1,y2-0.2,0,y2);
SetColor(lightgreen);
SetTextJustify(1,1);
for i := round(x1) + 1 to round(x2) - 1 do
if i <> 0 then begin
str(i,x);
outtextxy(tox(i),toy(-0.4),x);
Line2D(i,-0.1,i,0.1);
end;
for i := round(y1) + 1 to round(y2) - 1 do
if i <> 0 then begin
str(i,x);
outtextxy(tox(-0.4),toy(i),x);
Line2D(-0.1,i,0.1,i);
end;
end;
(* Khởi tạo toạ độ các đỉnh hình chữ nhật*)
procedure khoitao_hcn;
begin
n := 4;
Trang 6x[1] := 1; y[1] := 1;
x[2] := 1; y[2] := 3;
x[3] := 5; y[3] := 3;
x[4] := 5; y[4] := 1;
end;
(*Thủ tục vẽ hình chữ nhật*)
procedure VeHCN(c : integer);
begin
SetColor(c);
MoveTo(tox(x[1]), toy(y[1]));
LineTo(tox(x[2]), toy(y[2]));
LineTo(tox(x[3]), toy(y[3]));
LineTo(tox(x[4]), toy(y[4]));
LineTo(tox(x[1]), toy(y[1]));
end;
(* Tịnh tiến HCN theo vector (a,b) *)
procedure tinhtien(a,b : real);
var i : integer;
begin
for i := 1 to n do begin
x[i] := x[i] + a;
y[i] := y[i] + b;
end;
end;
(* Tịnh tiến HCN theo tỉ lệ (Sx,Sy) *)
procedure codan(Sx,Sy : real);
var i : integer;
begin
for i := 1 to n do begin
x[i] := Sx*x[i];
y[i] := Sy*y[i];
end;
end;
(* Tịnh tiến HCN theo góc a, đo bằng radian *)
procedure Quay(a : real);
var i : integer;
cosa,sina,tx,ty : real;
begin
cosa := cos(a); sina := sin(a);
for i := 1 to n do begin
tx := x[i] * cosa - y[i] * sina;
ty := x[i] * sina + y[i] * cosa;
x[i] := tx; y[i] := ty;
end;
end;
BEGIN
khoitao_cuaso;
khoitao_hcn;
vetruc;
VeHCN(14);
readkey;
tinhtien(-3,-2); {tịnh tiến HCN để tâm HCN là gốc toạ độ}
VeHCN(13);
readkey;
codan(1.2,2.4); {co dãn để HCN trở thành hình vuông :D}
VeHCN(12);
readkey;
quay(pi/4); {Quay HCN góc pi/4}
VeHCN(11);
readkey;
Trang 7BÀI 8 VẼ CÁC ĐƯỜNG SIN QUAY QUANH GỐC TOẠ ĐỘ
uses crt,graph;
var gd, gm, xo, yo, w, h : integer;
x1,y1,x2,y2, xtl, ytl : real;
(* CÁC THỦ TỤC HỆ ĐỒ HOẠ 2D *)
procedure khoitao_cuaso;
begin
xo := 20; yo := 40; w := 600; h := 400;
xtl := 30; ytl := 30;
x2 := w/xtl/2; x1 := -x2;
y2 := h/ytl/2; y1 := -y2;
end;
function tox(x : real): integer;
begin
tox := xo + round((x-x1)*xtl);
end;
function toy(y : real): integer;
begin
toy := yo + round((y2-y)*ytl);
end;
procedure Line2D(x1,y1,x2,y2: real);
begin
Line(tox(x1),toy(y1),tox(x2),toy(y2));
end;
procedure vetruc;
var i : integer;
x : string;
begin
SetColor(14);
Line2D(x1,0,x2,0);
Line2D(x2-0.2,+0.1,x2,0);
Line2D(x2-0.2,-0.1,x2,0);
Line2D(0,y1,0,y2);
Line2D(+0.1,y2-0.2,0,y2);
Line2D(-0.1,y2-0.2,0,y2);
SetColor(lightgreen);
SetTextJustify(1,1);
for i := round(x1) + 1 to round(x2) - 1 do
if i <> 0 then begin
str(i,x);
outtextxy(tox(i),toy(-0.4),x);
Line2D(i,-0.1,i,0.1);
end;
for i := round(y1) + 1 to round(y2) - 1 do
if i <> 0 then begin
str(i,x);
outtextxy(tox(-0.4),toy(i),x);
Line2D(-0.1,i,0.1,i);
end;
end;
{Vẽ đường sin y = sinx, x = -pi -> pi, quay 1 góc}
procedure quay(x,y,a:real; var tx,ty : real);
begin
tx := x * cos(a) - y * sin(a);
ty := x * sin(a) + y * cos(a);
end;
procedure duongsin(goc : real);
Trang 8var x,y,a,b,dx,tx,ty : real;
i,n : integer;
begin
setcolor(15);
a := -2*pi; b := 2*pi; n := 50; dx := (b-a)/n;
x := a; y := sin(x); quay(x,y,goc,tx,ty);
moveto(tox(tx),toy(ty));
for i := 1 to n do begin
x := x + dx; y := sin(x); quay(x,y,goc,tx,ty);
lineto(tox(tx),toy(ty));
end;
end;
BEGIN
gd := 0; initgraph(gd,gm,'C:\TP\BGI');
khoitao_cuaso;
vetruc;
duongsin(0);
duongsin(pi/4);
duongsin(pi/2);
duongsin(3*pi/4);
readkey;
END.
BÀI 9 VẼ CHONG CHÓNG QUAY BẰNG ĐỒ HOẠ RÙA
uses crt,graph;
var
ra,rx,ry, gd,gm, i : integer;
{CÁC THỦ TỤC CỦA HỆ ĐỒ HOẠ RÙA}
procedure right(a: integer);
begin
ra := ra - a;
if ra < 0 then ra := ra + 360;
end;
procedure RmoveTo(x,y : integer);
begin
rx := x; ry := y;
end;
procedure RLineTo(x,y : integer);
begin
Line(rx,ry,x,y);
rx := x; ry := y;
end;
procedure Rmove(d : integer);
var dx,dy : integer;
begin
dx := round(d*cos(ra*pi/180));
dy :=-round(d*sin(ra*pi/180));
rx := rx + dx; ry := ry + dy;
end;
procedure RLine(d : integer);
var dx,dy : integer;
begin
dx := round(d*cos(ra*pi/180));
dy :=-round(d*sin(ra*pi/180));
RLineTo(rx+dx,ry+dy);
end;
{Vẽ ngôi nhà kích thước cạnh là s}
procedure RHouse(s : integer);
begin
Trang 9Rline(s); Right(30);
Rline(s); Right(120);
Rline(s); Right(30);
Rline(s); Right(90);
Rline(s); Right(90);
end;
{Vẽ chong chóng là 6 ngôi nhà}
procedure Chongchong;
begin
for i := 1 to 6 do begin
RHouse(50);
Right(60);
end;
end;
{Cho chong chóng quay}
procedure Quay;
begin
repeat
setcolor(14);
chongchong;
delay(50);
setcolor(0);
chongchong;
right(10);
until keypressed;
end;
BEGIN
gd := 0; initgraph(gd,gm,'C:\TP\BGI');
RMoveTo(320,240); {chuyển rùa ra giữa màn hình}
quay;
readkey;
END.
BÀI 10 VẼ CÁC ĐƯỜNG XOẮN ỐC BẰNG ĐỒ HOẠ RÙA
uses crt,graph;
var
ra,rx,ry, gd,gm : integer;
{CAC THU TUC CUA HE DO HOA RUA}
procedure right(a: integer);
begin
ra := ra - a;
if ra < 0 then ra := ra + 360;
end;
procedure RmoveTo(x,y : integer);
begin
rx := x; ry := y;
end;
procedure RLineTo(x,y : integer);
begin
Line(rx,ry,x,y);
rx := x; ry := y;
end;
procedure Rmove(d : integer);
var dx,dy : integer;
begin
dx := round(d*cos(ra*pi/180));
dy :=-round(d*sin(ra*pi/180));
rx := rx + dx; ry := ry + dy;
end;
Trang 10procedure RLine(d : integer);
var dx,dy : integer;
begin
dx := round(d*cos(ra*pi/180));
dy :=-round(d*sin(ra*pi/180));
RLineTo(rx+dx,ry+dy);
end;
{Vẽ ngôi sao bằng hệ đồ họa rùa}
procedure Ngoisao;
var i : integer;
begin
SetColor(14);
ra := 0;
Rmoveto(50,100);
for i := 1 to 5 do begin
RLine(100); Right(144);
end;
end;
{Vẽ đa giác đều n cạnh}
procedure Dagiac;
var i,n : integer;
begin
SetColor(11);
ra := 0; Rmoveto(500,70);
n := 10;
for i := 1 to n do begin
RLine(30); Right(360 div n);
end;
end;
{Vẽ đường xoắn ốc polysprial}
procedure polysprial(d, dd, da, n : integer);
var i : integer;
begin
for i := 1 to n do begin
RLine(d);
Right(da);
d := d + dd;
end;
end;
procedure xoanoc;
begin
SetColor(12);
ra := 0; Rmoveto(100,340);
polysprial(5, 2, 90, 50); {xoắn ốc vuông, góc xoắn 90 độ}
SetColor(10);
ra := 0; Rmoveto(300,240);
polysprial(20, 5, 170, 70); {xoắn ốc hình sao, góc xoắn 170 độ}
SetColor(13);
ra := -50; Rmoveto(520,340);
polysprial(5, 2, 89, 50); {xoắn ốc hình nghiêng, góc xoắn 89 độ}
end;
BEGIN
gd := 0; initgraph(gd,gm,'C:\TP\BGI');
ngoisao;
dagiac;
xoanoc;
readkey;
END.