Luận văn tốt nghiệp
Trong lónh vực công nghệ máy tính cũng như công nghệ thông tin có những
bước phát triển nhảy vọt, nó đã hỗ trợ vào mọi lónh vực trong cuộc sống xã hội, sản
phẩm của công nghệ thông tin biến đổi hàng ngày, hàng giờ. Trong lónh vực toán
học, các sản phẩm của công nghệ thông tin cũng hỗ trợ đắc lực cho việc học tập và
nghiên cứu.
Đề tài tôi thực hiện là: “THIẾT KẾ HỆ THỐNG KIỂM TRA CÁC QUAN HỆ
HÌNH HỌC TRONG KHÔNG GIAN 2D VÀ 3D“. Đề tài sử dụng ngôn ngữ lập trình
Visual C++ để thể hiện. Về góc độ học tập, nghiên cứu tôi thấy đề tài có thể giúp
hiểu rõ thêm về kiến thức cơ bản của phần đồ họa máy tính và cho vấn đề kiểm tra
thực hiện một số bài toán hình học thêm phong phú hơn, tạo thêm phần hấp dẫn
trong môn học này. Trong thời gian thực hiện đề tài tôi đã thực hiện được những yêu
cầu của đề tài.
Việc thực hiện đề tài còn mang ý nghóa đánh giá lại quá trình học tập, nghiên
cứu của tôi. Nên về mặt tinh thần tôi đã cố gắng tìm hiểu, nghiên cứu, và chuẩn bò
khá chu đáo cho việc thực hiện. Nhưng sự tiếp thu cũng có những giới hạn nhất
đònh, bởi trong lónh vực máy tính cũng như cơ sở toán học rộng lớn, không gian diễn
dòch có thể vô hạn, sự thực hiện một ý tưởng nào đó có thể trong toán học thực hiện
được, nhưng việc thể hiện thuật toán bằng máy tính thì có những vấn đề khó thể
thực hiện, vì vậy đề tài chắc chắn còn nhiều thiếu sót nhất đònh.
Mong quý Thầy cô, Anh chò và các bạn thông cảm, đóng góp ý kiến giúp đỡ.
Tôi thành thật cảm ơn …!
SINH VIÊN THỰC HIỆN
LÊ QUỐC THÁI
PHẦN I: GIỚI THIỆU
PHẦN I: GIỚI THIỆU
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 1
Luận văn tốt nghiệp
I. SƠ LƯC VỀ HỆ THỐNG KIỂM TRA CÁC QUAN HỆ HÌNH HỌC
Để cho người đọc tham khảo đề tài “THIẾT KẾ HỆ THỐNG KIỂM TRA
CÁC QUAN HỆ HÌNH HỌC“ dễ dàng hình dung được, tôi xin giới thiệu sơ lược về
đề tài.
Nhiệm vụ thực hiện của đề tài:
Thiết kế hệ thống kiểm tra các quan hệ hình học trong:
Không gian hai chiều (2D)
Không gian ba chiều (3D)
Với ngôn ngữ thể hiện trên môi trường Visual C++.
Đề tài áp dụng các kiến thức về cơ sở toán học và không gian vector trong đồ
họa máy tính, để xây dựng những thuật toán kiểm tra các quan hệ hình học.
Để dễ dàng hơn tôi xin trình bày một ví dụ điển hình như sau:
Ví dụ: cho đường thẳng a qua hai điểm A và B và đường thẳng b qua hai điểm C
và D trong không gian 2D hay 3D thì hai đường thẳng này cũng có những sự tương
quan với nhau, như trùng nhau, cắt nhau với một góc nào đó, chéo nhau (trong
không gian 3D), hay song song… Sau khi đưa vào những điều kiện giả thiết ban đầu
(Input), thì chương trình thực hiện và đưa ra kết quả kiểm tra (output) của giả thiết
trên là hai đường thẳng a và b đã tương quan như thế nào với nhau? Cắt nhau một
góc bao nhiêu độ, song song, hay trùng nhau...
Đó là về mặt thuật toán chương trình kiểm tra, đây chỉ mới là một tác vụ thực
hiện của vấn đề này. Với bài toán như trên nếu chỉ đưa ra được những kết luận với
những dòng thông điệp thì chúng ta thấy rằng đề tài trở nên quá đơn giản không
phong phú và hấp dẫn qua ý kiến của người đọc hoặc tham khảo. Một tác vụ cùng
đồng thời với bài toán trên mà nhiệm vụ của đề tài yêu cầu thực hiện là khi đưa
vào giả thiết bài toán chẳng hạn hai điểm A và B với những tọa độ xác đònh nào
đó, qua hai điểm này sẽ thực hiện vẽ lên một đoạn thẳng qua hai điểm A và B. Từ
đó thấy vấn đề một cách trực quan hơn, hay vẽ ra góc giữa hai đường thẳng, chính
với những thể hiện này đề tài trở nên hấp dẫn phong phú hơn, tất nhiên vấn đề này
không ít những khó khăn cho người thực hiện đề tài.
Trong phần nội dung tôi sẽ trình bày chi tiết hơn về đề tài “THIẾT KẾ HỆ
THỐNG KIỂM TRA CÁC QUAN HỆ HÌNH HỌC TRONG 2D VÀ 3D“.
II. GIỚI THIỆU SƠ LƯC NGÔN NGỮ THỂ HIỆN ĐỀ TÀI
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 2
Luận văn tốt nghiệp
II. 1
. SƠ LƯC NGÔN NGỮ
Ở phần I giới thiệu sơ lược về “THIẾT KẾ HỆ THỐNG KIỂM TRA CÁC
QUAN HỆ HÌNH HỌC“, tôi đã trình bày một ví dụ về yêu cầu nhiệm vụ để thực
hiện một tác vụ kiểm tra vấn đề nào đó của đề tài này. Để thực hiện những vấn đề
đó tôi nghiên cứu và thực hiện trên môi trường ngôn ngữ Visual C++.
Visual C++ là một phần mềm lập trình hướng đối tượng được phát triển trên cơ
sở là ngôn ngữ lập trình C và C++. Ở đây tôi thể hiện đề tài trên ngôn ngữ Visual
C++ bởi lẽ hiện nay ngôn ngữ này được xem là một trong các ngôn ngữ hỗ trợ
(support user) mạnh và phổ biến nhất. Cùng mục đích sâu xa hơn nữa là để cho
những đề tài sau này có thể trên cùng ngôn ngữ xây dựng ý tưởng của đề tài
“THIẾT KẾ HỆ THỐNG KIỂM TRA CÁC QUAN HỆ HÌNH HỌC“ ngày thêm một
đầy đủ, phong phú, hấp dẫn và ứng dụng mang tính thiết thực hơn. Tôi đầu tiên
nghiên cứu tìm hiểu tổng quát về ngôn ngữ như Visual C++, thực hiện những
chương trình điển hình trên ngôn ngữ lập trình hướng đối tượng. Và phần tìm hiểu
chính là phần thực hiện yêu cầu của đề tài, cụ thể là về phương diện tính toán trong
những thuật toán và thể hiện trực quan bằng đồ hoạ máy tính trên ngôn ngữ Visual
C++.
Trong Visual C++ phần đồ họa được thể hiện trong lớp CDC (Class Device
Context) với nhiều hàm thành viên hỗ trợ cho việc vẽ điểm, đường, đa giác, tô
màu…. Đặc biệt hơn trong ngôn ngữ Visual C++ có sự hỗ trợ cho việc vẽ các đối
tượng hình học bằng chuột. Nhưng ngôn ngữ chỉ thực hiện được với các đối tượng
hình học 2D, đối tượng hình học 3D thì chưa có, cần phải tự thiết kế.
Trong quá trình nghiên cứu, tôi nhận thấy trong ngôn ngữ Visual C++ có bộ thư
viện OPENGL là một thư viện API hỗ trợ cho việc thực hiện các chương trình đồ
họa, trên cả 2D và 3D rất mạnh, chính vì thế ở phần kiểm tra các quan hệ hình học
phần 3D tôi thực hiện trên OPENGL. Từ đây tôi chuyển hướng sang nghiên cứu
OPENGL để thực hiện cho phần 3D. Để hiểu và thực hiện được trên nó cũng khó
khăn không kém như ta bắt đầu nghiên cứu và làm quen với ngôn ngữ mới như
Visual C++. Sau khi nghiên cứu và hiểu được những yếâu tố cơ bản của OPENGL tôi
có nhận xét rằng OPENGL là một ứng dụng để thực hiện các chương trình đồ họa
máy tính hấp dẫn và đẹp mắt. Khi đã cài được thì cách sử dụng có phần dễ dàng
hơn, chỉ cần tìm hiểu một số các hàm trong thư viện các hàm thành viên của
OPENGL là đáp ứng được yêu cầu. Còn mọi việc thực hiện cài đặt theo lý thuyết
đồ họa máy tính như các phép biến hình, thiết lập chế độ màn hình, khởi tạo đồ
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 3
Luận văn tốt nghiệp
họa, setviewport, tạo các Pallette màu, thiết lập độ sâu hình ảnh, độ phản chiếu hình
ảnh, độ tương phản … tất cả do OPENGL hỗ trợ hầu hết.
OpenGL được đònh nghóa là “giao diện phần mềm cho phần cứng đồ họa ”.
Thực chất, OpenGL là một thư viện các hàm đồ họa, được xem là tiêu chuẩn thiết
kế công nghiệp cho đồ họa ba chiều.
Với giao diện lập trình mạnh mẽ, OpenGL cho phép tạo các ứng dụng 3-D phức
tạp với độä tinh vi, chính xác cao, mà người thiết kế không phải đánh vật với các núi
công thức toán học và các mã nguồn phức tạp. Và do OpenGL là tiêu chuẩn công
nghiệp, các ứng dụng tạo từ nó dùng được trên các phần cứng và hệ điều hành khác
nhau.
Nhận xét về OPENGL tôi thấy rằng OPENGL là thư viện đồ họa trên
WINDOWS bởi vì ta có thể thấy rằng OPENGL không những thực hiện trên ngôn
ngữ Visual C++ mà còn có thể cho phép thực hiện trên cả Visual Basis , Borland C+
+
II. 2. GIỚI THIỆU CÁC HÀM CỦA NGÔN NGỮ ĐƯC SỬ DỤNG
a. Các hàm của lớp CDC (Class Device Context)
Trong CDC có rất nhiều hàm thành viên phục vụ cho quá trình kết xuất các hình
ảnh ra các thiết bò. Trong phần thực hiện đề tài, tôi xin đưa ra các hàm được sử dụng
trong đề tài
Vẽ điểm:
SetPixel ( int x , int y , int color );
Hàm này thuộc lớp CClientDC trong phần màu sử dụng macro
RGB(red,green,blue)
Ví du:ï Để vẽ một điểm , ta thực hiện như sau:
CClientDC dc( this );
dc.SetPixel (100,100,GRB(0,0,0);
Để thể hiện tọa độ một điểm trong hệ trục tọa độ hai chiều, Visual C++ dùng lớp
CPoint, đối tượng thuộc lớp này được thể hiện bởi hai thành phần x và y. Ví dụ ta
khai báo điểm point như sau:
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 4
Luận văn tốt nghiệp
CPoint point
point.x=100;
point.y=100;
Vẽ đường thẳng:
Line (int x1, int y1, int x2, int y2);
Hàm này thuộc lớp CClientDC
Ví dụ: Để vẽ đường thẳng ta thực hiện các bước sau đây
CClientDC dc(this);
dc.Line(x1,y1,x2,y2);
Ngoài ra trong việc vẽ đường thẳng còn có thể sử dụng hai hàm sau:
MoveTo(int x, int y);
Hàm này dùng để di chuyển con trỏ đến tọa độ x,y trong màn hình.
LineTo(int x, int y);
Hàm này dùng để vẽ đường thẳng từ điểm hiện hành đến điểm x, y.
Cả hai hàm này đều thuộc lớp CClientDC, việc sử dụng như sau:
CClientDC dc(this);
dc.MoveTo(x,y);
dc.LineTo(newx, newy);
Vẽ hình chữ nhật:
Rectangle(int x1,int y1,int x2,int y2);
Hàm này thuộc lớp CclientDC. Dùng để vẽ hình chữ nhật có tọa độ trên góc trên trái
là (x1,y1) và tọa độ góc dưới phải là (x2,y2). Cú pháp vẽ hình chữ nhật như sau:
CClientDC dc(this);
dc.Rectangle(x1, y1, x2, y2);
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:
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
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ế
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
các hình dạng khác nhau, 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
hoá 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.
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
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:
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 đó:
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
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,…
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 toán học đến các thuật toán chương trình.
I. LÝ THUYẾT CƠ SỞ TOÁN HỌC
Các lý thuyết cơ sở toán học được sử dụng cho các thuật toá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
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 9
Luận văn tốt nghiệp
• Hình học giải tích trong không gian.
Phần lý thuyết cơ sở toá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 toá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:
Typedef struct
{
dx,dy: float;
} vector;
struct
{
dx,dy,dz : float;
} vector3D
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 10
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
Luận văn tốt nghiệp
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
)
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.
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 11
a
a-c
c
-c
Luận văn tốt nghiệp
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.
Trò tuyệt đối (độ dài) của vector
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
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 hoá một
vector, và kết qủa gọi là vector đơn vò. Ví dụ dạng chuẩn hoá 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 13
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 toá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:
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 14
Luận văn tốt nghiệp
| a-b|
2
= |a|
2
- 2ab + |b|
2
| a+b|
2
= |a|
2 +
2ab + |b|
2
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
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 15
a
b
Hình a
a.b>0 a.b=0
a.b<0
a
a
a
b
b
b
Luận văn tốt nghiệp
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
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
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 16
c
a
e
b
x
y
Luận văn tốt nghiệp
|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
Hình chiếu của c nằm dài hơn b kể từ gốc, từ phương trình trên ta có độ dài
của c là (2.8, 5.6), vector e = a-c = (3.2, -1.6 ).
c. Dạng điểm chuẩn cho đường và mặt phẳng
Dạng điểm chuẩn cho đường và cho mặt phẳng dùng nhiều trong đồ họa như
việc cắt loại bỏ đường bò che và tô đa giác.
Xét đường L đi qua điểm A = (A
x ,
A
y
) theo chiều vector c = (c
x
,c
y
), ta có
vector n vuông góc với vector c nghóa là c.n = 0, cũng có nghóa là c
x
.n
x
+ c
y
.n
y
=0,
hay:
c
y
/ c
x
=
-n
x
/
n
y
Điều kiện n trực giao với c cho ta suy ra n có thể là bội số bất kỳ của (c
x
,
c
y
), có hai chiều đối nhau. Để có phương trình cho đường L, xét điểm bất kỳ R =
(x,y) trên L. Vector R phải vuông góc với n, nên n.(R-A) = 0. Ta có thể viết lại như
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 17
A
c
n
L
L
cn
x
y
Luận văn tốt nghiệp
sau: nR=nA, nhưng không thể nhân điểm với vector được. Ta thay vector R bằng r đi
từ gốc và thay A bằng a. Như vậy, các tính toán đều phụ thuộc vào việc chọn gốc
tọa độ, còn phương trình đường thẳng vẫn phụ thuộc vào gốc không có gì thay đổi.
Như vậy ta có:
n.r = D Với D = n.a = n
x
Ax + n
y
Ay
Đây là phương trình điểm chuẩn cho đường. Phương trình này có thể viết dạng quen
thuộc như sau:
n
x
x + n
y
y = D
• Mở rộng dạng điểm cho mặt phẳng
Các mặt phẳng cũng có thể biểu diễn ở dạng chuẩn điểm. Một mặt phẳng
hoàn toàn được xác đònh với một điểm S = (s
x
, s
y
, s
z
) nằm trong đó và hướng chuẩn
của mặt phẳng. Chuẩn cho mặt phẳng được hiểu là vuông góc với mọi đường trong
mặt phẳng. Gọi hướng chuẩn là n= (n
x
, n
y
, n
z
). Với điểm R= (x, y, z) bất kỳ trong
mặt phẳng, xây dựng vector từ R đến S, vuông góc với n.
n.(R-S) = 0
Thay R-S bằng r -s và dùng tính tuyến tính, ta được:
n.r = D với D = n.s
Đây là phương trình điểm chuẩn của mặt phẳng. Mọi điểm trên mặt phẳng có cùng
tích vô hướng với chuẩn. Nghóa là mọi điểm có cùng hình chiếu lên n.
Phương trình mặt phẳng P thường viết là: Ax + By + Cz = D
Tư ø tích vô hướng của phương trình ta thấy rằng dạng điểm chuẩn thực ra là:
n
x
X + n
y
Y + n
z
Z = D
Với A = n
x
, B = n
y
, và C = n
z
. Điều này cho thấy (A, B, C) là chiều chuẩn của mặt
phẳng.
Điểm trên mặt gần gốc nhất là điểm chiếu vuông góc của gốc lên mặt. Như vậy nó
tỉ lệ với n, gọi là Kn, nên khoảng cách là| Kn |. Vì Kn nằm trên mặt nên n. (Kn)=D.
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 18
S
n
Luận văn tốt nghiệp
d. Kiểm tra nửa không gian trong và ngoài của một điểm
Xét điểm Q, giả sử đường E đi qua điểm A và có chuẩn hướng ra n như hình vẽ:
Góc
ϕ
giữa n và
Q -A < 90
0
, nếu Q nằm phía ngoài, vì vậy tích n.(Q - A) > 0. Tương tự, góc
ϕ
sẽ lớn
hơn 90
0
nếu Q nằm phía trong, vì vậy n.(Q -A) < 0. Cuối cùng,
ϕ
= 90
0
nếu Q nằm
trên E, và n .(Q - A) = 0. Nếu thay Q -A bằng vector q - a và gọi đặt a.n = D, thì
đường E được cho bởi phương trình n.p = D, và ta viết lại thủ tục kiểm tra điểm Q
với vector biểu diễn q sẽ nằm:
1. Ở nửa không gian phía ngoài của E nếu q.n > D.
2. Trên E nếu p.n = D.
3. Ở nửa không gian phía trong của E nếu q.n < D.
• Mở rộng cho mặt phẳng
Giả sử mặt P qua điểm A và có vector chuẩn hướng ra n thì điểm Q sẽ:
1. Ở nửa không gian phía ngoài của P nếu T=(q-a).n > 0
2. Trên P nếu (q-a).n=0
3. Ở nửa không gian phía trong của P nếu (q-a).n<0.
e. Cắt đường thẳng với cửa sổ lồi
Ta dùng kiểm tra trong-ngoài để xây dựng công cụ cắt hữu hiệu với cửa sổ là đa
giác lồi bất kỳ. Cửa sổ W chứa một đa giác lồi cùng với đường thẳng L từ P
1
tới P
2
.
Ta muốn xác đònh phần thấy của L nằm trong W. Đa giác lồi nên phần trong cửa sổ
được đònh nghóa là vùng nằm ở nửa không gian phía trong của mỗi cạnh của W.
Đoạn L được kiểm tra đối với mỗi cạnh của W, và phần nằm ở nửa không gian phía
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 19
ϕ
n
E
E
A
inside
E
PP
PP
PP
PP
c
c
n
n
E E
Luận văn tốt nghiệp
ngoài được loại ra. Sau khi mọi cạnh đã được kiểm tra, phần còn lại của L sẽ nằm
trong W.Ta biểu diễn L ở dạng tham số:
P(t) = P
1
+ ct với c = P
2
- P
1
.
Với mỗi cạnh cửa sổ, dùng hai giá trò t
in
và t
out
để giữ lại vùng của t mà đoạn
có thể nằm trong cửa sổ. Nghóa là không thể thấy đoạn ở ngoài khoảng (t
in
, t
out
). Giá
trò bắt đầu cho t
in
và t
out
là 0 và 1. Khoảng này liên tục được cắt xén khi xử lý
xong mỗi cạnh. Nếu lúc nào khoảng này thành rỗng, thoát ra khỏi thuật giải cắt, và
đoạn L hoàn toàn bò cắt. Còn không thì khoảng (t
in
, t
out
) xác đònh phần của L nằm
trong cửa sổ. Vì W lồi, mỗi cạnh E của nó có thể cho là đường cho ở dạng điểm
chuẩn:
n.p = D
Với n là chuẩn hướng ra của cạnh. Bây giờ E có thể có một số tình huống so với
đường L.
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 20
w
L
PP
PP
Luận văn tốt nghiệp
• E song song L: nếu n trực giao với c (nghóa là: n .c= 0). Như vậy L sẽ nằm
hoàn toàn ở trong hoặc ở ngoài cửa sổ. Để xét tiếp, chọn điểm bất kỳ trên L, là P
1
và kiểm tra trong-ngoài. Đặt p
1
= P
1
- 0 là vector từ gốc tọa độ đến P
1
. L sẽ hoàn
toàn nằm trong nếu:
p
1
.n < D
Ngược lại L hoàn toàn nằm ngoài.
• E không song song với L: L phải cắt cạnh E tại ti, để tính ti dùng phương
trình:
ti=( D - n.p
1
) /n.c
Nếu chiều c của nó nhỏ hơn 90
0
kể từ n ( n.c > 0) thì đường sẽ đi ra. Ngược
lại sẽ đi vào. Nếu đi vào, thì phần với t < ti sẽ không thấy được, và t
in
được gán là
ti(nếu t
in
< ti). Ngược lại, thì phần với t > ti sẽ không thấy được, và t
out
được giảm
về ti(nếu ti < t
out
). Khi kết thúc, giá trò của t
in
và t
out
sẽ được thay vào P
1
+ ct, để
có được các điểm đầu của đường bò cắt.
Tích hai vector
Tích vector của hai vector là một vector. Một trong nhiều tính chất hữu dụng của
nó là nó trực giao với hai vector ban đầu. Tích vector chỉ được đònh nghóa cho vector
ba chiều, nhưng nó cũng áp dụng trong một số vấn đề trong đồ họa liên quan đến đa
giác hai chiều.
Cho vector a=(a
x
, a
y
, a
z
) và b=(b
x
, b
y
, b
z
) tích vector của chúng viết là a x b. Nó
được đònh nghóa theo các vector đơn vò chuẩn i, j, k như sau:
a x b = (a
y
.b
z
- a
z
.b
y
).i + (a
z
.b
x
- a
x
.b
z
).j + (a
x
.b
y
- a
y
b
x
).k
• Từ đònh nghóa suy ra các tính chất đại số sau:
1. i x j = k
j x k = i
i x k = j
2. a x b = -b x b
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 21
Luận văn tốt nghiệp
3. a x (b + c) = a x b +a x c
4. (sa) x b = s(a xb)
• Ý nghóa hình học của tích vector:
1. ax b trực giao với cả a và b.
2. Độ dài a x b bằng diện tích hình bình hành xác đònh bởi a và b.
Diện tích này là:
|a x b| = |a||b|sin(
ϕ
)
với
ϕ
là góc giữa a và b, đo từ a đến b hay ngược lại miễn sao góc nhỏ
hơn 180
0
.
3. Chiều của a x b xác đònh từ quy tắc bàn tay phải khi làm việc trong
hệ tay phải.
Tích bộ ba vô hướng
Cho ba vector a, b, c kết hợp chúng cho ra số vô hướng như sau:
S = a.(b x c) = a
x
(b
y
c
z
-b
z
c
y
) + a
y
(b
z
c
x
- b
x
c
z
) + a
z
(b
x
c
y
- b
y
c
x
).
Ta co:ù S = a.(b x c) = b.(c x a) = c.(a x b)
Tích bộ ba vô hướng có ý nghóa hình học đơn giản. Giá trò của nó là thể tích của khối
lăng trụ tạo bởi các vector a,b, c. Dấu của tích bộ ba vô hướng tùy theo
cos (
ϕ
) dương nếu
ϕ
< 90
0
và âm nếu
ϕ
> 90
0
.
Phương trình mặt phẳng
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 22
a x b
Thể tích a x b x c
a
b
c
ϕ
Luận văn tốt nghiệp
Trong không gian, qua 3 điểm A (x
a
, y
a
, z
a
), B(x
b
, y
b
, z
b
), và C(x
c
, Y
c
, z
c
) không
thẳng hàng xác đònh được phương trình mặt phẳng như sau:
Ta có vector AB = (x
b
-x
a
, y
b
-y
a
, z
b
-z
a
) và
AC = (x
c
-x
a
, y
c
-y
a
, z
c
-z
a
)
Tích hữu hướng của hai vector AB và AC là pháp vector n của mặt phẳng mp(ABC).
Vector n có tọa độ như sau:
n = ((y
b
-y
a
)*(z
c
-z
a
) - (y
c
-y
a
)*(z
b
-z
a
),
(z
b
-z
a
)*(x
c
-x
a
) - (z
c
-z
a
)*(x
b
-x
a
),
(x
b
-x
a
)*(y
c
-y
a
) - (x
c
-x
a
)*(y
b
-y
a
))
Nếu chúng ta đặt:
a
1
= (y
b
-y
a
)*(z
c
-z
a
) - (y
c
-y
a
)*(z
b
-z
a
)
b
1
= (z
b
-z
a
)*(x
c
-x
a
) - (z
c
-z
a
)*(x
b
-x
a
)
c
1
= (x
b
-x
a
)*(y
c
-y
a
) - (x
c
-x
a
)*(y
b
-y
a
)
d
1
= - x
a
a
1
- y
a
b
1
- z
a
c
1
thì vector n có thể viết lại như sau: n = (a
1
, b
1
, c
1
)
Phương trình mặt phẳng được xác đònh theo đònh thức cấp 3 như sau:
Phương trình mặt phẳng mp(ABC) ở dạng tổng quát:
a
1
X + b
1
Y+ c
1
Z + d
1
= 0
Phương trình đường thẳng
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 23
x-xx x -x- x -x-
y-yy y -y- y -y-
z-zz z -z- z -z-
= 0
Luận văn tốt nghiệp
Trong không gian cho hai điểm A (x
a
, y
a
, z
a
), B(x
b
, y
b
, z
b
) sẽ xác đònh được
phương trình đường thẳng đi qua hai điểm A ,B như sau:
Vector AB = (x
b
- x
a
, y
b
- y
a
, z
b
-z
a
) là vector chỉ phương của đường thẳng qua hai
điểm A, B (để gọn hơn ta viết vector chỉ phương AB=(a
1
, a
2
, a
3
), phương trình của
đường thẳng có ba dạng như sau:
• Phương trình tham số:
X = a
1
t + x
a
Y = a
2
t + y
a
Z = a
3
t + y
a
• Phương trình dạng chính tắc:
1
a
xX
a
−
=
2
a
yY
a
−
=
3
a
zZ
a
−
(với điều kiện a
1
, a
2
, a
3
<> 0 )
• Phương trình dạng tổng quát:
a
2
(x - x
a
) = a
1
( y - y
a
)
a
1
(z - z
a
) = a
3
( x - x
a
)
Hệ phương trình trên tương đương với hệ phương trình sau:
a
2
x - a
1
y + 0 + a
1
y
a
- a
2
x
a
= 0
a
3
x + 0 - a
1
z + a
1
z
a
- a
3
x
a
= 0
Phương trình tổng quát của đường thẳng qua 2 điểm trong không gian là hệ phương
trình bậc nhất 3 biến x, y, z như trên.
II. CÁC ĐỐI TƯNG HÌNH HỌC VÀ SỰ TƯƠNG QUAN
Trong phạm vi của môn hình học thì không gian diễn dòch của nó rất lớn, chính vì
vậy tôi thiết kế thuật toán trên các đối tượng hình học cơ bản. Và từ những thuật
toán này chúng ta có thể mở rộng ra cho một diễn dòch rộng lớn hơn.
II.1. CÁC QUAN HỆ HÌNH HỌC TRONG 2D
1.Các đối tượng hình học cơ bản:
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 24
Luận văn tốt nghiệp
• Điểm
• Đường thẳng
• Đa giác
2.Sự tương quan giữa các đối tượng hình học:
• Điểm - Đường thẳng.
• Điểm - Đa giác.
• Đường thẳng - Đường thẳng.
• Đường thẳng - Đa giác.
• Đa giác - Đa giác.
3.Kiểm tra sự tương quan giữa các đối tượng hình học:
a. Điểm - Đường thẳng
Kiểm tra điểm có thuộc đường thẳng?
Tính khoảng cách từ điểm đến đường thẳng nếu điểm không
thuộc đường thẳng.
b. Điểm - Đa giác
Kiểm tra điểm bên trong hay bên ngoài đa giác?.
c. Đường thẳng - Đường thẳng
Kiểm tra hai đường thẳng trùng nhau, cắt nhau hay song
song.
Tính góc giữa hai đường thẳng.
Tính hình chiếu của đoạn thẳng trên đường thẳng.
d. Đường thẳng - Đa giác
Kiểm tra đường thẳng nằm bên trong hay bên ngoài đa giác.
Clip một đoạn thẳng vào đa giác.
e. Đa giác - Đa giác
Kiểm tra sự tương quan giữa hai đa giác.
• Cắt nhau?
• Lồng nhau hay rời nhau?
• Tính diện tích giao nhau của hai đa giác.
Kiểm tra đa giác lồi, lõm.
Thiết kế hệ thống kiểm tra các quan hệ hình học trang 25