Luận văn tốt nghiệp
Vẽ hình Ellipse:
Ellipse(int x1,int y1,intx2,int y2);
Hàm này có các tham tương tự các tham số hình chữ nhật, hàm này cũng thuộc lớp
CClientDC. Cú pháp vẽ hình Ellipse như sau:
CClientDC dc(this);
dc.ellipse(int x1, int y1, intx2, int y2);
Hàm loan vùng kín:
FloodFill(int x,int y, int color);
Hàm này dùng để tô màu vùng được giới hạn bởi một đường biên khép kín. Hàm này
thuộc lớp CClientDC có tác dụng tô màu với màu color tô hết vùng có tọa độ (x,y) và
một vùng kín bao quanh điểm đó. Cú pháp hàm như sau:
CClientDC dc(this);
dc.FloodFill(x, y, color);
Tạo các đường vẽ:
CreatePen(typeline, width, color);
Để tạo đường vẽ trong các ứng dụng vẽ ta xét hàm CreatePen của lớp Cpen, hàm này có
dạng như sau:
Cpen *pPen=new Cpen;
pPen->CreatePen(typeline, width, color);
Trong đó :
• Tham số typeline là kiểu đường vẽ, nó có giá trị được định nghĩa như sau:
PS-SOLID Đường thẳng đồng nhất.
PS-DASH Đường thẳng gồm các gạch ngang đứt nét.
PS-DOT Đường thẳng gồm các nét chấm đứt.
PS-DASDOT Đường thẳng gồm các gạch ngang chấm đứt.
PS-DASHDOTDOT Đường thẳng gồm các gạch ngang chấm đứt.
PS-NULL Đường thẳng vô hiệu lực không vẽ ra.
PS-INSIDEFRAME Đường thẳng nằm bên trong đường viền.
• Tham số width cho độ rộng của nét vẽ tính bằng pixel.
• Tham số color cho màu vẽ
b. Các hàm trong bộ thư viện OpenGL
OpenGL gồm 5 bộ hàm, bộ hạt nhân có 115 hàm cơ bản. Tên các hàm này bắt đầu
bằng GL. Windows NT hỗ trợ 4 chủng loại hàm khác, bao gồm thư viện OpenGL
utility(tên hàm bắt đầu bằng GLU), thư viện OpenGL auxiliary(tên hàm bắt đầu bằng
AUX), bộ hàm”WGL” (tên hàm bắt đầu bằng WGL), và các hàm WIN32 API (tên hàm
không có tiền tố đặc biệt). Bộ hàm hạt nhân cho phép thiết kế các hình dạng khác nhau,
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 5
Luận văn tốt nghiệp
tạo các hiệu quả chiếu sáng, kết hợp antialiasing và gán cấu trúc, thực hiện biến đổi ma
trận…
Do các hàm cơ bản được thể hiện ở nhiều dạng khác nhau tùy thuộc vào loại dữ liệu
mà chúng tiếp nhận, nên trên thực tế có hơn 300 nguyên mẫu (prototype) các hàm cơ bản.
Thư viện OpenGL utility gồm các hàm cao cấp. Các hàm này đơn giản hố
việc sử dụng hình ảnh cấu trúc, thực hiện việc biến đổi tọa độ mức cao, hỗ trợ tesselation
đa giác, và biểu diễn các đối tượng có cơ sở đa giác như hình cầu, hình trụ hình dĩa.
Thư viện OpenGl auxiliary gồm các hàm đặc biệt dùng đơn giản hóa các ví dụ
lập trình trong sách chỉ dẫn lập trình OpenGL. Các hàm phụ thuộc platform này thực hiện
các nhiệm vụ như quản ký cửa sổ, điều khiển xuất/nhập, vẽ các đối tượng 3D nhất định.
Do các hàm này có mực đích thiết minh nên không được dùng trong các mã sản xuất.
Các hàm “WGL”kết nối OpenGL với WINdows NT, cho phép người lập trình
xây dựng và chọn lựa các ngữ cảnh biểu diễn, tạo các bitmap font, các hàm này chỉ dùng
trên Windows NT.
Cuối cùng, các hàm Win32 API được dùng giải quyết các định dạng điểm ảnh
và tạo bộ đệm đôi.
Trong phần này, tôi trình bày một số hàm được sử dụng trong đề tài.
Hàm vẽ điểm, đường, đa giác:
Được bắt đầu bởi hàm:
glBegin (Glenum mode)
Để chỉ sự bắt đầu những đỉnh của một primitive, tham số mode chỉ kiểu các primitive.
Tham số mode có các giá trị sau:
GL_POINTS : chỉ đỉnh được sử dụng là điểm.
GL_LINES : chỉ những đỉnh được dùng để tạo đoạn thẳng.
GL_LINE_STRIP : chỉ những đỉnh được sử dụng tạo đoạn thẳng nhẵn.
GL_TRIANGLES : những đỉnh được sử dụng tạo ra những tam giác.
GL_TRIANGLE_STRIP : những đỉnh được sử dụng tạo ra tam giác có
cạnh nhẵn.
GL_POLYGON : những đỉnh được sử dụng tạo ra đa giác lồi.
glEnd ( )
Hàm trên dùng để chấm dứt danh sách các đỉnh mà nó chỉ rõ primitive được khởi tạo bởi
hàm glBegin.
Ví du: Vẽ đường thẳng từ 2 điểm
glBegin(GL_LINES)
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(50.0f, 50.0f, 50.0f);
glEnd( );
Hàm chỉ ra tọa độ của điểm, đường, đa giác:
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 6
Luận văn tốt nghiệp
glVertex2f (Glfloat x,Glfloat y)
glVertex3f (Glfloat x,Glfloat y,Glfloat z)
Hàm biến đổi tọa độ:
• glLoadIdentity(); thay thế ma trận hiện hành bởi ma trận đơn vị.
• glMultMatrix(); nhân ma trận hiện hành với ma trận được chỉ định.
• gl PopMatrix(void); lấy ma trận hiện hành từ stack.
• glPushMatrix(void); đẩy ma trận hiện hành vào stack.
• glTranslatef (Glfloat x, Glfloat y, Glfloat z); nhân ma trận hiện hành bởi ma
trận tịnh tiến.
• gl Rotatef(Glfloat Angle, Glfloat x, Glfloat y, Glfloat z); nhân ma trận hiện hành
bởi ma trận quay.
Các hàm liên quan đến màu:
• glColor3f (Glfloat red, Glfloat green, Glfloat blue); đặt màu hiện hành bởi các
thành phần red, green, blue với giá trị từ 0,0 đến 1,0.
• glClearColor(GLclampf red, GLclamp green, Glclamp blue, Glclamp alpha); đặt
màu cho việc xóa buffer màu.
• glClear(GL_COLOR_BUFFER_BIT); xóa buffer màu, xóa cửa sổ bởi màu xóa
hiện hành .
Các hàm liên quan đến ánh sáng:
• glLightf(Glenum light, Glenum pname, GLfloat param);
• glLighti(Glenum light, Glenum pname, GLint param);
Trong đó:
Tham số light chỉ ra nguồn sáng có giá trị từ GL_LIGHT0 đến GL_LIGHT7.
Tham số pname chỉ ra tham số light nào được lập như GL_AMBIENT,
GL_DIFFUSE…
Tham số param chỉ có ý nghĩa đối với nguồn sáng điểm. Tham số này có các
giá trị như: GL_SPOT_EXPONENT, GL_SPOT_CUTOFF…
Các hàm liên quan đến thuộc tính ánh sáng của vật liệu:
• glColorMaterialf(Glenum face,Glenum pname, GL float param);
• glMateriali(Glenum face,Glenum pname, GL int param);
• glMaterialfi(Glenum face,Glenum pname, const Glint* params);
• glMaterialfi(Glenum face,Glenum pname, const Glint* params);
Trong đó:
face: là thuộc tính bề mặt trước ,sau của đa giác.
pname: là thuộc tính của vật liệu: GL_AMBIENT,GL_DIFFUSE,…
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 7
Luận văn tốt nghiệp
param : chỉ định giá trị mà tham số pname được lập.
params: chỉ định dãy số nguyên hay thực chứa các thành phần thuộc tính được
lập.
• glFrontFace(Glenum mode); xác định bề mặt đa giác là mặt trước hay sau.
PHẦN II: NỘI DUNG
PHẦN II: NỘI DUNG
Trong phần giới thiệu tôi đã trình bày những nội dung sơ lược mang tính tổng quát
của đề tài. Phần nội dung tôi trình bày chi tiết hơn theo thứ tự logic các vấn đề từ lý
thuyết tốn học đến các thuật tốn chương trình.
I. LÝ THUYẾT CƠ SỞ TỐN HỌC
Các lý thuyết cơ sở tốn học được sử dụng cho các thuật tốn trong đề tài “THIẾT
KẾ HỆ THỐNG KIỂM TRA CÁC QUAN HỆ HÌNH HỌC“ bao gồm:
• Hình học giải tích trong mặt phẳng
• Hình học giải tích trong không gian.
Phần lý thuyết cơ sở tốn học này rất cần thiết cho việc thiết kế chương trình thực hiện
việc kiểm tra các quan hệ hình học, không gian vector là cơ sở lý thuyết tốn học tất yếu
để xây dựng các cấu trúc đồ họa máy tính.
I.1. Giới thiệu về vector:
I.1. Giới thiệu về vector:
Điểm (point): Mô tả các vị trí của đồ hình và có nhiều cách để diễn đạt. Trong hai
chiều biểu diễn bằng cách dùng bộ-2 để cho các tọa độ theo hai trục. Hai dạng thường
được áp dụng nhiều đó là dạng Cartesian như (x,y) =(3,4) hay dạng tọa độ cực (R,
θ)=(2.4,45
0
).
Trong khi chúng được định nghĩa một cách đại số theo các thao tác nhất định trên đó,
chúng cũng cho phép một diễn dịch hình học theo các điểm, đường, chiều.
Vector: Nhìn một cách hình học, vector là một đoạn thẳng mà các điểm đầu và
điểm cuối đã được xác định . Vector là một đối tượng có độ dài và chiều tương ứng với
một số thực thể vật lý như lực, khoảng cách, và vận tốc. Vector thường được vẽ như một
mũi tên có chiều dài chỉ về một hướng.
Khi vector được chọn để chỉ định hệ tọa độ, các vector có một hàm số để đưa ra hai hằng
số, ba hằng số, Vì thế, một trong các thể hiện của một vector hai chiều a là một cặp có
thứ tựï a=(a
x
, a
y
). Trong chương trình, vector được biểu diễn bằng kiểu dữ liệu:
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 8
Luận văn tốt nghiệp
Typedef struct
{
dx,dy: float;
} vector;
struct
{
dx,dy,dz : float;
} vector3D
Với hai điểm P
1
(x
1
,y
1
) và P
2
(x
2
,y
2
) ta định nghĩa vector v với các thành phần là
vector v =(x
2
-x
1
, y
2
-y
1
). Đôi khi vector này được ghi là P
1
P
2
và gọi là vector từ P
1
đến
P
2
. Bản thân vector không bị buộc vào một vị trí, mặc dù để dễ hình dung thường vẽ
chúng xuất phát từ một điểm. Với điểm bất kỳ P = (P
x
, P
y
) trong một hệ tọa độ, vector đi
từ gốc tọa độ với các tọa độ v=(P
x
, P
y
) được gọi là vector vị trí cho P. Vector 3D cũng
rất quan trọng trong đồ họa.
I.2. Các phép tính vector:
I.2. Các phép tính vector:
Một vector n chiều, với n là số nguyên dương bất kỳ:
W=(W1,W2,. . .,Wn)
với mỗi thành phần Wi là số vô hướng.
Các vector 2 chiều và 3 chiều với n=2, n=3 thì thường gặp nhất trong đồ hoạ Chúng ta
không thể thấy được các vector lớn hơn 3 nhưng chúng là những thành phần có giá
rị rât lớn.
Hai phép tính số học cơ bản trên vector là cộng hai vector và định tỷ lệ một vector.
Cộng hai vector
Tổng hai vector a,b là vector c được định nghĩa như sau:
C = (c
1
, c
2
, …, c
n
) = (a
1
+ b
1
, a
2
+ b
2
, …, a
n
+ b
n
)
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 9
x
P
2
v
P
4
P
3
v
P
1
y
P
5
b
a+b
a
a+b
b
a
Hình a
Hình b
a
a-c
c
-c
Luận văn tốt nghiệp
Hình a: Các thành phần của tổng là tổng các thành phần của các vector tham gia.
Hình b: Tổng các vector là đường chéo hình bình hành.
Procedure AddVectors( vector a, vector b; vector &c );
{
c.dx := a.dx + b.dx;
c.dy := a.dy + b.dy;
}
Định tỷ lệ một vector
Việc định tỷ lệ một vector nhằm thay đổi độ dài của hay đảo chiều của nó.
sa = (sa
1
, sa
2
, …, sa
n
)
Với s là hệ số tỷ lệ và a là vector. Khi s âm, chiều của sa ngược lại với a.
Procedure Scalar(real s; vector a; vector &b)
{
b.d
x
= s
∗
a.d
x
;
b.d
y
= s
y
a.d
y
;
}
Phép trừ hai vector:
Trên cơ sở cộng và định tỷ lệ, phép trừ dễ dàng định nghĩa:
a-c = a +(-c)
với thành phần thứ i là ai-ci.
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 10
Luận văn tốt nghiệp
Trị tuyệt đối (độ dài) của vector
Nếu một vector W được thể hiện trong không gian nhiều chiều (W
2
, W
2
, …, W
n
),
dựa theo định lý Pithagore ta có công thức sau:
) (
22
2
2
1 n
WWWW +++=
Vector có độ dài bằng zero thường được gọi là vector 0. Chương trình con minh họa như
sau: Function Length(vector v): Real;
•
Chuẩn hóa vector -Vector đơn vị
Việc định tỷ lệ một vector để kết qủa có độ dài bằng 1 gọi là chuẩn hố một vector,
và kết qủa gọi là vector đơn vị. Ví dụ dạng chuẩn hố u
a
của a như sau:
u
a
= a / | a|
và có cùng chiều với a.
Biểu thức cho hệ số của vector có thể khai báo trực tiếp như sau:
Normalize(vector v, vector &u);
Nó có dạng vector đơn vị u do các hệ số mỗi thành phần của v:
u.d
x
:= v.d
x
/Length(v);
u.d
y
:= v.d
y
/Length(v);
Tổ hợp tuyến tính của vector:
Để hình thành tổ hợp tuyến tính của hai vector V và W, định tỷ lệ mỗi vector theo các
tỷ số a và b rồi cộng kết qủa để thành vector mới av+bw.
Tổng quát, tổ hợp tuyến tính của m vector V
1
, V
2
, …, V
m
như sau:
W = a
1
V
1
+ a
2
V
2
+ …+ a
m
V
m
Procedure Combo2D(float a,b vector u,v ,vector &W );
{
w.dx:=a*u.dx+b*v.dx;
w.dy:=a*u.dy+b*v.dy;
}
• Tổ hợp lồi của vector
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 11
Luận văn tốt nghiệp
Một lớp đặc biệt của tổ hợp tuyến tính có vị trí quan trọng trong tốn học và ứng
dụng số học trong đồ họa, đó là:Tổ hợp lồi (convex combination), hay tổ hợp tuyến tính
mà các hệ số không âm và tổng bằng 1. Vậy tổ hợp tuyến tính:
W = a
1
V
1
+ a
2
V
2
+ … +a
m
V
m
là tổ hợp lồi nếu tổng
∑
i
a
=1và a
i
≥
0, và cung “spline” thực ra là tổ hợp lồi của
một tập các vector.
Tích vô hướng của hai vector:
Tích vô hướng của hai vector cho ta thông tin đáng giá về một cặp vector như góc giữa
chúng (cụ thể là khi nào chúng vuông góc) và chiếu vector lên vector khác. Nó cũng cho
ta phương trình của một mặt phẳng mô tả bằng một điểm và hai vector.
Cho hai vector, ví dụ hai chiều (a
1
,a
2
) và (b
1
,b
2
).
Tích vô hướng hai vector định nghĩa là:
a.b = a
1
b
1
+ a
2
b
2
Một cách tổng quát cho vector n chiều như sau: Cho Vector V= (v
1
, v
2
, …, v
n
) và
W=( w
1
, w
2
, …, w
n
), tích vô hướng củahai vector trên là:
V. W =
i
i
V
∑
W
với i = 1,… ,n
Tích vô hướng của hai vector được thể hiện trong thủ tục sau:
Procedure Float Dot (vector a,b)
{
return Dot = a.d
x
* b.d
x
+ a.d
y
* b.d
y
;
}
• Các tính chất của tích vô hướng
1. Đối xứng : a.b = b.a
2. Tuyến tính: (a+c).b = a.b + c.b
3. Đồng nhất : (sa).b = s(a.b)
4. | b
2
| = b.b
Độ dài của hiệu và tổng hai vector được cho như sau:
| a-b|
2
= |a|
2
- 2ab + |b|
2
| a+b|
2
= |a|
2 +
2ab + |b|
2
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 12
Luận văn tốt nghiệp
Các ứng dụng của tích vô hướng:
a. Góc giữa hai vector (hay hai đường)
Đây là ứng dụng quan trọng của tích vô hướng. Hình a dưới cho thấy góc θ giữa
hai vector a và b. Các vector này có thể có hai, ba, hay nhiều chiều. Chúng tạo thành
hai cạnh của tam giác, và cạnh thứ ba là a-b. Theo hệ thức lượng trong tam giác, ta có :
| a-b|
2
= |a|
2
+ |b|
2
- 2 |a||b|cos(θ)
Từ phương trình này và phương trình
| a-b|
2
= |a|
2
- 2ab + |b|
2
ta suy ra được: a.b = |a||b| cos(θ)
Nghĩa là cos(
θ
) = u
a
.u
b
Vậy cosin của góc giữa hai vector a và b là tích vô hướng của dạng chuẩn hóa hai
vector.
∗ Dấu cuả vector a.b và sự trực giao
Ta biết rằng
cos(
ϕ
) >0 nếu
ϕ
< 90
0
cos(
ϕ
) <0 nếu
ϕ
> 90
0
cos(
ϕ
) =0 nếu
ϕ
= 0
Do vậy từ phương trình:
cos(
ϕ
) = u
a
.u
b
ta có góc giữa hai vector như sau:
Nhỏ hơn 90
o
nếu a.b >0
Bằng 90
0
nếu a.b = 0
Lớn hơn 90
o
nếu a.b < 0
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 13
a
b
Hình a
a.b>0 a.b=0 a.b<0
a
a
a
b
b
b
c
a
e
b
x
y
Luận văn tốt nghiệp
b. Chiếu và phân tích vector:
Hình trên ta phân tích a thành c theo chiều vector b và e. Theo cách này vector c
gọi là chiếu trực giao của a lên b. Rõ ràng c có cùng chiều với b, ta còn phải tính độ lớn |
c|.
Theo phương trình a.b = |a||b|cos(
ϕ
) và hệ thức lượng tam giác ta có
phương trình:
|c| = |a|
( )
ba
ba.
= a.u
b
(*)
Như thế độ dài của c chỉ phụ thuộc vào độ dài của a. Bây giờ ta hình thành vector
c, bằng cách thêm chiều của b.
c = |c|.u
b
Sau đó, kết hợp với phương trình (*) trên ta có:
c = ( a.u
b
)u
b
c =
a.b
b
|b|
2
Ví dụ: trong hai chiều, chiếu của a = (6,4) lên b = (1,2) như hình dưới
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 14
Không có nhận xét nào:
Đăng nhận xét