CTH/GU LABORATION 5 TMV6/MMGD - 7/8 Matematiska vetenskaper Inledning Geometriska transformationer Vi skall se på några geometriska transformationer; rotation, skalning, translation, spegling och projektion. Rotation och skalning är linjära avbildningar och kan beskrivas med en matriser. Translation däremot är inte en linjär avbildning, det är en affin avbildning. När det gäller projektion och spegling får vi skilja på olika fall, t.ex. en ortogonal (vinkelrät) projektion i R 3 på ett plan är en linjär avbildning om och ast om planet går genom origo. Rotation, skalning och translation i R Betraktaenpunktx = (x,x )ir.rotationmotursmedvinkelnφruntorigogesavt : R R, där T(x) = Ax med avbildningsmatrisen [ ] cos(φ) sin(φ) A = sin(φ) cos(φ) Motsvarande för skalning och translation blir respektive S(x) = Bx = F(x) = x+t = [ ][ ] s x s x För translation finns ingen avbildningsmatris eftersom det inte är en linjär avbildning. Vi illustrerar med Matlab. I figuren nedan till vänster ser vi ett polygonområde med svart rand som vi roterar några gånger med vinkeln π och ritar med röd rand. Vi tänker oss att vi redan 6 skapat koordinater i radvektorerna X och Y som beskriver det ursprungliga området. [ x x ] + fill(x,y, g, edgecolor, k, linewidth,), hold on axis equal, axis([-.5 -. ]), pause() v=pi/6; A=[cos(v) -sin(v); sin(v) cos(v)]; P=[X;Y]; for i=:3 P=A*P; % Varje koordinatpar roteras med vinkeln pi/6 fill(p(,:),p(,:), g, edgecolor, r, linewidth,), pause() plot(,, ko, linewidth,, markersize,) % origo [ t t ]
.5.5 Till höger ser vi samma område i ursprungsläget (svart kant) samt några upprepade translationer (röd kant) med vektorn t. fill(x,y, g, edgecolor, k, linewidth,), hold on axis equal, axis([-.5 -. ]), pause() t=[-.6;.3]; P=[X;Y]; for i=:3 P=P+t*ones(size(X)); fill(p(,:),p(,:), g, edgecolor, r, linewidth,), pause() Uppgift. Rotera och translatera ett polygonområde ni genererar själva, t.ex. en triangel. 3 Rotation, skalning och translation i R 3 Betrakta en punkt x = (x,x,x 3 ) i R 3. Rotation med vinkeln φ kring x -, x - och x 3 -axlarna ges av T : R 3 R 3, där T(x) = Ax med följande respektive avbildningsmatriser cos(φ) sin(φ) cos(φ) sin(φ) A = cos(φ) sin(φ), A =, A = sin(φ) cos(φ) sin(φ) cos(φ) sin(φ) cos(φ) Rotationen sker medurs sett i axelriktningarna. Motsvarande för skalning och translation blir respektive s x S(x) = Bx = s x s 3 x 3 x t F(x) = x+t = x + t x 3 t 3 Nu skall ni rita en kub som vi skall transformera på lite olika sätt.
Vi ritar en enhetskub enligt H=[ % H(:,j), j:te kolonnen i H, ger koordinater för hörnpunkt j % size(h,) ger antal hörnpunkter ]; S=[ 4 3 % S(i,:), i:te raden i S, ger nr på hörnpunkter på sida i 6 5 3 7 5 3 4 8 7 4 8 6 5 6 8 7]; % size(s,) ger antal sidor figure(), clf, hold on for i=:size(s,) Si=S(i,:); fill3(h(,si),h(,si),h(3,si), g, facealpha,.7) axis equal, axis tight, axis off,, view(,) Lägg lite tid på att tänka igenom det vi gjort. Hörnpunkternas koordinater ligger som kolonner i matrisen H. På raderna i matrisen S har vi numren på hörnpunkterna på sidorna, t.ex. första raden ( 4 3) ger numren på hörnpunkterna som ger botten på kuben. Antal kolonner i H, som ges av size(h,), är antalet hörnpunkter. Antalet rader i S, som ges av size(s,), är antalet sidor. Med for-satsen ritar vi upp alla sidor. Vi plockar ut en sidas hörnpunkter med Si=S(i,:) och motsvarande kolonner i H, dvs. H(:,Si) ger koordinaterna för hörnpunkterna. Vi ritar sidan med fill3, som fungerar som fill fast i rummet. Här måste vi separera x -, x - och x 3 -koordinaterna. Med H(,Si) får vi x -koordinaterna för hörnpunkterna på sidan, osv. Vi får kuben lite lätt genomskinlig med facealpha,.7. För solid kub sätt facealpha, eller utelämna. Med axis equal får vi skalor på axlarna så att en kub ser ut som en kub och inte blir tillplattad. Vidare ger axis tight ett koordinatsystem utan luft runt kuben som vi ritat och axis off gör att axlarna och skalmarkeringar inte syns. Med view(,) ges betraktelsevinklar, se gärna hjälptexterna. Uppgift. Rita en kub och rotera den runt någon axel. Gör en translation av kuben bort från origo. Rotera den åter runt någon axel. Välj ett koordinatsystem så att kuben syns i alla lägen den hamnar i. Uppgift 3. Frivillig! Nu skall vi göra om uppgift, fast som en animation. När ni roterade och translaterade kuben, så behöll ni i figuren resultatet efter varje rotation och translation. På så sätt fick ni en figur med många kuber och det var bra för att förstå vad som hände. Nu vill vi bara se en a kub som roterar, blir translaterad för att sedan rotera igen. Rotationerna skall göras 3
genom att upprepade gånger rotera med en liten vinkel så att vi får en jämn rörelse. För varje liten rotation skall vi sudda figuren (clf) och rita upp kuben i den senaste positionen samt lägga in en kort paus (pause) så att vi hinner se resultatet. På motsvarande sätt med translationen. Som hjälp ger vi följande början till ett script där vi ser på den första rotationen ax=[...]; % Gränser för koordinataxlarna, ax=[xmin xmax ymin ymax zmin zmax]. % Dessa sätts så att hela scenen får plats v=...; % Liten vinkel för upprepad rotation, t.ex. v=pi/8 A=[...]; % Rotationsmatrisen P=H; % H är matrisen med kubens koordinater clf hold on for i=:size(s,) % Rita kuben Si=S(i,:); fill3(p(,si),p(,si),p(3,si), g ) axis equal, axis(ax) % Undvik deformation och använd samma skalor på axlarna box on, grid on % Förstärker tredimensionella känslan något pause() % Paus så vi hinner se kuben innan den roteras kmax=...; % Antal små rotationer, t.ex. kmax=6; (kmax*v=*pi, ett varv) for k=:kmax % Rotera kmax gånger P=A*P; clf hold on for i=:size(s,) % Rita kuben i nya positionen Si=S(i,:); fill3(p(,si),p(,si),p(3,si), g ) axis equal, axis(ax), box on, grid on pause(.) Vi fortsätter med geometriska transformationer och ser på ortogonal (vinkelrät) projektion samt spegling. Men först ser vi kort hur man beräknar skalärprodukt, norm och liknande i Matlab. 4 Skalärprodukt och norm i Matlab Skalärprodukten mellan två vektorer u och v ges av u v = u T v = u v +u v +u 3 v 3 och normen, som motsvarar absolutbelopp, ges av u = u +u +u 3 ( u = u u) Med Matlab beräknar vi skalärprodukt och norm med funktionerna dot och norm enligt >> dot(u,v) >> norm(u) 4
Vinkeln φ mellan två vektorer u och v ges av och beräknas i Matlab med φ = arccos >> phi=acos(dot(u,v)/(norm(u)*norm(v))) u v u v Vipåminnerossomattvektorernauochvärortogonalaellervinkelrätamotvarandraomu v =, vilket ofta betecknas u v. En enhetsvektor är en vektor u med u =. Vill vi bestämma en enhetsvektor u med samma riktning som vektorn v så ges den av u = v och i Matlab skulle vi skriva v >> u=v/norm(v) Avståndet mellan två vektorer u och v ges av u v = (u v ) +(u v ) +(u 3 v 3 ) och beräknas med >> norm(u-v) Dessa beräkningar görs på samma sätt för vektorer i R n, oavsett om n =, 3, eller större. Även om vi inte använder den nu, så nämner vi kryssprodukten i R 3 som ges av u v = (u v 3 u 3 v, u 3 v u v 3, u v u v ) vilket är en vektor i R 3 och beräknas med funktionen cross enligt >> cross(u,v) 5 Ortogonal projektion och spegling Ortogonal eller vinkelrät projektion av en punkt x på linjen ax+by = d ges av x = x+αn, där n = (a,b) är normalen och α = d n x n n Speglingen i linjen ges av x ges av x r = x+αn. Om vi projicerar och speglar vårt område i en rät linje skulle det kunna se ut så här..5.5 5
Vi skall bestämma ortogonala eller vinkelräta projektionen på planet ax+by +cz = d Planet har en normalvektor n = (a,b,c). I bilden har vi ritat en enhetsnormal n och projektionen ˆx längs normalen av en punkt x, dvs. den vinkelräta projektionen på planet. Vi gör ansatsen ˆx = x+αn där α skall bestämmas så att ˆx ligger på planet. Ekvationen för planet kan skrivas n ˆx = d och sätter vi in ansatsen får vi n ˆx = n (x+αn) = n x+αn n = d och därmed α = d n x n n För speglingen av x r av punkten x i planet gäller med samma val av α. x r = x+αn Nu skall vi i Matlab rita planet ax+by +cz = d, för a =,b =,c = 4 och d =. Eftersom c så kan vi lösa ut z, i annat fall får vi modifiera koden xmin=-; xmax=; ymin=-; ymax=; a=; b=-; c=4; d=; X=[xmin xmax xmax xmin]; Y=[ymin ymin ymax ymax]; Z=(d-a*X-b*Y)/c; fill3(x,y,z, g, facealpha,.7) xlabel( x ), ylabel( y ) axis equal, grid on 6
Resultatet blir planet i figuren ovan. Egentligen är det ju bara en bit av planet, nämligen den del som ligger ovanför området x, y. Uppgift 4. Rita planet vi just tittade på. Bestäm en normalvektor och rita ut den med en pil från en punkt på planet. Vi kan rita en pil i rummet med quiver3(x,y,z,a,b,c,s), där x,y,z ger koordinaterna för den punkt som pilen skall ritas från, a,b,c ger pilens utsträckning och s är en skalfaktor (normalt tar vi s = vilket ritar utan skalning, medan t.ex. s = gör pilarna dubbelt så långa). Välj en punkt x, rita ut den, bestäm dess vinkelräta projektion ˆx på planet och rita ut även den. Slutligen rita också ut speglingen x r av x. Markera normalvektorn och de olika punkterna med texter. T.ex. normalvektorn kan markeras med text(u,v,w, n ), där u, v, w är koordinaterna för positionen av vänster sida av texten och n är texten som skall skrivas, dvs. ett n. Uppgift 5. Rita samma plan i en ny bild. I samma bild skall ni rita en kub. Kuben skall vara så placerad att ingen av dess sidor skär planet. Rita därefter projektionen och speglingen av kuben i planet. 7