Biểu diễn đường và mặt trong không gian kỹ thuật morphing và di động hình trong không gian hai va ba chiều
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
KHOA TOÁN TIN ỨNG DỤNG
- -
Biểu diễn đường và mặt trong không gian;
Kỹ thuật morphing và di động hình trong không gian hai và ba chiều
Giáo viên hướng dẫn: Nguyễn Hữu Điển Sinh viên thực hiện : Nguyễn Hữu Vượng Lớp: toán 1-k51
Hà Nội, tháng 11 năm 2009
Trang 2Maple là một chương trình mạnh không chỉ cho việc lập trình tính toán mà còn là một công cụ rất mạnh cho việc vẽ hình trong cả không gian 2 và 3 chiều Với Maple, việc thực hiện công việc minh họa các phương trình toán học sẽ trở nên dễ dàng hơn rất nhiều
0 Mục lục một số tùy chọn của chế độ vẽ trong không gian 2 và 3 chiều
Style= Kiểu vẽ đồ thị: Axes= Trục tọa độ
Line
Point
Patch
Đường thẳng Điểm
Đường đứt
(1)Boxed (2)Framed
(3)Normal (4)None
Hình chữ nhật bao trục tọa độ
Khung có chia du
tỷ lệ Tọa độ chuẩn Chỉ có hình vẽ Symbol= Điểm vẽ là: Color= Biểu thị màu hình
vẽ Projection=r 0<r<1, góc chiếu Scaling= Chế độ điều chỉnh
(1)Cross
(2)Diamond
(3)Point
(4)Circle
(5)Box
(6)Default
Dấu cộng Hình thoi Chấm điểm Đường tròn Hình vuông Mặc định
Unconstrained Constrained
Thay tỷ lệ cho hình đều hơn
Tỷ lệ đúng
Line Style= Kiểu vẽ đường: Title=plot title Ghi tiều đề phía
trên đồ thị Grid=[m,n] Chia lưới hình chữ
nhật cỡ mxn Numpoints=n Xác định số điểm
cho lưới
(1)Solid
(2)Dot
(3)Dash
(4)DashDot
Xít nhau Chấm điểm Gạch nối Gạch chấm
Line width= Độ dày đường Coords=
Polar Tọa độ độc cực
(2D) Carterian Tọa độ đê các
(1)Thin
(2)Medium
(3)Thick
Mỏng Trung bình Dầy
Trang 3đường và mặt có các phương trình từ đơn giản đến phức tạp Nó sẽ giúp ích cho người sử dụng trong các bài toán khảo sát hàm số hay trong các bài toán cần
những hình vẽ minh họa
I Gói plots
Là gói chứa thông tin về các hàm vẽ hình trong không gian 2 và 3 chiều; gồm một
số hàm vẽ hình chính:spacecurve, tubeplot, plot3d, sphereplot, cylinderplot,
pointplot Chúng ta sẽ tìm hiểu kĩ hơn về các hàm trong gói tin này trong phần trình bày dưới đây
1.Biểu diễn đường trong trong không gian bằng hàm spacecurve
+Hàm spacecurve: để vẽ một đường trong không gian 3 chiều, chúng ta sẽ sử dụng một hàm spacecurve của gói plots; được biểu diễn dưới dạng:
(1)Vẽ đường trong không gian biết phương trình đường cong:
Spacecurve([phương trình đường], biến=khoảng biến, <tùy chọn>);
(2)Vẽ đường đi qua một tập hợp các điểm cho trước (tối đa 50 điểm):
Spacecurve([tập hợp tọa độ các điểm], <tùy chọn>)
Ví dụ 1: biểu diễn một đường cong với phương trình tham số là:
x=sin3tcost
y=sin3tsint
z=t
>with(plots);
>spacecurve([sin(3*t)*cos(t), sin(3*t)*sin(t),t],t=0 Pi, axes=normal, shading=z);
Ví dụ 2: biếu diễn đường qua các điểm (0,0,1); (0,1,0); (1,0,0);
>with(plots);
>spacecurve([[0,1,0],[1,0,0],[0,0,1]], axes=normal,color=green);
Trang 42.Ứng dụng: Cách biểu diễn đường trong không gian bằng vectơ
Ta có thể biểu diễn đường trong không gian bằng phương pháp vectơ quay, một đường cong là tập hợp đầu mút của các vectơ có hướng được xác định bởi phương trình đường cong đó, khi ta nối điểm ngọn của các vectơ ta có thể thu được một đường cong trong không gian (phương pháp này có thể hiểu là phương pháp vectơ quay)
Ví dụ: vẽ đường cong có phương trình tham số sau:
x=sin3tcost
y=sin3tsint
z=t
>restart:
>with( plots ):
>setoptions3d( thickness=3, axes=normal, scaling=constrained,
orientation=[10,60], lightmodel=light2, view=[-3 3,-3 3,-1 7] ):
>r :=t -> [sin(3*t)*cos(t), sin(3*t)*sin(t), t];
>NFrames:=20:
>FrameSeq:=NULL:
>for i from 0 to NFrames do
>rVector:=arrow(r(2*Pi*i/NFrames),color=red, width=.2):
>Curve:=spacecurve(r(t),t=0 2*Pi*i/NFrames+0.01, color=black):
>FrameSeq:=FrameSeq, display(Curve,rVector)
>end;
>display(FrameSeq,insequence=true);
Trang 5Trong ví dụ trên, ứng với mỗi i và t=0 đến t=2pi sẽ cho ta một vectơ r tương ứng,
ta sử dụng kỹ thuật chạy các Nframe để tạo một animation tương ứng
Ưu điểm của phương pháp dùng phương pháp vector biểu diễn là cho ta một cách nhìn trực quan sinh động về cách tạo nên đường cong trong không gian, điều này
có thể dùng chương trình maple 13 để kiểm chứng
2.Biểu diễn mặt cong trong không gian
+Hàm tubeplot là hàm thuộc gói vẽ hình plots, câu lệnh cũng tương tự như
spacecurve
dùng để biểu diễn các mặt cong dạng ống
(1)Vẽ mặt cong dạng ống biết phương trình đường tâm:
tubeplot({phương trình đường tâm},biến=khoảng biến, <tùy chọn>);
(2)Vẽ mặt cong được sinh ra bởi phương trình đường khi quay xung quanh 1 trục: tubeplot({[0,t,0],radius=phương trình đường giới hạn f(t),biến=khoảng giới hạn,
<tùy chọn>);
ví dụ 1: biểu diễn mặt hình ống có phương trình đường tâm x=4sint, y=4cost, z=t
>with( plots ):
>tubeplot( [4*cos(t),4*sin(t),t], t=0 4*Pi, tubepoints=15, numpoints=70,
axes=normal, scaling=constrained );
Ví dụ 2: biếu diễn một mặt tròn xoay khi xoay đường thẳng quanh 1 trục; phương
trình đường thẳng có phương trình f(x)=–x^3+5x+1
>with(plots):
>f := x -> -x^3 + 5*x + 1:
>a := 0:
>b := 3:
tubeplot( [0,t,0], t=a b, radius=f(t), tubepoints=50, axes=normal );
Trang 6+Hàm plot3d: dùng để vẽ một mặt cong có phương trình z=f(x,y)
plot3d( f(x,y), x=khoảng biến x , y=khoảng biến y, <tùy chọn> )
ví dụ: vẽ hàm f(x,y)=xsiny với x thuộc [-8,8], y thuộc [-π,π]
>plot3d( x*sin(y), x=-8 8, y=-Pi Pi );
+Hàm Sphereplot: dùng để biểu diễn một hình trong tọa độ cầu, cấu trúc câu lệnh Sphereplot(ρ(θ, φ), θ=khoảng biến, φ=khoảng biến, <tùy chọn> );
Trong đó ρ(θ, φ) là phương trình mặt trong toạ độ cầu phụ thuộc vào biến θ và biến φ
Ví dụ: vẽ phương trình mặt trong tọa độ cầu có phương trình ρ=sin θ+sin φ, với θ
thuộc khoảng [0,2π] và φ thuộc khoảng [0, π/3]
> with( plots ):
> sphereplot( sin(theta)+sin(phi), theta=0 2*Pi, phi=0 Pi/3, axes=normal );
Trang 7+Hàm cylinderplot : dùng để biểu diễn mặt trong tọa độ trụ, câu lệnh:
Cylinderplot(r(θ,z), θ=khoản biến,z=khoảng biến,<tùy chọn>);
Ví dụ: biểu diễn hàm r = 6z/(9cos2θ + 4sin2θ), θ thuộc [0, 2π], z thuộc [-2,2]
> with( plots ):
> r := (theta,z) -> 6*z/sqrt(9*cos(theta)^2+4*sin(theta)^2);
> cylinderplot( r(theta,z), theta=0 2*Pi, z=-2 2, scaling=constrained, axes=boxed );
b Ứng dụng: biểu diễn giao tuyến giữa 2 mặt trong không gian
Bằng việc biểu diễn một mặt trong không gian cùng với một tính chất nào đó, hay việc biểu diễn một giao tuyến giữa 2 mặt trong không gian sẽ dễ dàng hơn với maple
Các yếu tố đầu vào gồm:
(1) Mặt z=f(x,y);
(2) Một điểm P(a,b) trong mặt phẳng xy
(3) Một vectơ đơn vị u xuất phát từ điểm P (được biểu diễn hình mũi tên trên mặt phẳng xy)
(4) Mặt phẳng (α) đi qua P vuông góc với mặt phẳng xy và song song với u
Ví dụ: vẽ mặt cong có phương trình f(x,y)= 3sinxsiny/xy, mặt phẳng (α) qua
P(1,1,0) vuông góc với mặt phẳng xy và song song với u, đường giao tuyến giữa mặt cong và mặt phẳng (α)
#khởi tạo chế độ vẽ 3d, dùng thủ tục line trong gói plottools để tránh việc biểu diễn dưới dạng mũi tên, rất khó nhìn#
> restart:
> with( plots ):
> with( plottools, line ):
Trang 8> setoptions3d( axes=boxed, view=[-2 2,-2 2,-0.15 3],
font=[TIMES,ROMAN,24], labels=[x,y,""],
labelfont=[TIMES,BOLDITALIC,24], axesfont=[HELVETICA,18],
lightmodel=light4, scaling=constrained ):
#lựa chọn số lượng frames sử dụng, định nghĩa số gia deltatheta trên trục#
> NumFrames := 16:
> DeltaTheta := 2*Pi/NumFrames:
#biểu diễn hàm cần vẽ f(x,y), điểm P(1,1,0) bất kỳ thuộc mặt phẳng x0y, điểm (1,1,f(1,1)) thuộc d#
> f := (x,y) -> 3*sin(x)*sin(y)/(x*y);
>Surface:=plot3d(f(x,y),x=2 2,y=2 2, style=patchnogrid, shading=zhue,
orientation=[20,75] ):
> Points := pointplot3d( {[1,1,0], [1,1,f(1,1)]}, color=black, symbol=circle ):
#biểu diễn các vectơ đơn vị u(i) dưới dạng mũi tên với u(i) = (cos(i∆θ), sin(i∆θ),
0 ) với i = 0, 1, 2, ,NumFrames −1#
> u1 := i -> cos(i*DeltaTheta):
> u2 := i -> sin(i*DeltaTheta):
> u := i -> arrow( [1,1,0], <u1(i),u2(i),0>, width=.1, color=red ):
> UnitVectors := display( seq( u(i), i=0 NumFrames-1 ), insequence=true ):
#biểu diễn mặt phẳng (α) đi qua P và vuông góc vơi mp xy và song song vectơ u#
> P := i -> [1+r*u1(i), 1+r*u2(i), z]:
> VerticalPlanes := animate3d( P(i), r=-1 1, z=0 3, i=0 NumFrames-1,
frames=NumFrames, grid=[7,10], color=gray, style=wireframe ):
#Biểu diễn đường giao tuyến d của mp (α) với mặt cong#
> T := i -> [1+r*u1(i), 1+r*u2(i), f(1+r*u1(i),1+r*u2(i))]:
> Traces:= display( seq( spacecurve( T(i), r=-1 1), i=0 NumFrames-1),
color=black, thickness=2, insequence=true ):
#dùng câu lệnh display để hiển thị các yếu tố trên cùng một hình#
> display( Surface, Points, VerticalPlanes, UnitVectors, Traces);
Trang 9II.Kỹ thuật morphing và di động hình trong không gian hai và
ba chiều:
1.Giới thiệu về gói Plottools và một số các hàm liên quan
*Gói Plottools chứa các hàm hữu ích cho việc vẽ hình Các hàm được chứa trong gói plottools gồm:
+Hàm circle: mục đích dùng để vẽ một đường tròn trong mặt phẳng với tâm có tọa
độ [c1,c2], bán kính=r
Circle([c1,c2], bán kính, tùy chọn);
Ví dụ: biểu diễn đường tròn tâm tọa độ (1,2), bán kính 3
> with( plottools ):
> with( plots ):
> display( circle( [1,2], 3, color=green ),
scaling=constrained );
+Hàm line: dùng để vẽ một đường thẳng đi qua 2 điểm trong không gian 2 và 3 chiều
line( [x1,y1], [x2,y2], tùy chọn ); #không gian 2 chiều# line( [x1,y1,z1], [x2,y2,z2], tùy chọn ); #không gian 3 chiều#
ví dụ: vẽ đường thẳng đi qua 2 điểm có tọa độ tương ứng trong không gian 2 chiều
và 3 chiều
> with( plottools ):
>L1:= line( [-1,-2], [2,3], color=magenta ):
>L2:= line( [1,-1,1], [2,3,4], color=blue, thickness=3 ):
> with( plots ):
> display(L1 );
> display( L2, axes=normal, orientation=[20,70] );
Trang 10+Hàm polygon: dùng để biểu diễn các miền đa diện trong mặt phẳng và trong không gian bằng việc nối tọa độ các đỉnh của đa diện
polygon( [[x1,y1], [x2,y2], , [xn,yn]], tùy chọn ); #không gian 2 chiều# polygon( [[x1,y1,z1], [x2,y2,z2], , [xn,yn,zn]], tùy chọn); #không gian 3 chiều#
ví dụ1: biểu diễn một mặt phẳng được tạo bởi các điểm
> with( plottools ):
> with( plots ):
> display( polygon( [[0,0], [2,0], [1,sqrt(3)]],
color=green ), scaling=constrained );
> display( polygon( [[1,0,0], [0,1,0], [0,0,1]],
color=yellow, thickness=3 ), axes=normal );
Ví dụ 2: biểu diễn một khối đa diện (bằng việc xây dựng các mặt phẳng đa diện,
Trang 11> P5 := [0,0,1]:
> P6 := [1,0,1]:
> P7 := [1,1,1]:
> P8 := [0,1,1]:
> P9 := [.5,.5,1.4]:
> face1 := polygon( [P1,P2,P3,P4], color=navy ):
> face2 := polygon( [P1,P2,P6,P5], color=turquoise ):
> face3 := polygon( [P2,P3,P7,P6], color=aquamarine ):
> face4 := polygon( [P3,P4,P8,P7], color=sienna ):
> face5 := polygon( [P4,P1,P5,P8], color=gray ):
> face6 := polygon( [P5,P6,P9], color=maroon ):
> face7 := polygon( [P6,P7,P9], color=tan ):
> face8 := polygon( [P7,P8,P9], color=wheat ):
> face9 := polygon( [P8,P5,P9], color=khaki ):
> display( face1, face2, face3, face4, face5, face6, face7,
face8, face9, scaling=constrained );
+Hàm rotate: là hàm sử dụng để xoay hình một góc nào đó xung quanh 1 điểm, 1 trục hoặc 1 đường:
rotate(dạng hình, góc xoay,điểm xoay );
rotate(dạng hình, α-góc quay với trục x, β-góc quay với trục y, γ-góc quay với trục z);
rotate(dạng hình, góc quay, [[x1,y1,z1],[x2,y2,z2]] );
ví dụ: xoay miền tam giác một góc Pi/8 xung quanh điểm có tọa độ (2,0)
>with( plottools ):
>with( plots ):
>T := polygon( [[0,0], [2,0], [1,sqrt(3)]], color=green ):
>display(T, scaling=constrained );
>display( rotate(T, Pi/8, [2,0]), scaling=constrained );
Trang 12Ví dụ: xoay hình hypebolit một góc Pi/3 so với trục x, -Pi/3 so với trục y, cố định
góc trục z
> with( plots ):
> with( plottools ):
> r := (theta,z) -> 6*sqrt((z^2+1)/(9*(cos(theta))^2+4*(sin(theta))^2)):
> Hyperboloid := cylinderplot( r(theta,z), theta=0 2*Pi,
z=-2 2, axes=boxed, scaling=constrained ):
> Hyperboloid;
> rotate( Hyperboloid, Pi/3, -Pi/3, 0 );
Trang 13+Hàm transform: hữu ích cho việc vẽ hình với phương pháp tịnh tiến hay đổi trục toạ dộ
Transform((toạ trục ban đầu)Æ(tọa độ trục sau khi thay đổi));
Ví dụ: đổi mặt từ hệ trục toạ độ (x,y) sang hệ trục toạ độ (y,x)
>with( plots ):
>with( plottools ):
>setoptions( view=[-3 3,-3 3], scaling=constrained ):
>rect:= polygon( [[0,0], [2,0], [2,1], [0,1]], color=plum ):
>Refl:= transform( (x,y)-> [y,x] ):
>display( rect );
>display( Refl(rect) );
Trang 142.Ứng dụng: kỹ thuật morphing và kỹ thuật di động hình
a Kỹ thuật di động hình:
Ví dụ 1: dùng hàm rotate trong di động hình, ta lần lượt xoay hình các góc là Pi/i
với i=0, ,Nframe Ta sử dụng kỹ thuật tạo hình động với Nframe thay đổi
>with(plottools):
>with(plots):
>T:=polygon([[0,0], [2,0], [1,sqrt(3)]], color =green ):
>NFrames:= 50:
>FramSeq:= NULL:
>for i from 0 to Nframes do
>FrameSeq:= FrameSeq, display( rotate(T,Pi*i/NFrames, [2,0]), scaling=
constrained);
>end;
>display(FrameSeq, insequence= true);
Trang 15> restart:
> with( plots ):
> with( plottools ):
> setoptions3d( style=patch, axes=normal, scaling=constrained,
labels=["x","y",""], labelfont=[TIMES,BOLDITALIC,24],
axesfont=[HELVETICA,18] ):
> P1 := [0,0,0]:
> P2 := [1,0,0]:
> P3 := [1,1,0]:
> P4 := [0,1,0]:
> P5 := [0,0,1]:
> P6 := [1,0,1]:
> P7 := [1,1,1]:
> P8 := [0,1,1]:
> P9 := [.5,.5,1.4]:
> face1 := polygon( [P1,P2,P3,P4], color=navy ):
> face2 := polygon( [P1,P2,P6,P5], color=turquoise ):
> face3 := polygon( [P2,P3,P7,P6], color=aquamarine ):
> face4 := polygon( [P3,P4,P8,P7], color=sienna ):
> face5 := polygon( [P4,P1,P5,P8], color=gray ):
> face6 := polygon( [P5,P6,P9], color=maroon ):
> face7 := polygon( [P6,P7,P9], color=tan ):
> face8 := polygon( [P7,P8,P9], color=wheat ):
> face9 := polygon( [P8,P5,P9], color=khaki ):
> obelisk := display( face1, face2, face3, face4, face5,
face6, face7, face8, face9 ):
> N := 20:
> F := (x,y,z) -> (1-k/N)*<x,y,z> + k/N*(A.<x,y,z>):
> L := transform( (x,y,z) -> convert( F(x,y,z), list ) ):
> A := < <0,1,0> | <1,0,0> | <0,0,-1> >;
> Frames := seq( L(obelisk), k = 0 N ):
> display( Frames, insequence=true );
Trang 16b.Kỹ thuật morphing
Là phép biến hình, biến đồ thị của một hàm thành đồ thị của hàm khác theo một cách thức nào đó, ta có thể coi đây là ánh xạ biến điểm bất kỳ thuộc đồ thị này thành một điểm thuộc đồ thị khác (x1(t),y1(t))Æ(x2(t),y2(t));
Ví dụ: biến đường cong có phương trình x1=2(cost)^3; y1=3(sint)^3 thành đường
có phương trình x2=3cost-cos3t; y=3sint-sin3t
> x1 := t -> 2*cos(t)^3:
> y1 := t -> 3*sin(t)^3:
> plot( [x1(t),y1(t), t=0 2*Pi], scaling=constrained ):
> x2 := t -> 3*cos(t)-cos(3*t):
> y2 := t -> 3*sin(t)-sin(3*t):
> plot( [x2(t),y2(t), t=0 2*Pi], scaling=constrained ):
> with( plots ):
> animate( [(1-k)*x1(t)+k*x2(t),(1-k)*y1(t)+k*y2(t), t=0 2*Pi], k=0 1,
scaling=constrained );