6. Ý nghĩa khoa học của đề tài
2.3. Đường cong B-Spline
Đường cong B-Spline đều được xây dựng trên vector đều. Vector nút là đều khi giá trị của chúng cách đều nhau một khoảng ∇ xác định.
Trong các bài toán thực tế, thông thường thì khoảng xác định của tham biến nằm trong đoạn từ 0 đến 1 hay từ 00 đến 3600 thì việc chọn giá trị của các vector nút được chuẩn hoá trong đoạn [0;1] hay [00
;3600]. Ví dụ 2.2: Các vector nút đều
T1 = [0.2 0.4 0.6 0.81] có ∇ = 0.2 T2 = [00 1200 2400 3600] có ∇ = 1200
Các vector nút gọi là đều và tuần hoàn khi các hàm B-Spline đối với mỗi phân đoạn có thể chuyển đổi lẫn nhau. Số lượng của vector nút được qui định bởi biểu thức z = n + m [2].
Ví dụ 2.3: Xét một đa giác kiểm soát với bốn đỉnh. Các đường cong B- Spline bậc 2, 3, 4 được xây dựng dựa trên đa giác kiểm soát có số lượng các nút z = n + m sẽ có vector nút như trong Bảng 2.1 sau:
Bậc m Vector nút (z = n + m) 2 [0 1 2 3 4 5 6 7] 3 [0 1 2 3 4 5 6 7 8] 4 [0 1 2 3 4 5 6 7 8 9]
Bảng 2.1: Vector nút đều
Ảnh hưởng của mỗi hàm cơ sở được giới hạn trong m đoạn là bậc của đường cong cần thể hiện. Với đường cong bậc ba thì ảnh hưởng của hàm cơ sở trải dài trên bốn đoạn của đường cong.
Đường B-Spline tuần hoàn không đi qua các điểm đầu và cuối của đa giác kiểm soát ngoại trừ với đường bậc 1 (m=2) mà khi đó đường cong chuyển dạng thành đường thẳng. Khi m=2 đường cong bậc một trùng với các cạnh của đa giác kiểm soát. Khi m=3, đường cong B-Spline bậc 2, bắt đầu tại trung điểm của cạnh thứ nhất và kết thúc tại trung điểm của cạnh cuối cùng của đa giác kiểm soát.
2.3.2.4.Đường cong B-Spline không tuần hoàn
Một vector không tuần hoàn hoặc mở là vector nút có giá trị nút tại các điểm đầu cuối lặp lại với số lượng các giá trị lặp lại này bằng chính bậc m của đường cong và các giá trị nút trong mỗi điểm lặp này là bằng nhau.
Nếu một trong hai điều kiện này hoặc cả hai điều kiện không được thoả mãn thì vector nút là không đều.
Ví dụ 2.4: Xét một đa giác kiểm soát với bốn đỉnh. Các đường cong B- Spline bậc 2, 3, 4 được xây dựng dựa trên đa giác kiểm soát có số lượng các nút z = n + m có vector nút như trong Bảng 2.2 sau:
Bậc m Số lượng nút (z = n + m) Vector nút không tuần hoàn
2 6 [0 0 1 2 3 3]
3 7 [0 0 0 1 2 2 2]
4 8 [0 0 0 0 1 1 1 1]
Bảng 2.2: Vector nút của đường cong B-Spline bậc 2,3,4 không tuần hoàn Các vector nút không tuần hoàn cung cấp các hàm cơ sở được định nghĩa trong một miền tham số phức tạp. Đường cong B-Spline loại này luôn đi qua các điểm đầu và cuối của đa giác kiểm soát.
Đường cong Bezier là trường hợp đặc biệt của B-Spline không tuần hoàn, trong đó số lượng các đỉnh sử dụng bằng với bậc của đường cong.
Đường cong B-Spline bậc ba với bốn điểm kiểm soát và vector không tuần hoàn [0 0 0 0 1 1 1 1] cũng chính là đường cong Bezier.
2.3.2.5.Đường cong B-Spline hữu tỷ không đều
Đường cong B-Spline hữu tỷ không đều (Non-Uniform Rational B- Spline viết tắt là NURBS) được tạo thành từ các vector nút không đều.
Trong vector nút không tuần hoàn, giá trị các nút xuất hiện tại các biên được lặp lại và các nút bên trong các bước nút bằng nhau. Nếu một trong hai
điều kiện này hoặc cả hai điều kiện này không được thoả mãn thì vector nút là không đều.
Một đường cong B-Spline hữu tỷ không đều bậc m-1 được xây dựng dựa trên vector nút T và (n + l) điểm kiểm soát Pi có dạng :
𝐶 𝑡 = 𝑃𝑖𝑤𝑖𝑁𝑖,𝑚 𝑡 𝑤𝑖𝑁𝑖,𝑚 𝑡 𝑛 𝑖=0 𝑛 𝑖=0 (2.26)
Trong đó Ni,m là hàm Cox-de Boor được định nghĩa như trong công thức (2.20), wi là trọng số của các điểm kiểm soát. Nếu các trọng số là bằng nhau thì đường cong trở thành dạng đa thức.
Các nút không đều có thể tạo ra bằng cách đặt các giá trị lặp lại đối với các nút ở khoảng giữa của vector nút, chẳng hạn vector nút [0 1 2 3 3 4 5] là vector không đều. Hoặc ta có thể tạo ra bước nhảy không bằng nhau giữa các nút, chẳng hạn vector nút [0.0 0.2 0.5 0.75 1.0] là không đều.
Các vector nút loại đều cho phép người sử dụng dễ hình dung và xử lý trong các phép toán nhưng trong một số trường hợp bước nút không đều lại có những ưu điểm đặc biệt, như trong việc điều khiển hình dạng của đường cong trong tiến trình thiết kế, khi các sai lệch không mong muốn có thể xuất hiện mà việc sử dụng đường cong B-Spline đều với các dữ liệu điểm có các khoảng cách tương đối lớn lại không đều nhau.
Như vậy, ta có thể thay đổi hình dạng đường cong B-Spline bằng các cách sau:
Thay đổi kiểu vector nút: đều tuần hoàn, mở hoặc không đều.
Thay đổi cấp (hoặc bậc) của đường cong.
Thay đổi số đỉnh và vị trí các đỉnh của đa giác kiểm soát.
2.4. Mặt cong B-Spline
Các hàm B-Spline có thể dùng ở dạng tích Tensor thay cho dạng đa thức Bernstein để đạt được tính kiểm soát cao hơn khi thiết kế mặt cong.
Mặt B-Spline cũng được hình thành trên phép trượt của đường cong B- Spline. Giả sử ta có một mảng (N+1).(K+1) phần tử. Các điểm kiểm soát Pij, với 0 ≤ i ≤ n, 0 ≤ j ≤ l tạo thành khối đa diện kiểm soát. Khi đó các điểm trên mặt cong B-Spline S được tính theo công thức:
𝑆 𝑢, 𝑣 = 𝑃𝑖𝑗𝑁𝑖,𝑚 𝑢 𝑁𝑗 ,𝑚 𝑣 𝑙 𝑗 =0 𝑛 𝑖=0 (2.27)
Khối đa diện kiểm soát có (N+l).(K+l) đỉnh u và v, biến thiên từ 0 tới giá tri lớn nhất của nút trong các vector nút tương ứng của chúng. Hình 2.6 sau đâu biểu diễn mặt cong B-Spline.
Hình 2.6: Mặt cong B-Spline
Thông thường để thiết kế, người ta vẫn dùng các B-Spline cấp 4 (tức là cubic B-Spline) và do việc chọn số điểm kiểm soát không hạn chế (số lượng các điểm không ảnh hưởng đến bậc của đa thức như đối với đường cong Bezier) nên có thể tạo ra các dạng mặt cong rất phức tạp. Tất nhiên trước đó, ta phải chọn ra một đa diện nút (knot polyhedron) để tạo ra mặt cong có dạng mong muốn.
Chƣơng 3.
Ứng dụng B-Spline mô hình hóa các vật thể 3D
Chương này trình bày về:
- Bài toán mô hình hóa vật thể 3D
- Tìm điểm kiểm soát cho đường cong B-Spline - Xây dựng một số vật thể 3D.
3.1. Bài toán mô hình hóa các vật thể 3D
Ngày nay, nhờ sự phát triển của khoa học kỹ thuật và công nghệ mà loài người đã có những bước tiến lớn trong nhiều lĩnh vực khác nhau. Và một trong số đó là vấn đề khôi phục và biểu diễn các đối tượng 3D. Khôi phục đối tượng 3D đã trở thành một nhu cầu cần thiết trong các lĩnh vực khác nhau như: Tạo ảnh trong y học, các ứng dụng mỹ thuật, thiết kế sản phẩm, tạo nguyên mẫu nhanh và trong các phạm vi khác. Việc tạo mô hình 3D bằng phương pháp thủ công tốn nhiều thời gian và do vậy chi phí sẽ đắt đỏ. Vì lý do đó, các kỹ thuật đã và đang tiếp tục được nghiên cứu, các kỹ thuật này cho phép khôi phục tự động các đối tượng 3D. Các kỹ thuật này có thể chia thành 2 phương pháp: phương pháp chủ động và phương pháp bị động. Nhược điểm của các phương pháp chủ động là quá trình khôi phục có thể trở thành một công trình tiêu tốn ngân sách cao. Vì lý do đó, cách tiếp cận được giới thiệu thuộc về các phương pháp bị động, nó yêu cầu ít thiết bị hơn và có thể áp dụng một cách tổng quát hơn.
Các phương pháp khôi phục các đối tượng 3D truyền thống không thực hiện tốt ở hai hướng:
Thứ nhất: Chúng không thể xử lý các trường hợp có độ phức tạp cao được tìm thấy trong tự nhiên như các bộ phận cơ thể của con người hay các ảnh cực nhỏ của mô.
Thứ hai: Chúng không đưa dữ liệu bề mặt vào một định dạng làm cho nhỏ gọn và thích hợp để mô phỏng, hiển thị hoặc định vị
Có 5 trường hợp khôi phục các đối tượng 3D.
Trường hợp đầu tiên là với các ảnh được chụp bằng máy ảnh không định cỡ, làm việc với loại ảnh này có thể khôi phục lại đối tượng so sánh với các phép biến đổi ánh xạ.
Hai là, khôi phục từ các máy ảnh định cỡ làm việc với loại ảnh này có thể khôi phục lại đối tượng so sánh với các phép biến đổi đồng dạng.
Ba là, các thuộc tính đại số của các hàm đa tuyến tính và các lý tưởng phát sinh bởi chúng được nghiên cứu.
Trường hợp thứ tư sử dụng kỹ thuật khôi phục Ơ-clít khi một số thông tin của các máy ảnh được đưa ra.
Trường hợp cuối cùng là khôi phục một ảnh của một đối tượng hoặc bản vẽ nét được biết tới là mảnh 2 chiều.
Như vậy có thể thấy rằng bài toán khôi phục và biểu diễn các đối tượng 3D là một bài toán có ý nghĩa rất lớn và quan trọng.
3.2. Phép nội suy và mịn hóa đƣờng cong
Trong các lĩnh vực ứng dụng số, nhiệm vụ của chúng là phải biểu diễn số liệu, thường là các số đo bằng các chức năng phân tích. Có hai cách giải quyết vấn đề này, trong phương pháp nối điểm hay nội suy (interpolation) thì dữ liệu được coi là đúng và cái chúng ta cần là cách biểu diễn dữ liệu không nằm giữa các giá trị đo được, theo phương pháp thứ hai gọi là phương pháp mịn hóa đường cong (curve fitting or regression), ta tìm một đường cong không gấp khúc mà phù hợp nhất với dữ liệu đã có, nhưng không cần thiết phải đi qua một cách chính xác bất kỳ một điển nào trên bảng số liệu. Hình 3.1 minh họa hai phương pháp trên, chữ o đánh dấu các điểm biểu diễn dữ liệu, các đoạn thẳng bằng nét liền nối các đường biểu diễn dữ liệu lại với nhau theo
phương pháp nối điểm còn đường chấm chấm là một đừng cong vẽ theo phương pháp mịn hoa dữ liệu.
Hình 3.1 Phép nối điểm và mịn hóa đường cong
3.2.1. Nối điểm một chiều
Như đã giới thiệu thì nối điểm được định nghĩa như là một phương pháp dự đoán giá trị của hàm giữa những điểm cho trước. Nối điểm là một công cụ hữu hiệu khi chúng ta không thể tính toán nhanh chóng được giá trị của hàm tại các điểm trung gian. Phương pháp này được sử dụng rộng rãi đối với dữ liệu là giá trị của các phép đo thực nghiệm hoặc là kết quả của các chuỗi tính toán. Ví dụ đơn giản nhất của việc nối điểm chính là phương pháp vẽ từng điểm của MATLAB, tức là vẽ những đoạn thẳng nối những điểm dữ liệu liên tiếp để tạo thành một đồ thị.
Đây là phương pháp nối điểm tuyến tính, theo phương pháp này các giá trị của hàm nằm giữa hai điểm cho trước sẽ rơi vào khoảng giữa hai đầu của
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 -2 0 2 4 6 8 10 12
đoạn thẳng nối hai điểm đó. Hiển nhiên là khi số lượng các điểm dữ liệu tăng lên và khoảng cách giữa chúng giảm đi thì phương pháp nối điểm tuyến tính càng trở nên chính xác.
3.2.2. Xấp xỉ hóa hai chiều
Xấp xỉ hóa hai chiều dựa trên cùng một nguyên lý của xấp xỉ hóa một chiều. Tuy nhiên như tên của nó đã chỉ ra, xấp xỉ hóa hai chiều là xấp xỉ một hàm phụ thuộc vào hai biến độc lập z = f(x,y).
Cũng giống như trong trường hợp xấp xỉ hoa một chiều, xấp xỉ hoa hai chiều cũng có nhiều phương pháp, mà phương pháp đơn giản nhất là phương pháp nối bằng đoạn thẳng, hay còn gọi là nối tuyến tính. Ta có thể xấp xỉ hóa để cho đồ thị trở nên mịn hơn với độ phân giải cao hơn.
3.3. Tìm điểm kiểm soát cho đƣờng cong B-Spline
Trong các mục trước ta đã tìm hiểu cách xác định phương trình đường cong B-Spline qua đa giác kiểm soát của chúng. Ta sẽ xét vấn đề ngược lại là nếu biết trước một số điểm của đường cong liệu ta có thể xác định được các đa giác kiểm soát của đường cong đó hay không? Câu trả lời là có và đường cong B-Spline xác định bởi các điểm kiểm soát này được gọi là đường cong B-Spline phù hợp (B-Spline curve fit).
Hình 3.2 Xác định đa giác kiểm soát của đường cong B-Spline qua một số điểm đã biết nằm trên đường cong.
B2
B3
B4
3.4. Vẽ một số đối tƣợng 3D
Thiết kế các đối tượng là một phần trung tâm quan trọng của đồ họa máy tính.Có nhiều phương pháp để xây dựng các đối tượng hình học. Ở đây, ta sẽ tìm hiểu phương pháp xây dựng dựa trên mô hình B-Spline phân cấp (hierarchical building system) [7].
Xét ví dụ cụ thể là một chiếc máy bay có thể gồm các bộ phận bánh xe, thân, cánh … trong đó các cánh quạt của nó có thể xoay khi cất cánh nhưng thân của nó thì đứng yên. Mô hình của chiếc máy bay có thể biểu diễn bằng hàng chục các chi tiết hình học. Như vậy để mô hình hóa một đối tượng đồ họa ta sẽ xây dựng hệ thống bao gồm các hình đơn giản của các đối tượng sau đó kết hợp lại với nhau để được vật thể sinh động. Các mô hình được xây dựng bằng hai phương pháp:
Mô tả bằng các bề mặt: Có thể là các mặt đơn giản như hình cầu và có thể là các mặt B-Spline phức tạp.
Xây dựng các khối hình, khung hình, sau đó chuyển đổi sang các bề mặt, và có thể kết hợp với các bề mặt.
Để lập trình trong Matlab, ta gom nhóm mỗi mô hình cơ bản (như hình cầu, hình trụ ...) trong một hàm Matlab. Sau đó sử dụng các hàm renderpatch để chuyển đổi một hình ảnh sang dạng bóng mờ, hàm renderwire để chuyển đổi các khung hình.
3.4.1. Vẽ quả táo
Function Apple:
function [cordX, cordY, cordZ] = apple(sizeTheta, sizeFai) if nargin ==0
sizeTheta = 30; sizeFai = 40; elseif nargin < 2
error('NotEnoughArugments', ''); end;
theta = linspace(0, pi, sizeTheta)'; nudge = 0.0001;
fai = linspace(0 + nudge, pi/2 - nudge, round(sizeFai/4)); a = 9/4;
b = 9/80;
A = 1+(a-1)*(sin(theta).^2) * (sin(fai).^2);
B = (sin(theta).^2.*cos(theta).^3) * (1 + (b-1)*(sin(fai).^2)); rou = zeros(size(A));
for iLoop = 1:numel(A); curA = A(iLoop); curB = B(iLoop);
polyFactors = [curA^3, -curB, -3*curA^2, 0, 3*curA, 0, -1]; solutions = roots(polyFactors);
realRou = real(solutions(abs(imag(solutions))< 1e-9)); rou(iLoop) = realRou(realRou>0);
end
x = rou .* (sin(theta) * cos(fai)); y = rou .* (sin(theta) * sin(fai));
z = rou .* (cos(theta) * ones(size(fai))); cordX = [x, -fliplr(x) , -x, fliplr(x)]; cordY = [y, fliplr(y) , -y, -fliplr(y)]; cordZ = [z, fliplr(z), z, fliplr(z)];
Đoạn code dùng để vẽ lọ hoa, sử dụng hàm paintSurface(var)ở trên. close all; [x,y,z] = apple; bottomZ = min(z(:)); radius = abs(bottomZ); axis vis3d axis off daspect([1.6, 1, 1.875]); hold on; markerColor = [0.8, 0.8, 0.8]; lineColor = [0.7, 0.7, 0.7]; figWidth = 600 figHeight = 500;
screenSize = get(0, 'ScreenSize'); X0 = (screenSize(3)-figWidth)/2; Y0 = (screenSize(4)-figHeight)/2;
set(gcf, 'Position', [X0,Y0, figWidth, figHeight]); camtarget([0, 0, 0]); set(gcf,'Renderer','zbuffer'); set(gcf,'DoubleBuffer','on'); set(gcf, 'color', [100 105 100]/255); startAZ = 20; satrtEL = 40; view(startAZ, satrtEL); for iLoop = 1:size(x, 1)
plot3(x(iLoop, :), y(iLoop,:), z(iLoop, :), 'Marker', '.', 'MarkerEdgeColor', markerColor, 'LineStyle', 'none');
end
for iLoop = 1:size(x, 1)
plot3(x(iLoop, :), y(iLoop,:), z(iLoop, :), 'color', lineColor, 'LineStyle', '-');
end
for iLoop = 1:size(x, 2)
plot3(x(:, iLoop), y(:, iLoop), z(:, iLoop), 'color', lineColor, 'LineStyle', '-'); end for i=1:36 camorbit(10,0,'data'); end delete(get(gca, 'Children')); camlight left; newLineColor = [0.7, 0.4, 0.4];
h = surf(x,y,z, 'EdgeColor', newLineColor, 'FaceColor', 'r'); for i=1:36
camorbit(10,0,'data'); end
mediumColor = [0.8, 0.3, 0.3];
set(h, 'EdgeColor', mediumColor,'FaceLighting','gouraud'); for i=1:36
camorbit(10,0,'data'); drawnow;
set(h, 'EdgeColor', 'none'); drawnow;
deltaZ = linspace(-.3, 0, 5); deltaZ = [fliplr(deltaZ), deltaZ]; deltaZ = repmat(deltaZ, 1, 3); zlim('manual');
for iLoop = 1:length(deltaZ)
curDeltaZ = deltaZ(mod(iLoop,length(deltaZ))+1); ratio = (radius+curDeltaZ)*radius;
newZ = z*ratio + curDeltaZ;
if exist('h', 'var')&& ishandle(h), delete(h);end; h = surf(x,y, newZ, 'EdgeColor', 'none', 'FaceColor', 'r','FaceLighting','gouraud'); camorbit(-1, 0, 'data'); drawnow; end deltaZ = generateSimulatedBouncingPath; zlim([-1, 3]); rotate3d on
Hình 3.3: Biểu diễn quả táo 3.4.2. Vẽ lọ hoa Function paintSurface: function surface=paintSurface(var) if (var>100) var=100; elseif (var<1) var=1; end var=1/var; [x,y,z]=meshgrid(-1:var:1, -1:var:1, -1:1:1); w=z; surface=isosurface(x,y,z,w,0);
Đoạn code dùng để vẽ lọ hoa, sử dụng hàm paintSurface(var)ở trên.
clf s1= paintSurface (100); s1.facelighting='flat'; s1.facecolor='red'; V=s1.vertices; r=1.5 + abs(V(:,2)).*cos(2*pi*V(:,2));
s1.vertices=[cos(pi*V(:,1)).*r, sin(pi*V(:,1)).*r, 3*V(:,2)]; count=renderpatch(s1); axis off; grid on daspect([1 1 1]) light('position',[100,-100,100]) set(gca,'projection','perspective') set(gca,'CameraViewAngle',8) set(gcf,'color', [.6,.8,.8]) xlabel('x');ylabel('y');zlabel('z'); view(-40,30) drawnow rotate3d on
kết quả ta được hình biểu diễn lọ hoa như sau: