1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài tập đồ họa máy tính trên Pascal

10 3,1K 4

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 10
Dung lượng 95 KB

Nội dung

Trang 1

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 2

BÀ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 3

hinhtron(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 4

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 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 5

BÀ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 6

x[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 7

BÀ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 8

var 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 9

Rline(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 10

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 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.

Ngày đăng: 14/04/2017, 18:17

TỪ KHÓA LIÊN QUAN

w