Xấp xỉ hóa hai chiều

Một phần của tài liệu B SPLINE và ỨNG DỤNG TRONG đồ họa máy TÍNH (Trang 45 - 60)

6. Ý nghĩa khoa học của đề tài

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; (adsbygoogle = window.adsbygoogle || []).push({});

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:

3.4.3. Vẽ máy bay Function paintSphere: Function paintSphere: function sphere=paintSphere(var) if (var>10) var=10; elseif (var<1) var=1; end var=1/var; [x,y,z]=meshgrid(-1-var:var:1+var, -1-var:var:1+var, -1- var:var:1+var); w=sqrt(x.^2+y.^2+z.^2); sphere=isosurface(x,y,z,w,1); Function paintCylinder: function cylinder=paintCylinder(var) if (var>10) var=10; elseif (var<1) var=1; end var=1/var; [x,y,z]=meshgrid(-1-var:var:1+var, -1-var:var:1+var, - 1:1:1); w=sqrt(x.^2+y.^2); cylinder=isosurface(x,y,z,w,1);

Đoạn code dùng để vẽ máy bay, sử dụng 2 hàm paintSphere và paintCylinder ở trên.

clear all; clf; ground.facecolor=[.6 .6 .6]; ground.vertices= ... [-10, -10, 0; -10, 10, 0; 10, 10 ,0; 10, -10, 0]; ground.faces=[1 2 3 4]; tower.facecolor=[.4,.8,.4; sphere1=paintSphere(2); sphere1.facecolor='white'; nose=translate(scale(sphere1,3,1,1),-4.5,0,1.01); tailcap=translate(scale(sphere1,2,1,1),4.5,0,1.01); cockpit=translate(scale(paintSphere(1.5),1.5,.75,.5),-2.5,0,2.0); cockpit.facecolor='none'; cyl1=paintCylinder(2); cyl1=translate(rotateY(scale(cyl1,1,1,5),90),0,0,1.01); cyl1.facecolor='blue';

fusilage=combine(cyl1, nose, tailcap, cockpit);

wing=translate(scale(paintSphere(3),1,10,.2),-2,0,1); wing.facecolor='white'; (adsbygoogle = window.adsbygoogle || []).push({});

htail=translate(scale(paintSphere(2),1,4,.2),5,0,1);

vtail=translate(rotateY(scale(paintSphere(2),1,.2,2),30),5,0,2); wingtail=combine(wing, htail, vtail);

for time=0:.1:1

motor.facecolor='white';

motors={ translate(motor,-2,3,1) translate(motor,-2,-3,1) }; prop=rotateX(scale(paintSphere(1.5),.1,2,.2), time*90); prop.facecolor='black';

props=combine(...

translate(prop,-3.1,-3,1),... translate(prop,-3.1,3,1) );

motorprop=combine( motors, props );

plane=combine( fusilage, wingtail, motorprop); plane=translate(plane,0,0,1);

clf

scene=combine( ground, tower, plane ); count=renderpatch(scene); axis off; grid on daspect([1 1 1]) light('position',[10,10,10]) set(gca,'projection','perspective') set(gca,'CameraViewAngle',6) set(gcf,'color', [.4,.8,.4]) xlabel('x');ylabel('y');zlabel('z'); view(-160,20) drawnow; end rotate3d on

Kết quả ta được hình biểu diễn máy bay như sau:

3.4.4. Giao diện chƣơng trình chính

Hình 3.6 sau đây là giao diện chương trình ứng dụng B-Spline xây dựng các đường cong, mặt cong và một số vật thể 3D.

KẾT LUẬN

Trong luận văn này, chúng tôi đã trình bày về đường cong và mặt cong B-Spline và đưa ra ứng dụng trong đồ họa máy tính thông qua việc mô hình một số vật thể 3D được cài đặt trên Matlab.

Luận văn đã tìm hiểu, tổng hợp và trình bày một số kết quả, cũng như xây dựng được ứng dụng cụ thể là:

 Những kiến thức tổng quan về mô hình hóa hình học.

 Lý thuyết về đường cong B-Splines, mặt cong B-Splines.

 Ứng dụng B-Splines vào bài toán mô hình hóa vật thể 3D. Hướng phát triển của luận văn:

 Tiếp tục xây dựng thêm những vật thể 3D phức tạp, sinh động hơn.

 Nghiên cứu ứng dụng trong bài toán khôi phục mặt người từ hộp sọ, một bài toán có ý nghĩa thực tiễn rất lớn trong Y học và Pháp y.

TÀI LIỆU THAM KHẢO Tiếng Việt

[1].Đặng Quang Á, Giáo trình Phương pháp số, Nxb Đại học Thái Nguyên, 2009.

[2].Trịnh Thị Vân Anh, Giáo trình Kỹ thuật Đồ họa, Nxb Thông tin và truyền thông, 2006.

[3].Phạm Anh Phương, Giáo trình Lý thuyết Đồ họa, 2003.

[4].Đỗ Năng Toàn, Giáo trình Xử lý ảnh, NXB Đại học Thái Nguyên, 2007. [5].Nguyễn Thế Tranh, Giáo trình Công nghệ CAD/CAM, NXB Đại học Bách khoa Đà Nẵng, 2007.

Tiếng Anh

[6].Andrés iglesias, B-Splines and nurbs curves and surfaces, 2001.

[7].David William Bullock, Computer Assisted 3D Craniofacial Reconstruction, 1996. (adsbygoogle = window.adsbygoogle || []).push({});

[8].Katrina Marie Archer, Craniofacial reconstruction using hierarchical B- Spline interpolation, B.Eng, Mcgill University, 1992.

[9].Hemant Narendra Khatod, Towards automation of forensic facial reconstruction, B.A. Marathwada University, 2001.

[10].Hartmut Prautzsch, B´ezier- and B-Spline techniques, 2002.

[11].R. Sevilla, 3D nurbs-enhanced finite element method, 7th Workshop on Numerical Methods in Applied Science and Engineering, 2008.

[12].Sung Soo Han, The NURBS human body modeling using local knot removal, Fibers and Polymers, 2008.

[13].Thomas W. Sederberg, An Introduction to B-Spline Curves, 2005. [14].Vincent Prat, Nurbs curves and surfaces tutorial, 2001.

[16].Edmond Nadler, Interactive NURBS Tutorial in Virtual Reality, Eng 477 Project Fair, October 10, 2006.

[17].Kenneth I. Joy, Biquadratic uniform b-spline surface refinement, 2000.

Website [18].http://www.rw-designer.com/NURBS [19].http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES [20].http://www.mathworks.com/matlabcentral/fileexchange [21].http://en.wikipedia.org/wiki/Non-uniform_rational_B-Spline [22].http://interactive-mathvision.com/mck/CalculusII/BezierCurves

Một phần của tài liệu B SPLINE và ỨNG DỤNG TRONG đồ họa máy TÍNH (Trang 45 - 60)