You are on page 1of 47

TRƯỜNG ĐẠI HỌC BÁCH KHOA

KHOA CÔNG NGHỆ THÔNG TIN

ĐỒ ÁN LẬP TRÌNH TÍNH TOÁN


ĐỀ TÀI: 507
NỘI SUY ĐƯỜNG CONG B-SPLINE
ĐỒNG NHẤT

Người hướng dẫn: PGS. TS. NGUYỄN TẤN KHÔI


Sinh viên thực hiện:
TÊN: Huỳnh Lê Đắc Tài
LỚP: 20TCLC_DT3
NHÓM: 20.99B

Đà Nẵng, 06/2021
Đồ án Lập trình tính toán

MỤC LỤC

MỤC LỤC............................................................................................................1
DANH MỤC HÌNH VẼ.......................................................................................2
MỞ ĐẦU.............................................................................................................. 3
1. Tổng quan đề tài...............................................................................................4
2. Cơ sở lý thuyết..................................................................................................4
2.1 Nội suy các điểm dữ liệu............................................................................4
2.2 Đường cong B-spline đồng nhất.................................................................4
2.3 Tính chất đường cong B-spline...................................................................5
2.4 Vecto nút....................................................................................................9
2.5 Hàm cơ sở...................................................................................................9
3. Tổ chức cấu trúc dữ liệu và thuật toán............................................................12
3.1 Phát biểu bài toán......................................................................................12
3.2 Cấu trúc dữ liệu........................................................................................13
3.3 Thuật toán.................................................................................................13
3.4 Các ví dụ minh họa...................................................................................14
4. Chương trình và kết quả.................................................................................22
4.1 Tổ chức chương trình................................................................................22
4.2 Ngôn ngữ cài đặt.......................................................................................24
4.3 Kết quả......................................................................................................24
Ví dụ 1 :......................................................................................................24
Ví dụ 2:.......................................................................................................28
4.4 Nhận xét và đánh giá................................................................................30
5. Kết luận và hướng phát triển...........................................................................30
5.1 Kết luận....................................................................................................30

Trang 1
Đồ án Lập trình tính toán

5.2 Hướng phát triển.......................................................................................30


TÀI LIỆU THAM KHẢO..................................................................................31
PHỤ LỤC...........................................................................................................32

Trang 2
Đồ án Lập trình tính toán

DANH MỤC HÌNH VẼ


Hình 2.1. Hình ảnh tái tạo đường cong từ các điểm dữ liệu D
Hình 2.2 Ảnh hưởng của các bậc đến hình dạng của đường cong
Hình 2.3 Tính bao lồi của đường cong B-spline
Hình 2.4. Đường cong B-spline bậc p = 3 và đồ thị các hàm cơ sở
Hình 2.5. Các nút trong và khoảng tham số xác định của đường cong B-spline
Hình 3.1 Hình ảnh đường cong được tái tạo của ví dụ 1
Hình 3.2 Hình ảnh đường cong được tái tạo của ví dụ 2
Hình 4.1 Giao diện chương trình trước khi nhập dữ liệu.
Hình 4.2 Giao diện chương trình khi kết thúc.
Hình 4.3 Kết quả được in ra file ouput.txt
Hình 4.4. Tọa độ các đỉnh và vector nút được nhập vào trang web
Hình 4.5. Đường cong được tái tạo 3D nhờ vào trang web
Hình 4.6 Giao diện chương trình khi kết thúc với bộ dữ liệu của ví dụ 2
Hình 4.7. Kết quả được in ra file ouput.txt với bộ dữ liệu của ví dụ 2
Hình 4.8. Tọa độ các đỉnh và vector nút được nhập vào trang web
Hình 4.9. Đường cong được tái tạo 3D nhờ vào trang web

Trang 3
Đồ án Lập trình tính toán

MỞ ĐẦU

Công nghệ thông tin ngày càng phát triển mạnh mẽ và dồ họa máy tính là một
lĩnh vực công nghệ phát triển rất nhanh. Đồ họa đã được áp dụng rộng rãi trong nhiều
lĩnh vực khác nhau từ khoa học, công nghệ, y tế, kỹ thuật đến giải trí… Đồ họa máy
tính phát triển dựa trên các kết quả của hình học khác, đặc biệt bao gồm đại số và giải
tích. Hiện nay, với sự phát triển của phần cứng máy tính, đồ họa cũng phát triển nhanh
hơn, tuy vậy nền tảng của nó vẫn là cơ sở mô hình hóa hình học. Có nhiều bài toán đặt
ra trong đồ họa máy tính. Một trong những bái toán cơ bản của nó là xử lí các đường
cong và mặt cong.

Trang 4
Đồ án Lập trình tính toán

1. Tổng quan đề tài


Bản báo cáo trình bày phương pháp tái tạo đường và mặt cong tham số từ tập
điểm dữ liệu cho trước với một độ chính xác cho phép, ở đây là đường cong B-spline
đồng nhất. Để tái tạo đường cong và mặt cong tham số, ta cần xây dựng các vectơ
tham số từ tập điểm dữ liệu, sau đó các vectơ nút được suy ra từ vectơ tham số và
được sử dụng trong phương pháp tái tạo đường cong.
Đối tượng nghiên cứu: Đường cong B-spline đồng nhất
Phạm vi: Tái tạo đường cong B-spline đồng nhất
Phương pháp: Nội suy đường cong

2. Cơ sở lý thuyết
Giả sử ta có (n + 1) điểm dữ liệu D = {Di} = {D0, D1, D2,…, Dn}, đường cong
B-spline C(u) được xây dựng từ các điểm dữ liệu D có thể theo cách nội suy:
2.1 Nội suy các điểm dữ liệu
Nội suy là phương pháp tái tạo đường cong sao cho toạ độ tất cả các điểm dữ
liệu nằm trên đường cong và thoả mãn vectơ đạo hàm tại điểm dữ liệu này.

Sai số

Điểm
dữ liệu

a) Xấp xỉ điểm dữ liệu b) Nội suy điểm dữ liệu


Hình 2.1. Tái tạo đường cong từ các điểm dữ liệu D

Có hai phương pháp nội suy:


 Nội suy toàn cục (Global Interpolation).
 Nội suy cục bộ (Local Interpolation).
Bắt đầu tại điểm dữ liệu D0 và lần lượt duyệt qua các điểm trung gian theo thứ
tự D1, D2,…,Dn, đường cong C(u) kết thúc tại Dn. Ta xác định toạ độ của một số điểm
ban đầu thuộc đường cong, sau đó xây dựng phương trình toán học và hiệu chỉnh
để đường cong đi qua hết các điểm trên.

Trang 5
Đồ án Lập trình tính toán

2.2 Đường cong B-spline đồng nhất


Đường cong B-spline đồng nhất (uniform) là một trường hợp đặc biệt của
đường cong B-spline không đồng nhất (non-uniform) với vector nút đồng nhất có
khoảng cách giữa tất cả các nút bằng nhau: ui+1 – ui = , với i = 0... n + p. Điều này
cho phép các phép biến đổi dịch chuyển (translation), tỉ lệ (scaling) trên vector nút
không ảnh hưởng đến hình dạng của hàm B-spline cơ sở Ni,k(u). Đây là đường cong có
các điểm đầu và cuối không đi qua các đỉnh điều khiển đầu và cuối tương ứng.
Một đường cong B-spline đồng nhất được xác định bằng tập hợp (n + 1) đỉnh
điều khiển P0 (x0, y0, z0) đến Pn(xn, yn, zn), với p là bậc của đường cong.
Phương trình biểu diễn một đường cong B-spline đồng nhất như sau:
n
C (u )   N i , p (u ).Pi
i 0

trong đó:

p là bậc (degree) của đường cong


 1  p  n  với p, n;
Pi  3 , i  0...n là tập các đỉnh kiểm điều khiển của đường cong;

Vector nút U đồng nhất có (n + p + 2) phần tử là một dãy các giá trị số không
giảm.

U   0, 1, 2, 3, , n  p  1
Chọn vector nút đồng nhất có
ui = i.
ui+k – ui = i + k – i = k
Từ hàm cơ sở của đường cong B-spline không đồng nhất ta suy ra hàm cơ sở
B- spline Ni,p(u) thứ i bậc p được xác định trong các khoảng giá trị của
U   0, 1, 2, 3, , n  p  1
vector nút đồng nhất được biểu diễn như sau:

 1, i  u  i  1
 N i , 0 (u )  
 0, khác

 N ( u )  u  i N (u )  i  k  1  u N
 i ,k i , k 1 i 1, k 1 (u  1)
 k k

với i  0  n  p  k , k  1  p.

Ni , k (u )  N i 1, k (u  1)
Các hàm trộn cách đều với khoảng cách đơn vị:

Trang 6
Đồ án Lập trình tính toán

2.3 Tính chất đường cong B-spline


Đường cong B-spline là dạng tổng quát của đường cong Bézier nên có đầy đủ
các tính chất của đường cong Bézier. Ngoài ra, đường cong B-spline còn có một số
tính chất mở rộng khác.
Xét đường cong B-spline C(u) bậc p có (n + 1) đỉnh điều khiển và vector nút
cắt U = { u0 = u1 =... = up, up+1, …., un-p-1, un-p = un-p+1 =... = um}. Một đường cong
B-spline được biểu diễn ở dạng tham số bằng các hàm cơ sở đệ quy và các giá trị nút
liên hệ với các biến tham số và các đỉnh điều khiển. Các tính chất của đường cong như
sau:

 Bậc p của đường cong: 1  p  n : Khi bậc càng cao, đường cong B-spline sẽ
càng xa các đỉnh điều khiển. Hình 2.2 minh hoạ ảnh hưởng của bậc đến
đường cong.
 Vector nút có m = n + p + 2 phần tử. Việc chọn vector nút có ảnh hưởng lớn
đến các hàm cơ sở Ni,p(u) và do đó sẽ ảnh hưởng đến hình dạng đường cong.
 Mỗi đỉnh điều khiển cần đến một hàm cơ sở và có m = n + p + 1 hàm cơ sở.
N (u )  0 u, [u , u )
p 1
 Hệ số của đỉnh P0 là hàm cơ sở  0, p , 0
.
 Đường cong khép B-spline C(u) đi qua đỉnh điều khiển đầu và cuối. Do
u  u  ...  u  0
đường cong khép B-spline có 0 1 p
nên các hàm cơ sở
N (u ), N (u ),..., N
0, 0 1, 0 (u )
cũng bằng 0. Chỉ có hàm N (u )  0 . Vậy nếu
p 1, 0 p ,0

u  0, N 0, p (0)  1 C (0)  P0 . Tương tự ta có C (1)  Pn .


thì 
 Đường cong C(u) và đạo hàm của cấp 1, 2,..., p  1 của C(u) liên tục trên toàn
đường cong;
 Đường cong B-spline bao gồm (n - p + 1) đoạn cong bậc p nối nhau và liên

tục cấp C tại giá trị các nút  p


p 1 u ,..., un  p 1
;
 Mỗi điểm trên đường cong bị ảnh hưởng bởi (p + 1) đỉnh điều khiển. Mỗi
đỉnh điều khiển sẽ ảnh hưởng đến (p + 1) đoạn cong của đường cong: Đường
cong B-spline C(u) bao gồm nhiều đoạn cong liền nhau và liên tục tại các
điểm nối. Mỗi đoạn cong là một đa thức bậc p được định nghĩa trong mỗi
khoảng nút. Tính chất quan trọng này cho phép thiết kế các đường cong B-
spline có hình dáng phức tạp với bậc thấp.
 Ảnh hưởng cục bộ: Khi dịch chuyển một đỉnh điều khiển chỉ ảnh hưởng đến
vài phân đoạn lân cận của đỉnh điều khiển đó, không ảnh hưởng đến toàn bộ
đường cong.

Trang 7
Đồ án Lập trình tính toán

a) Bậc p=3 b) Bậc p=4

c) Bậc p=5 d) Bậc p=6

Hình 2.2 Ảnh hưởng của các bậc đến hình dạng của đường cong
 Tính bao lồi mạnh: Toàn bộ đường cong B-Spline hay một đoạn cong luôn
nằm trong phần bao lồi của các khung điều khiển tương ứng.
u  [ui , ui 1 ) ta có đoạn cong C(u) nằm trong phần bao lồi của các đỉnh điều

N (u ),..., Ni  p 1, p (u ), Ni  p , p (u )  0
khiển Pi  p , Pi p 1 ,..., Pi . Chỉ có (p + 1) hàm cơ sở i , p trong
khoảng nút này.
N k , p (u )
Do  là hệ số của đỉnh điều khiển Pk tương ứng, nên chỉ có (p + 1) đỉnh điều
khiển Pi , Pi 1 , Pi  2 ,..., Pi  p có hệ số khác 0.
p

N , p (u )  1
, u  [ui , ui 1 ) có trung bình trọng số,
ik
Do tổng các hàm cơ sở k 0

P , P , P ,..., Pi  p
nên đường cong C(u) nằm trong phần bao lồi của các đỉnh  i i 1 i 2 . Tính bao
lồi mạnh được thể hiện khi toàn bộ đường cong nằm trong phần bao lồi của các đỉnh
điều khiển thì từng đoạn cong cũng nằm trong các bao lồi con.
Một điểm nằm trên đường cong B-spline C(u) bậc p thì sẽ nằm trong bao lồi
của p điểm lân cận.

Trang 8
Đồ án Lập trình tính toán

 Biến đổi cục bộ (Local Modification Scheme): Nếu vị trí đỉnh Pi thay đổi, tích
N i , p (u ) Pi
cũng thay đổi và chỉ ảnh hưởng đến đoạn cong C(u) trong khoảng
tham số [ui , ui  p 1 );
u  [ui , ui 1 ) : N i , p (u ) Pi  0
 Nếu
u  [ui , ui 1 ) : Ni , p (u ) Pi  0
 Nếu
 Đường cong C(u) liên tục cấp Cp-k tại nút u bội k. 
Nếu tham số u không phải là các giá trị trong vector nút, điểm C(u) nằm
trong đoạn cong bậc p và khả vi vô hạn lần. Nếu u là một giá trị trong
vector nút và bội k, thì hàm N i , p (u ) liên tục cấp C , và do vậy, đường
pk

pk
cong C(u) cũng liên tục cấp C tại nút bội k.
 Tính giảm biến động (variation diminishing): Xét một đường cong nằm trong
một mặt phẳng, số điểm giao nhau của một đường thẳng trong mặt phẳng với
đường cong sẽ ít hơn số lần mà đường thẳng giao nhau với khung điều khiển.

ui ui+1

Hình 2.3 Tính bao lồi của đường cong B-spline

Đường cong Bézier là một trường hợp đặc biệt của đường cong B-spline
khép: Khi p = n, vector U có 2(p + 1) nút và lặp lại tại (p + 1) nút đầu tiên và (p + 1)
nút cuối cùng, đường cong B-spline trở thành đường cong Bézier. Bất biến đối với các
phép biến đổi affine (phép tịnh tiến, phép quay, phép vị tự), phép chiếu phối cảnh. Khi
áp dụng một phép biến đổi affine lên đường cong, ta chỉ cần thực hiện trên các đỉnh
điều khiển, sau đó dựng đường cong B-spline dựa trên các đỉnh đã biến đổi, không cần
phải thực hiện biến đổi trên đường cong.

Trang 9
Đồ án Lập trình tính toán

2.4 Vecto nút


Đường cong tham số bao gồm nhiều đoạn cong liên tục nhau tại các điểm kết
nối. Các điểm kết nối này nằm ngay trên các đường cong. Giá trị tham số tại các
điểm kết nối được gọi là nút. Một đường cong có vector nút bao gồm tập các phần tử
được xác định bởi nút đầu và nút cuối, thường nằm trong đoạn [0, 1].
Vector nút là một thành phần quan trọng của đường cong B-spline. Số nút m của
một vector nút liên quan đến bậc p và số đỉnh điều khiển (n + 1) của một đường cong.
Giá trị của mỗi nút ảnh hưởng đến quá trình tham số hoá của từng đoạn cong đa thức
của đường cong như sau:
 Xác định miền tham số của đường cong;
 Xác định hàm cơ sở, các đỉnh điều khiển liên quan đến mỗi nút;
 Điểm kết nối giữa các đoạn cong đa thức của đường cong.
Ở đây ta sẽ dùng vector nút đồng nhất.
*Vector nút đồng nhất
Cho đường cong B-spline bậc p có (n + 1) đỉnh điều khiển. Vector nút dạng
đồng nhất mở có (n + p + 2) phần tử, các phần tử trong vector nút tăng dần đều.

U = {ui | ui 1  ui = , i = 0...m  1}

Ví dụ : Các vector nút đồng nhất


n = 3, p = 2, U = { 0, 1, 2, 3, 4, 5, 6 }
n = 3, p = 3, U = { 0.0, 0.14, 0.28, 0.42, 0.57, 0.71, 0.85, 1.0 }
n = 5, p = 3, U = { 0, 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25 }
2.5 Hàm cơ sở
Các hàm cơ sở B-spline được xác định trong các khoảng giá trị của vector nút
Ni , p (u )
U. Hàm cơ sở thứ i bậc p ký hiệu được định nghĩa dạng biểu thức đệ quy (theo
de Boor, Cox, Mansfield) như sau:

 1 ui  u  ui 1
 Ni , 0  u   
 0

 N  u   u  ui N ui  k  1  u
i , k 1  u   N i 1, k 1  u  , ui  u  ui  k 1
 i, k
u  u u  u
 ik i i  k 1 i 1

i  0...(n  p  k ) , k  p,..., 0; u  u p 1 , un 1  .


với tham số

Trang 10
Đồ án Lập trình tính toán

0
ui  k  ui ui  k  1  ui  1 0
Để tránh trường hợp mẫu số bằng 0 khi , , ký hiệu = 0.

Ni , k  u 
Mỗi hàm được xác định trên k khoảng cách của vector nút.

[u , u ]
Đường cong B-spline được xác định trong đoạn tham số p n và bao gồm
nhiều đoạn cong, các đoạn cong này gặp nhau tại các điểm được xác định tương ứng
C (u p ), C (u p 1 ),..., C (un ).
với các giá trị của vector nút:

Chú ý các phần tử


 Pi  ,  u i ,  N i, p (u ) luôn có chỉ số i bắt đầu cùng một giá trị
(ví dụ bắt đầu i  0 ).

N (u )
Hàm cơ sở B-spline bậc p, i , p chỉ phụ thuộc vào bậc p và vector nút U,
được biểu diễn bằng cách kết hợp tuyến tính các hàm cơ sở B-spline có bậc thấp hơn.
u  ui
i, k  i, k
ui  k  ui N (u )
Đặt , hàm cơ sở i , p được biểu diễn dạng rút gọn:

 1, ui  u  ui 1
 Ni, 0  u   
 0, khác
i , k i , k 1  u    1   i 1, k  N i 1, k 1  u  .
N u   N
 i, k  
Trong hệ toạ độ Cartesian, một điểm trên đường cong B-spline tương ứng với
tham số u có toạ độ như sau:

 n

 x (u )   N i , p (u ) Pi x
 i 0

 n
C (u )   y (u )   N i , p (u ) Pi y
 i 0
 n
 z (u )   N i , p (u ) Pi
z

 i 0

P2 P 4

P5
P1 C2(u) C3(u) C4(u)
C1(u)
P3
P0 P6

u0=u1=u2=u3 u4 u5 u6 u7=u8=u9=u10

U = { 0, 0, 0, 0, 0.25, 0.5, 0.75, 1, 1, 1, 1 }

Trang 11
Đồ án Lập trình tính toán

Hình 2.4. Đường cong B-spline bậc p = 3 và đồ thị các hàm cơ sở


Có thể xem các đỉnh điều khiển của đường cong giống như các nam châm hút
đường cong. Lực hút của các đỉnh điều khiển được mô tả toán học bằng hàm cơ sở B-
spline. Khoảng tham số u của đường cong được xác định trên vector nút U như sau:

Khoảng tham số của đường cong

u0 = u1 = u2 = … = up+1 up+2 …. un-1 un un+1 = … = un+p = un+p+1


Các nút trong

Hình 2.5. Các nút trong và khoảng tham số xác định của đường cong
B-spline
Công thức triển khai:
+Hàm cơ sở bậc 1:

+Hàm cơ sở bậc 2:

+Hàm cơ sở bậc 3:

Trang 12
Đồ án Lập trình tính toán

*Tính chất của hàm cơ sở

Ni , p (u )
Xét hàm cơ sở , ta có:

Ni , p (u )  0, u[ui , ui  p ]
 Hàm .
N (u ) u , u  , p  1.
 Hàm i , p xác định trong khoảng  i i  p 
 Tổng giá trị các hàm cơ sở luôn bằng 1:
m p

N
i 0
i, p (u )  1, u  u p 1 , u m1  .

n −1
 Hàm
N i , p (u )
đạt giá trị cực tiểu tại
P0 .
Ni , p (u ) p 1
 Tính liên tục: Hàm bậc p liên tục tại C tại mỗi nút đơn.

3. Tổ chức cấu trúc dữ liệu và thuật toán


3.1 Phát biểu bài toán
Đầu vào là tập hợp các điểm được nhập từ bàn phím, hoặc được lấy từ file
input.txt có sẵn

Trang 13
Đồ án Lập trình tính toán

Đầu ra là tọa độ các đỉnh của đường cong B-spline do chương trình tính toán
xuất ra màn hình và được lưu vào file output.txt
3.2 Cấu trúc dữ liệu
3.3 Thuật toán
B1:Để nô ̣i suy (n + 1) điểm dữ liê ̣u, đường cong B-spline bâ ̣c ba nội suy cần
có:
 Bậc p = 3

 n = 6 đỉnh điều khiển P0 , P1 , P2 ,  , P5 với (n + 1) điểm dữ liệu ta phải nội


suy (n + 3) đỉnh điều khiển.
B2: Chọn bộ vectơ tham số T = {t0, t1, …, tn}
B3: Xây dựng véctơ nút U cho đường cong B-spline nội suy

Để cho điểm đầu và cuối P0  D0 , Pn 2  Dn , ta xây dựng vectơ nút lặp (p + 1)
giá trị tại đầu và cuối.
Với số đỉnh n và bậc p = 3 đã xác định, véctơ nút U có (n + 7) phần tử: U =
 u0 , u1 ,  , un 6  được xây dựng theo dạng mở đồng nhất.

B4: Xây dựng hệ phương trình xác định các đỉnh điều khiển {Pi}

Ta cần tìm các đỉnh điều khiển: P1 , P2 , , Pn1 dựa vào phương trình đường
cong, vectơ nút U và các điểm dữ liệu D.
Để đường cong nội suy, toạ độ các điểm dữ liệu {Di} phải thuộc đường cong
C(u) tại tham số tương ứng.

Dk  C (tk )   N i ,3 (tk ) Pi , k  1,..., n  1.

Thay tham số tk vào phương trình đường cong:

Dk  C (ut 3 )   N i ,3 (uk 3 ) Pi , k  1,..., n  1.

Kết hợp với các phương trình ta có hệ (n + 1) phương trình có (n + 1) ẩn


P1-> Pn-1:

Trang 14
Đồ án Lập trình tính toán

 3 1 0 0 ... 0 0
0
 
1 7 1
0 ... 0 0 0   P   2D 
 4 12 6  1   0 
 1 2 1   P2   D1 
0 ... 0 0 0    
 6 3 6   P3   D2 
0 0 0 0 ... 0 0 0   ...    ... 
 
0 0 1 2 1 P  D 
0 ... 0   n 1   n 2 
 6 3 6  P   D 
n 1
 1 7 1   P   2 D 
n

0 0 0 ... 0  n 1   n 
 6 12 4 
0 0 0 ... 0 0 1 3 

Tìm tập đỉnh điều khiển sau khi nghịch đảo ma trận N nhân với tập điểm dữ
liệu và kết hợp cùng D0, Dn.
P=N-1.D.

 Ma trận N là giá trị hàm cơ sở tính được khi truyền các tham số u vào.
 Ma trận nghịch đảo của N là ma trận dùng phương pháp Gauss để tính toán.
 Ma trận nhân là kết quả sau khi nhân ma trận nghịch đảo của N với ma trận
chứa tập điểm dữ liệu.
Bước 5: Kiểm tra và đánh giá đường cong tái tạo.
3.4 Các ví dụ minh họa
Ví dụ 1: Tái tạo đường cong B-spline đồng nhất khép bậc 3 bằng phương pháp
nội suy
Cho tập 8 điểm dữ liệu {Di} được xác định như sau:

Di D0 D1 D2 D3 D4 D5 D6 D7
x 1 4 7 8 11 15 18 19
y 3 2 4 5 2 8 15 4

Xây dựng một đường cong B-spline bâ ̣c p = 3 (cubic) đồng nhất nô ̣i suy các
điểm dữ liê ̣u này.
Bước 1: Thiết lập các tham số cho đường cong B-Spline nội suy các điểm
dữ liệu {Di}
Để nô ̣i suy (n + 1) điểm dữ liê ̣u, đường cong B-spline bâ ̣c ba nội suy cần có:

Trang 15
Đồ án Lập trình tính toán

 Bậc p = 3
 n = 7 đỉnh điều khiển P0,P1,P2,…..,P7 với (n + 1) điểm dữ liệu ta phải nội suy
(n + 3) đỉnh điều khiển.
Tiếp theo cần đi tính vectơ nút U.
Bước 2: Xây dựng véctơ tham số T
Do yêu cầu xây dựng đường cong B-spline bậc p = 3 nên phần này ta không
phải xây dựng bộ vectơ tham số T = {t0, t1, …, tn}
Bước 3: Xây dựng véctơ nút U cho đường cong B-spline nội suy
Để cho điểm đầu và cuối P0 = D0 , Pn+2 = Dn, ta xây dựng vectơ nút lặp (p + 1)
giá trị tại đầu và cuối.
Với 10 đỉnh điều khiển và bậc p=3 đã xác định, véctơ nút U có (n + 7) phần tử
được xây dựng theo dạng mở đồng nhất:

U = u0 , u1 , … , un+6  = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7}


Bước 4: Xây dựng hệ phương trình xác định các đỉnh điều khiển {Pi}

Ta cần tìm các đỉnh điều khiển: P1 , P2 , , Pn1 dựa vào phương trình đường
cong, vectơ nút U và các điểm dữ liệu D.
Để đường cong nội suy, toạ độ các điểm dữ liệu {Di} phải thuộc đường cong
C(u) tại tham số tương ứng.

Dk  C (tk )   N i ,3 (tk ) Pi , k  1,..., n  1.

Thay tham số tk vào phương trình đường cong:

Dk  C (ut 3 )   N i ,3 (uk 3 ) Pi , k  1,..., n  1.

Trang 16
Đồ án Lập trình tính toán

t0 D0  P0
1 7 1
t 1 D1  N1,3  u4  P1  N 2,3  u4  P2  N 3,3  u4  P3  P1  P2  P3
4 12 6
1 2 1
t2 D2  N 2,3  u5  P2  N 3,3  u5  P3  N 4,3  u5  P4  P2  P3  P4
6 3 6
.....
1 2 1
t  n2 Dn 2  N n  2,3  un 1  Pn  2  N n 1,3  un1  Pn 1  N n,3  un 1  Pn  Pn  2  Pn 1  Pn
6 3 6
1 2 1
t  n2 Dn 2  N n 2,3  un 1  Pn  2  N n 1,3  un1  Pn 1  N n ,3  un 1  Pn  Pn 2  Pn 1  Pn
6 3 6
Pn  2  Dn

Tập N tính được từ vector nút và hàm cơ sở Ni,p(u):

Kết hợp với các phương trình trên, ta có hệ (n + 1) phương trình có (n + 1) ẩn:

3P1  P2  2 D0
1
 P1  7 P2  1 P3  D1
4 12 6
1 2 1
 P2  P3  P4  D2
6 3 6

...
1 2 1
 Pn  2  Pn 1  Pn  Dn  2
6 3 6
1 7 1
 Pn 1  Pn  Pn 1  Dn 1
6 12 4
 Pn  3Pn 1  2 Dn

Biểu diễn hệ phương trình ở dạng ma trận:

Trang 17
Đồ án Lập trình tính toán

 3 1 0 0 ... 0 0 0
1 7 1 
 0 ... 0 0 0   P1   2 D0 
 4 12 6    
 1 2 1   P2   D1 
0 ... 0 0 0    
 6 3 6   P3   D2 
0 0 0 0 ... 0 0 0   ...    ... 
 
0 0 1 2 1 P  D 
0 ... 0   n 1   n 2 
 6 3 6   Pn   Dn 1 
 1 7 1   P   2 D 
0 0 0 ... 0  n 1   n 
 6 12 4 
0 0 0 ... 0 0 1 3 

Ta giải hệ phương trình: P = D . N-1 được nghiệm là:


| 1.941 | 2.413 |

| 3.824 | 1.240 |

| 7.705 | 4.040 |
| 7.357 | 6.602 |
| 10.869 | -0.447 |
| 15.168 | 7.186 |
| 18.458 | 19.704 |
| 18.819 | 9.235 |

Ma trận đỉnh điều khiển{Pi}được xác định sau khi nhân ma trận N-1 với ma
trận tập điểm dữ liệu và kết hợp cùng D0, Dn.
Bac cua duong cong : 3
So dinh dieu khien : 10
Chieu cua diem du lieu : 2

Tap dinh dieu khien P co gia tri la:


P(1) = (1.000 , 3.000 )
P(2) = (1.941 , 2.413 )
P(3) = (3.824 , 1.240 )
P(4) = (7.705 , 4.040 )
P(5) = (7.357 , 6.602 )
P(6) = (10.869 , -0.447 )
P(7) = (15.168 , 7.186 )
P(8) = (18.458 , 19.704 )
P(9) = (18.819 , 9.235 )
P(10) = (19.000 , 4.000 )

Trang 18
Đồ án Lập trình tính toán

Hình 3.1 Hình ảnh đường cong được tái tạo của ví dụ 1

Ví dụ 2: Tái tạo đường cong B-spline đồng nhất khép bậc 3 bằng phương pháp
nội suy
Cho tập 8 điểm dữ liệu {Di} được xác định như sau:
Di D0 D1 D2 D3 D4 D5
xi 1 3 8 12 10 15
yi 3 7 3 5 7 9
zi 2 5 6 4 1 12

Xây dựng một đường cong B-spline bâ ̣c p = 3 (cubic) đồng nhất nô ̣i suy các
điểm dữ liê ̣u này.

Trang 19
Đồ án Lập trình tính toán

Bước 1: Thiết lập các tham số cho đường cong B-Spline nội suy các điểm
dữ liệu {Di}
Để nô ̣i suy (n + 1) điểm dữ liê ̣u, đường cong B-spline bâ ̣c ba nội suy cần có:
 Bậc p = 3
 n = 5 đỉnh điều khiển P0,P1,P2,…..,P5 với (n + 1) điểm dữ liệu ta phải nội suy
(n + 3) đỉnh điều khiển.
Tiếp theo cần đi tính vectơ nút U.
Bước 2: Xây dựng véctơ tham số T
Do yêu cầu xây dựng đường cong B-spline bậc p = 3 nên phần này ta không
phải xây dựng bộ vectơ tham số T = {t0, t1, …, tn}
Bước 3: Xây dựng véctơ nút U cho đường cong B-spline nội suy
Để cho điểm đầu và cuối P0 = D0 , Pn+2 = Dn, ta xây dựng vectơ nút lặp (p + 1)
giá trị tại đầu và cuối.
Với 8 đỉnh điều khiển và bậc p = 3 đã xác định, véctơ nút U có (n + 7) phần tử
được xây dựng theo dạng mở đồng nhất:

U = u0 , u1 , … , un+6  = {0, 0, 0, 0, 1, 2, 3, 4, 5, 5, 5, 5}


Bước 4: Xây dựng hệ phương trình xác định các đỉnh điều khiển {Pi}

Ta cần tìm các đỉnh điều khiển: P1 , P2 , , Pn1 dựa vào phương trình đường
cong, vectơ nút U và các điểm dữ liệu D.
Để đường cong nội suy, toạ độ các điểm dữ liệu {Di} phải thuộc đường cong
C(u) tại tham số tương ứng.
Bước 4: Xây dựng hệ phương trình xác định các đỉnh điều khiển {Pi}

Ta cần tìm các đỉnh điều khiển: P1 , P2 , , Pn1 dựa vào phương trình đường
cong, vectơ nút U và các điểm dữ liệu D.
Để đường cong nội suy, toạ độ các điểm dữ liệu {Di} phải thuộc đường cong
C(u) tại tham số tương ứng.

Dk  C (tk )   N i ,3 (tk ) Pi , k  1,..., n  1.

Thay tham số tk vào phương trình đường cong:

Trang 20
Đồ án Lập trình tính toán

Dk  C (ut 3 )   N i ,3 (uk 3 ) Pi , k  1,..., n  1.

t0 D0  P0
1 7 1
t 1 D1  N1,3  u4  P1  N 2,3  u4  P2  N 3,3  u4  P3  P1  P2  P3
4 12 6
1 2 1
t2 D2  N 2,3  u5  P2  N 3,3  u5  P3  N 4,3  u5  P4  P2  P3  P4
6 3 6
.....
1 2 1
t  n2 Dn 2  N n  2,3  un 1  Pn  2  N n 1,3  un1  Pn 1  N n,3  un 1  Pn  Pn  2  Pn 1  Pn
6 3 6
1 2 1
t  n2 Dn 2  N n 2,3  un 1  Pn  2  N n 1,3  un1  Pn 1  N n ,3  un 1  Pn  Pn 2  Pn 1  Pn
6 3 6
Pn  2  Dn

Tập N tính được từ vector nút và hàm cơ sở Ni,p(u):

Kết hợp với các phương trình trên, ta có hệ (n + 1) phương trình có (n + 1) ẩn:

3P1  P2  2 D0
1
 P1  7 P2  1 P3  D1
4 12 6
1 2 1
 P2  P3  P4  D2
6 3 6

...
1 2 1
 Pn  2  Pn 1  Pn  Dn  2
6 3 6
1 7 1
 Pn 1  Pn  Pn 1  Dn 1
6 12 4

 Pn  3Pn 1  2 Dn

Biểu diễn hệ phương trình ở dạng ma trận:

Trang 21
Đồ án Lập trình tính toán

 3 1 0 0 ... 0 0 0
1 7 1 
 0 ... 0 0 0   P1   2 D0 
 4 12 6    
 1 2 1   P2   D1 
0 ... 0 0 0    
 6 3 6   P3   D2 
0 0 0 0 ... 0 0 0   ...    ... 
 
0 0 1 2 1 P  D 
0 ... 0   n 1   n 2 
 6 3 6   Pn   Dn 1 
 1 7 1   P   2 D 
0 0 0 ... 0  n 1   n 
 6 12 4 
0 0 0 ... 0 0 1 3 

Ta giải hệ phương trình: P = D . N-1 được nghiệm là:


| 1.424 | 5.191 | 3.136 |

| 2.273 | 9.574 | 5.407 |

| 7.909 | 0.703 | 6.373 |

| 14.091 | 5.612 | 5.100 |

| 7.727 | 6.847 | -2.775 |

| 12.576 | 8.282 | 7.075 |

Ma trận đỉnh điều khiển{Pi}được xác định sau khi nhân ma trận N-1 với ma
trận tập điểm dữ liệu và kết hợp cùng D0, Dn.
Bac cua duong cong : 3

So dinh dieu khien : 8

Chieu cua diem du lieu : 3

Tap dinh dieu khien P co gia tri la:

P(1) = (1.000 , 3.000 , 2.000 )

P(2) = (1.424 , 5.191 , 3.136 )

P(3) = (2.273 , 9.574 , 5.407 )

P(4) = (7.909 , 0.703 , 6.373 )

P(5) = (14.091 , 5.612 , 5.100 )

P(6) = (7.727 , 6.847 , -2.775 )

P(7) = (12.576 , 8.282 , 7.075 )

P(8) = (15.000 , 9.000 , 12.000 )

Trang 22
Đồ án Lập trình tính toán

Hình 3.2 Hình ảnh đường cong được tái tạo của ví dụ 2

4. Chương trình và kết quả


4.1 Tổ chức chương trình
Ví dụ 1:
Cho tập 8 điểm dữ liệu {Di} được xác định như hình bên dưới. Tái tạo đường
cong B-spline đồng nhất khép bậc 3 bằng phương pháp nội suy.
Di D0 D1 D2 D3 D4 D5 D6 D7
x 1 4 7 8 11 15 18 19
y 3 2 4 5 2 8 15 4

Xây dựng một đường cong B-spline bâ ̣c p = 3 (cubic) đồng nhất nô ̣i suy các
điểm dữ liê ̣u này.

Trang 23
Đồ án Lập trình tính toán

Input: Nhập từ file bậc p = 3,số điểm dữ liệu n = 7, số chiều d = 2 và giá trị
của các điểm dữ liệu ứng với số chiều tương ứng{ D0 D7}.

Output: Xuất ra màn hình console kết quả của (n+3=10) đỉnh điều khiển
P1P10.

Ví dụ 2: Tái tạo đường cong B-spline đồng nhất khép bậc 3 bằng phương pháp
nội suy
Cho tập 8 điểm dữ liệu {Di} được xác định như sau:
Di D0 D1 D2 D3 D4 D5
xi 1 3 8 12 10 15
yi 3 7 3 5 7 9

Trang 24
Đồ án Lập trình tính toán

zi 2 5 6 4 1 12

Xây dựng một đường cong B-spline bâ ̣c p = 3 (cubic) đồng nhất nô ̣i suy các
điểm dữ liê ̣u này.
Input: Nhập từ file bậc p = 3,số điểm dữ liệu n = 5, số chiều d = 3 và giá trị
của các điểm dữ liệu ứng với số chiều tương ứng{ D0 D5}.

Output: Xuất ra màn hình console kết quả của (n+3=10) đỉnh điều khiển
P1P8.

4.2 Ngôn ngữ cài đặt.


Ngôn ngữ C.
4.3 Kết quả
Ví dụ 1 :

Trang 25
Đồ án Lập trình tính toán

Hình 4.1 Giao diện chương trình trước khi nhập dữ liệu.

Hình 4.2 Giao diện chương trình khi kết thúc với bộ dữ liệu của ví dụ 1

Trang 26
Đồ án Lập trình tính toán

Hình 4.3 Kết quả được in ra file ouput.txt với bộ dữ liệu của ví dụ 1

Sử dụng trang web NURBS demo để tái tạo đường cong

Hình 4.4. Tọa độ các đỉnh và vector nút được nhập vào trang web

Trang 27
Đồ án Lập trình tính toán

Hình 4.5. Đường cong được tái tạo 3D nhờ vào trang web

Trang 28
Đồ án Lập trình tính toán

Ví dụ 2:

Hình 4.6 Giao diện chương trình khi kết thúc với bộ dữ liệu của ví dụ 2.

Hình 4.7. Kết quả được in ra file ouput.txt với bộ dữ liệu của ví dụ 2

Sử dụng trang web NURBS demo để tái tạo đường cong

Trang 29
Đồ án Lập trình tính toán

Hình 4.8. Tọa độ các đỉnh và vector nút được nhập vào trang web

Hình 4.9. Đường cong được tái tạo 3D nhờ vào trang web

Trang 30
Đồ án Lập trình tính toán

4.4 Nhận xét và đánh giá


Chương trình tính đúng kết quả tọa độ các đỉnh điều khiển.
Tái tạo đường cong với độ chính xác cao và nhanh.
Kết quả rất rõ ràng chứng tỏ rằng các đỉnh điều khiển không cách xa mấy xo
với các điểm dữ liêu Di.

5. Kết luận và hướng phát triển


5.1 Kết luận
Chương trình đã tính toán được tọa độ các đỉnh điều khiển theo như yêu cầu
bài toán mặc dù vẫn còn một vài lỗi sai số (sai số càng lớn nếu như điểm dữ liệu càng
nhiều). Tuy nhiên kết quả đưa vẫn tương đối chính xác và có thể áp dụng để tính được
tọa độ đỉnh điều khiển của các bài toán nội suy trong hầu hết các trường hợp.
5.2 Hướng phát triển
Có thể áp dụng để tái tạo 3D đường cong B-spline mong muốn trong kỹ thuật
đồ họa máy tính hoặc trong những ứng dụng thực tế lớn hơn như nhận diện dấu vân
tay, nhận diện chữ viết tay, …

Trang 31
Đồ án Lập trình tính toán

TÀI LIỆU THAM KHẢO


KhoaCNTT - DHBKDaNang Duong cong Bézier và B-spline v3
KhoaCNTT-DHBKDaNang Tai tao duong cong Bézier - B-spline v5 B-spline
uniform
Và một số nguồn tài liệu tham khảo khác.

Trang 32
Đồ án Lập trình tính toán

PHỤ LỤC

#include <stdio.h>

float u[100], kq[100][100], D[100][100];


int p, n, d;

void nhap();
void docFILE();
void Vecto_Nut(float a[], int p, int n);
float basicFuns(int i, float u, float U[]);
void Matran_N(float N[][100], int n);
void Nghich_dao(float a[][100], int n);
void Nhan_matran(float a[][100], float b[][100], int n, int p);
void xuat();
void ghiFILE();

//ham nhap du lieu tu ban phim


void nhap()
{
printf("Nhap bac (p): \n");
scanf("%d", &p);
printf("Nhap so diem du lieu (n): \n");
scanf("%d", &n);
printf("Nhap chieu (d): \n");
scanf("%d", &d);
printf("Nhap toa do cac diem du lieu: \n\n");
for (int i = 0; i <= n; i++)
{
printf("Nhap D%d: \n\n", i);
for (int j = 0; j < d; j++)
{
if (j == 0)
{
printf("x%d = ", i);
scanf("%f", &D[i][j]);
}
else if (j == 1)

Trang 33
Đồ án Lập trình tính toán

{
printf("\ny%d = ", i);
scanf("%f", &D[i][j]);
}
else if (j == 2)
{
printf("\nz%d = ", i);
scanf("%f", &D[i][j]);
}
}
}
}

//ham nhap du lieu tu File


void docFILE()
{
FILE *f;
f = fopen("F:\\BSPLINE_INTERPOLATION\\input.txt", "r");
fscanf(f, "%d", &p);
fscanf(f, "%d", &n);
fscanf(f, "%d", &d);
for (int i = 0; i <= n; i++)
{
for (int j = 0; j < d; j++)
fscanf(f, "%f", &D[i][j]);
}
fclose(f);
printf("\n\n\t------------------------------------\n\n");
printf("\n\nTap diem D nhap vao: \n\n");
printf("Di | x | y\n");
printf("----------------------\n");
for (int i = 0; i <= n; i++)
{
printf("D%d | ", i);
for (int j = 0; j < d; j++)
{
printf("%.3f | ", D[i][j]);
}
printf("\n\n");

Trang 34
Đồ án Lập trình tính toán

}
}

//ham tinh vecto nut


void Vecto_Nut(float a[], int p, int n)
{
for (int i = 0; i <= n + p + 2 + 1; i++)
{
if (i <= p)
{
a[i] = 0;
}
else if (i > n + 3)
{
a[i] = a[i - 1];
}
else if (i > p && i <= n + 3)
a[i] = a[i - 1] + 1;
}
printf("\n\n\t------------------------------------");
printf("\n\nSo vecto nut la: n+%d", p + 3 + 1);
printf("\n");
printf("\n\nGia tri vecto nut: \n\n");

for (int i = 0; i <= n + p + 2 + 1; i++)


{
printf("\nu[%d]: %.2f \n", i, u[i]);
}
}

//ham tinh N theo cong thuc khai trien


float basicFuns(int i, float u, float U[])
{

float N03 = (u - U[i]) * (u - U[i]) * (u - U[i]) / ((U[i + 1] - U[i]) *


(U[i + 2] - U[i]) * (U[i + 3] - U[i]));

float N13 = (u - U[i]) * (u - U[i]) * (U[i + 2] - u) / ((U[i + 2] - U[i])


* (U[i + 2] - U[i + 1]) * (U[i + 3] - U[i])) + (u - U[i]) * (U[i + 3] - u) * (u - U[i + 1])

Trang 35
Đồ án Lập trình tính toán

/ ((U[i + 2] - U[i + 1]) * (U[i + 3] - U[i + 1]) * (U[i + 3] - U[i])) + (U[i + 4] - u) * (u


- U[i + 1]) * (u - U[i + 1]) / ((U[i + 4] - U[i + 1]) * (U[i + 3] - U[i + 1]) * (U[i + 2] -
U[i + 1]));

float N23 = (u - U[i]) * (U[i + 3] - u) * (U[i + 3] - u) / ((U[i + 3] -


U[i]) * (U[i + 3] - U[i + 1]) * (U[i + 3] - U[i + 2])) + (U[i + 4] - u) * (U[i + 3] - u) *
(u - U[i + 1]) / ((U[i + 4] - U[i + 1]) * (U[i + 3] - U[i + 1]) * (U[i + 3] - U[i + 2])) +
(U[i + 4] - u) * (U[i + 4] - u) * (u - U[i + 2]) / ((U[i + 4] - U[i + 1]) * (U[i + 4] - U[i
+ 2]) * (U[i + 3] - U[i + 2]));

float N33 = (U[i + 4] - u) * (U[i + 4] - u) * (U[i + 4] - u) / ((U[i +


4] - U[i + 1]) * (U[i + 4] - U[i + 2]) * (U[i + 4] - U[i + 3]));

if ((U[i] <= u) && (u < U[i + 1]))


return N03;
if ((U[i + 1] <= u) && (u < U[i + 2]))
return N13;
if ((U[i + 2] <= u) && (u < U[i + 3]))
return N23;
if ((U[i + 3] <= u) && (u < U[i + 4]))
{
return N33;
}
else
return 0;
}

//Ham nhap ma tran N


void Matran_N(float N[][100], int n)
{
float point = n + 1;
int i, j;
for (i = 0; i < point; i++)
{
for (j = 0; j < point; j++)
{
if (i == 0 && j == 0)
{
N[i][j] = 3;

Trang 36
Đồ án Lập trình tính toán

}
else if (i == 0 && j == 1)
{
N[i][j] = -1;
}
else if (i == point - 1 && j == point - 2)
{
N[i][j] = -1;
}
else if (i == point - 1 && j == point - 1)
{
N[i][j] = 3;
}
else if (i != 0 && i != point - 1)
{
N[i][j] = 0;
}
}
}
int k = 1;
for (i = 1; i < point - 1; i++)
{
for (j = 0; j < point; j++)
{
N[i][j] = basicFuns(k, u[i + 3], u);
k++;
}
k = 1;
}
printf("\n\n\t---------------------------------------\n\n");
printf("\n\nMa tran bieu dien he phuong trinh D: \n\n");

for (i = 0; i <= n; i++)


{
for (j = 0; j <= n; j++)
{
printf("%.3f | ", N[i][j]);
}
printf("\n\n");

Trang 37
Đồ án Lập trình tính toán

}
}

//ham tinh ma tran nghich dao


void Nghich_dao(float a[][100], int n)
{
int i, j, k, sign = 1;
float temp;
float det = 1;
n = n + 1;
float b[100][100], c[100][100];
for (i = 0; i < n; i++) //gan ma tran c bang ma tran b
for (j = 0; j < n; j++)
{
c[i][j] = a[i][j];
}

for (i = 0; i < n - 1; i++)


{
if (c[i][i] == 0) // neu gap phan tu tren duong cheo chinh bang
0 thi tim hang khac de doi
{
k = i + 1;
while (k < n && c[k][i] == 0)
k++;
if (k == n)
{
printf("\ndet(a) = 0");
break;// khong tim thay, tuc det(a) = 0
}
for (j = i; j < n; j++) // doi hang i voi hang k
{
temp = c[i][j];
c[i][j] = c[k][j];
c[k][j] = temp;
}
sign = -sign; // dinh thuc doi dau do
}

Trang 38
Đồ án Lập trình tính toán

for (j = i + 1; j < n; j++) // bien doi cac phan tu cung cot hang
duoi bang 0 do
{
temp = -c[j][i] / c[i][i];
for (k = i + 1; k < n; k++)
c[j][k] += temp * c[i][k]; // nhan hang i voi (-a[j]
[i]/a[i][i]) roi cong vao hang j
}
det *= c[i][i]; // Tinh den det(a)
}

det *= c[n - 1][n - 1]; // nhan voi phan tu cuoi cheo chinh
printf("\n\n\t------------------------------------\n\n");
printf("\n\ndet(N) = %lf\n\n", det);

//Tinh ma tran nguoc


if (det != 0)
{
for (i = 0; i < n; i++) // tao ra b la ma tran don vi do
for (j = 0; j < n; j++)
if (i == j)
b[i][j] = 1;
else
b[i][j] = 0;

for (i = 0; i < n; i++) // xu ly tu hang dau den hang cuoi


{
if (a[i][i] == 0) // neu gap phan tu tren duong cheo chinh
bang 0 thi doi hang
{
k = i + 1;
while (k < n && a[k][i] == 0)
k++;
for (j = 0; j < n; j++) // doi hang do cua a do, ca
voi ma tran b
{
temp = a[i][j];
a[i][j] = a[k][j];
a[k][j] = temp;

Trang 39
Đồ án Lập trình tính toán

temp = b[i][j];
b[i][j] = b[k][j];
b[k][j] = temp;
}
}

temp = a[i][i];
for (j = i; j < n; j++)
a[i][j] /= temp;
for (j = 0; j < n; j++)
b[i][j] /= temp;

for (j = i + 1; j < n; j++)


{
temp = -a[j][i];
for (k = i; k < n; k++)
a[j][k] += temp * a[i][k];
for (k = 0; k < n; k++)
b[j][k] += temp * b[i][k];
}
} // ket thuc qua trinh Gauss

for (i = n - 1; i > 0; i--) // bat dau qua trinh Jordan


for (j = i - 1; j >= 0; j--)
{
temp = -a[j][i];
for (k = n - 1; k >= i; k--)
a[j][k] += temp * a[i][k];
for (k = 0; k < n; k++)
b[j][k] += temp * b[i][k];
}
printf("Ma tran nghich dao la: \n\n");
for (i = 0; i < n; i++) // In ra ma tran b, bay gio la ma tran
nghich dao cua a
{
for (j = 0; j < n; j++)
{
printf("%.3f | ", b[i][j]);
}

Trang 40
Đồ án Lập trình tính toán

printf("\n\n");
}
}
else
printf("\nKhong co ma tran nghich dao\n");

for (i = 0; i < n; i++)


{
for (j = 0; j < n; j++)
{
a[i][j] = b[i][j];
}
}
}

//ham nhan hai ma tran


void Nhan_matran(float a[][100], float b[][100], int n, int p)
{
float c[100][100];
int i, j;
for (i = 0; i <= n; i++)
{
if (i == 0 || i == n)
{
for (j = 0; j < p; j++)
{
b[i][j] *= 2;
}
}
}

for (i = 0; i <= n; i++)


{
for (j = 0; j < p; j++)
{
c[i][j] = 0;
for (int k = 0; k <= n; k++)
{
c[i][j] += a[i][k] * b[k][j];

Trang 41
Đồ án Lập trình tính toán

}
}
}

for (i = 0; i <= n; i++)


{
if (i == 0 || i == n)
{
for (j = 0; j < p; j++)
{
b[i][j] /= 2;
}
}
}

for (i = 0; i <= n + 2; i++)


for (j = 0; j < p; j++)
{
if (i == 0)
{
kq[i][j] = D[i][j];
}
else if (i == n + 2)
{
kq[i][j] = D[n][j];
}
else
kq[i][j] = c[i - 1][j];
}
printf("\n\n\t---------------------------------------\n\n");
printf("\n\nTap nghiem cua he phuong trinh la:\n\n");
if(d == 2){
printf("| x | y\n");
printf("--------------------\n");
} else if(d == 3){
printf("| x | y | z\n");
printf("-----------------------------\n");
}
for (i = 0; i <= n; i++)

Trang 42
Đồ án Lập trình tính toán

{
printf("| ");
for (j = 0; j < p; j++)
{
printf("%.3f | ", c[i][j]);
}
printf("\n\n");
}
}

// ham xuat du lieu ra man hinh


void xuat()
{
int i, j;
printf("\n\n\t---------------------------------------\n\n");
printf("\n\nTap dinh dieu khien P co gia tri la: \n\n");
for (i = 0; i <= n + 2; i++)
{
printf("P(%d) = ", i + 1);
for (j = 0; j < d; j++)
{
if (j == 0)
printf("(%.3f ", kq[i][j]);
else if (j == 1)
{
if (d == 2)
{
printf(", %.3f )\n\n", kq[i][j]);
}
else
printf(", %.3f ", kq[i][j]);
}
else if (j == 2)
{
printf(", %.3f )\n\n", kq[i][j]);
}
}
}
}

Trang 43
Đồ án Lập trình tính toán

//ham luu ket qua vao file


void ghiFILE()
{
FILE *f;
int i, j;
f = fopen("F:\\BSPLINE_INTERPOLATION\\output.txt", "w");
fprintf(f, "\t\t\tKET QUA CUA CHUONG TRINH NOI SUY
DUONG CONG B-SPLINE\n\n");
fprintf(f,"Bac cua duong cong : %d\n\n",p);
fprintf(f,"So dinh dieu khien : %d\n\n",n + 3);
fprintf(f,"Chieu cua diem du lieu : %d\n\n",d);
fprintf(f, "Tap dinh dieu khien P co gia tri la: \n\n");
for (i = 0; i <= n + 2; i++)
{
fprintf(f, "P(%d) = ", i + 1);
for (j = 0; j < d; j++)
{
if (j == 0)
fprintf(f, "(%.3f ", kq[i][j]);
else if (j == 1)
{
if (d == 2)
{
fprintf(f, ", %.3f )\n\n", kq[i][j]);
}
else
fprintf(f, ", %.3f ", kq[i][j]);
}
else if (j == 2)
{
fprintf(f, ", %.3f )\n\n", kq[i][j]);
}
}
}
}

int main()

Trang 44
Đồ án Lập trình tính toán

{
int i, j, choice;
float matran[100][100];
printf("\t\t\t\t\tNOI SUY DUONG CONG B-SPLINE DONG
NHAT\n\n");

printf("***Huong dan nhap du lieu***\n\n");


printf("Moi ban nhap du lieu bao gom: \n");
printf("- Bac cua duong cong (p)\n");
printf("- n + 1 diem du lieu (n)\n");
printf("- Chieu cua diem du lieu (d):\n");
printf("+ (x,y) -> nhap '2'\n");
printf("+ (x,y,z) -> nhap '3'\n");
printf("\nMoi ban chon cach nhap du lieu:\n\n");
printf("Nhan 1 de nhap du lieu bang File\n");
printf("Nhan 2 de nhap du lieu tu ban phim\n\n");
printf("Moi ban nhap: ");
scanf("%d", &choice);

while (choice != 1 && choice != 2)


{
printf("\nMoi ban nhap lai: ");
scanf("%d", &choice);
}
switch (choice)
{
case 1:
docFILE();
break;
case 2:
nhap();
break;
}

//tinh va xuat gia tri vecto nut


Vecto_Nut(u, p, n);

//bieu dien he pt duoi dang ma tran


Matran_N(matran, n);

Trang 45
Đồ án Lập trình tính toán

//tinh ma tran nghich dao de giai he pt


Nghich_dao(matran, n);

//giai he pt
Nhan_matran(matran, D, n, d);

//xuat ket qua


xuat();

//luu ket qua vao file


ghiFILE();

return 0;
}

Trang 46

You might also like