- Đường cong Bezier luôn đi qua điểm điều khiển đầu và cuối, vì vậy điểm A và D thuộc đường cong Bezier.. - Các điểm thuộc đường cong sẽ có tọa độ thỏa mãn công thức:.. ==> Tóm lại sẽ có
Trang 1Đồ họa máy tính (đề 2) Câu 1:
a, Viết thủ tục vẽ đoạn thẳng trong trường hợp m thuộc (1,+∞)
Procedure ve(x1,y1,x2,y2:real);
Var x, y, dx, dy, p, const1, const2 : real;
i : integer;
Begin
If (y1>y2) then
Begin
X:=x1; y:=y1;
X1:=x2; y1:=y2;
X2:=x; y2:=y;
End;
Dx:=x2-x1; dy:=y2-y1;
P:=2*dx-dy;
Const1:=2*dx-2*dy;
Const1:=2*dx;
X:=x1;
Y:=y1;
Putpixel(x,y,red);
y:=y+1;
For i:=y1 to y2 do
Begin
If (p>0 )then Begin
X:=x+1;
P:=p+const1;
End Else
P:=p+const2;
Putpixel(x,y,red);
Y:=y+1;
End;
End;
b, Tính tọa độ các điểm thuộc đoạn thẳng AB với A(15; 10), B(5; 5)
- Tính hệ số góc:
m = (y2-y1)/(x2-x1) = (5-10)/(5-15) = 1/2 (m ∈ (0; 1])
Xa >Xb đổi chỗ cho A và B > A(5,5), B(15,10)
Dx = x2 - x1 = 10
Dy = y2 - y1 = 5
P = 2dy - dx = 10 - 10 = 0
Trang 2Const1 = 2dy - 2dx = 10 - 20 = -10
Const2 = 2dy = 10
Lập bảng các điểm thuộc đoạn thẳng AB
Câu 2:
Viết chương trình mô phòng đồ thị hàm số y=x 3 + 3 với x ∈ [-3, 3] và ảnh của
nó qua phép đối xứng qua trục x=2, trên khung nhìn tùy chọn.
Uses crt,graph;
Var gd, gm : integer;
xw1, xw2, yw1, yw2, tlx, tly : real;
xv1, xv2, yv1, yv2 : integer;
Procedure cuaso(x1,y1,x2,y2:real);
Begin
Xw1:=x1;
Xw2:=x2;
Yw1:=y1;
Yw2:=y2;
End;
Procedure khungnhin(x1,y1,x2,y2:integer);
Begin
Xv1:=x1;
Xv2:=x2;
Yv1:=y1;
Yv2:=y2;
Tlx:=(xv2-xv1)/(xw2-xw1);
Tly:=(yv2-yv1)/(yw2-yw1);
End;
Procedure chuyenhequansat(x,y:real; var x1,y1:integer);
Begin
X1:=round(tlx*(x-xw1)+xv1);
Y1:=round(tly*(yw2-y)+yv1);
End;
Procedure chuyenden(x,y:real);
Var xm,ym:integer;
Begin
Trang 3Moveto(xm,ym);
End;
Procedure veden(x,y:real);
Var xm,ym:integer;
Begin
Chuyenhequansat(x,y,xm,ym);
lineto(xm,ym);
End;
(* Tìm ma trận phép biến đôi lấy tịnh tiến}
- Tịnh tiến x=2 về 0y
X’= x-2
−
=
1 0 2
0 1 0
0 0 1 1
T
- Lấy đối xứng qua trục 0y
x’= x
−
=
1 0 0
0 1 0
0 0 1 2
T
- Tịnh tiến trở lại
x’=x+2
+
=
1 0 2
0 1 0
0 0 1 3
T
Nhân 3 ma trận trên lại, ta được:
x’=-x+4
−
=
=
1 0 4
0 1 0
0 0 1 3 2 1
4 T xT xT T
*)
Procedure laydoixung(x,y:real; var xm,ym:real);
Begin
Xm:= -x+4;
Ym:=y;
End;
Procedure chuyendendx(x,y:real);
Var x1,y1 : real;
x2,y2:integer;
Begin
Laydoixung(x,y,x1,y1);
Chuyenhequansat(x1,y1,x2,y2);
Moveto(x2,y2);
End;
Trang 4Procedure vedendx(x,y:real);
Var x1,y1 : real;
x2,y2:integer;
Begin
Laydoixung(x,y,x1,y1);
Chuyenhequansat(x1,y1,x2,y2);
lineto(x2,y2);
End;
Begin
Gd:=0;
initgraph(gd, gm, ' \bgi');
Cuaso(-3,-24, 3, 31);
Khungnhin(150, 150, 300, 250);
rectangle(150, 150, 300, 250);
Dx:= 0.01;
X := xw1;
Y := x*x*x + 3;
Chuyenden(x,y);
{ve do thi}
Repeat
X := x+dx;
Y := x*x*x + 3;
If (x<xw2) then
Veden(x,y);
Until x>=xw2;
{ve anh}
X := xw1;
Y := x*x*x + 3;
Chuyendendx(x,y);
Repeat
X := x+dx;
Y := x*x*x + 3;
If (x<xw2) then
Vedendx(x,y);
Until x>=xw2;
Readln;
Closegraph;
End
Trang 5Câu 3: Tính tập hợp các điểm thuộc đường cong Bezier với 4 điểm điều khiển theo thứ tự: A(1, 1), B(5, 3), C(6, 4), D(7, 2) có độ phân hoạch (bước nhảy của tham biến u, u ∈ [0, 1]) ∆u=0.2, tọa độ của các điểm lấy chính xác 1 chữ số sau dấu phẩy.
- Đường cong Bezier luôn đi qua điểm điều khiển đầu và cuối, vì vậy điểm A và D thuộc đường cong Bezier.
- Các điểm thuộc đường cong sẽ có tọa độ thỏa mãn công thức:
.
Trong đó:
t ≡ u
L = 4-1 = 3
• u=0: Ứng với điểm A.
• u=0.2: Tọa độ của điểm này được tính như sau:
) 2 0 ( )
( )
2
0
0
3
∑
=
=
=
=
k k k L
k
L k
k B t P B P
P
1 3 1
1 3 1 0 3 0
0 3
0 .0,2 (1 0,2) 0,2.(1 0,2) )
2
0
3 3 2 3 2
2 3
2 .0,2 (1−0,2) − + 0,2 (1−0,2) −
+P C P C
= P0.0,512+P1.0,384+P2.0,096+P3.0,008
=(1;1).0,512+(5;3).0,384+(6;4).0,096+(7;2).0,008=(3,064;2,064) Điểm có tọa độ (X, Y) là 1 điểm thuộc đường cong Bezier.
• Tương tự tính cho trường hợp u = 0.4, 0.6, 0.8
• u=1: Ứng với điểm D.
==> Tóm lại sẽ có 6 điểm thuộc đường cong bezier