Grafika 3D
 
  Zarejestruj się
::  Newsy  ::  Pliki  ::  Twoje Konto  ::  Forum  ::
Menu
· Strona główna
· Forum
· Linki
· Lista u?ytkowników
· O nas...
· Pliki
· Statystyki
· Twoje Konto
Tutoriale
· API
· Matematyka
· Teoria
· Direct3D
· OpenGL
· Techniki
Kto Jest Online
Aktualnie jest 38 gość(ci) i 0 użytkownik(ów) online.

Jesteś anonimowym użytkownikiem. Możesz się zarejestrować za darmo klikając tutaj
Tutoriale - Matematyka - Macierze

Witam w naszym drugim odcinku małego poradnika matematycznego. Poprzednim razem powiedzieliśmy sobie sporo na temat wektorów i wszelakich operacji, jakie na nich przeprowadzać. No ale jak już od dawna wiemy, samymi wektorami to My wiele nie naszalejemy. Kiedyś nasze statyczne sceny zaczną nam się w końcu nudzić i zapragniemy, żeby coś się na nich ruszało. Będziemy musieli oczywiście przebrnąć przez masę wzorów i układów równań, ale jest coś, co niewątpliwie nam pomoże. Tym czymś są macierze. Żeby jednak nie być gołosłownym i nie zaczynać wszystkiego z powietrza na początek parę słów skąd, jak i po co.
Czym zatem jest macierz. Jeśli patrzylibyśmy w stronę poprzedniego tutorialu to można by powiedzieć, że jest to również tablica. Tylko, że tym razem jest to tablica prostokątna. Co to znaczy. Jest to tablica dwuwymiarowa, czyli posiadająca tak zwane wiersze i kolumny. Wiemy, że wektor ma kolejne składowe, po prostu oznaczone kolejnymi numerami 1, 2, 3, ... itd. W macierzy jest troszkę inaczej. Aby jednak sobie dokładnie to uzmysłowić może pokażmy sobie przykładową macierz.


W macierzy może być dowolna ilość kolumn i wierszy, podobnie jak w wektorze może istnieć dowolna ilość elementów. My oczywiście będziemy się posługiwać macierzami o ściśle określonym rozmiarze. Zanim jednak zaczniemy tworzyć nasze pierwsze macierze najpierw kilka słów. Poszczególne elementy macierzy mogą być liczbami rzeczywistymi. Ktoś może się zastanawiać po co w ogóle są one nam potrzebne. Na pierwszy rzut oka wygląda to jak wymysł chorego matematycznego umysłu i kolejny, zupełnie bezużyteczny bajer. Jednak jak dalej się przekonamy właściwie dzisiaj bez macierzy nie istniałaby współczesna grafika 3D. Macierze są wymarzonym narzędziem do przeprowadzania obliczeń i rozwiązywania równań. Łatwość ich implementacji w komputerowym świecie i zoptymalizowane szybkościowo algorytmy operacji na nich powodują to, że i my nie będziemy się bez nich mogli obejść. No ale przed nami jeszcze daleka droga. Podobnie jak w przypadku wektorów na macierzach będziemy mogli sobie wykonywać pewne operacje. Właściwie trudno zwykłemu śmiertelnikowi wyobrazić sobie co można zrobić z takim tworem, ale paradoksalnie im bardziej skomplikowane coś w matematyce tym więcej z tym można zrobić ;). Cóż my więc możemy ? Ano zacznijmy podobnie jak z wektorami.

  • Dodawanie.
Po pierwsze macierze możemy dodawać. Podobnie jak z wektorami nie będzie to dodawanie zwyczajne. Macierze, aby móc być dodane będą musiały spełniać określone warunki. Aby dodać do siebie dwie macierze muszą one być dokładnie tego samego rozmiaru czyli mieć taką samą liczbę wierszy i kolumn. Nie można dodać macierzy, które różnią się od siebie rozmiarami ( oczywiście taki sam przypadek będzie miał miejsce przy odejmowaniu ). Poniższy przykład pokazuje jak mają się do siebie poszczególne składniki macierzy przed i po dodaniu. Widać tutaj oczywiście coraz większe skomplikowanie działań, ale nie jest to jeszcze nic tragicznego. Myślę, że dodawanie jest w miarę proste, prawda ? Identycznie jak w przypadku wektorów suma ( ewentualnie różnica ) odpowiadających sobie składowych macierzy tworzy odpowiedni element w nowo powstającej macierzy.


  • Mnożenie macierzy przez skalar.
Podobnie jak wektor możemy też macierz pomnożyć lub podzielić przez wartość skalarną. Odbywa się to także niemal identycznie jak w przypadku wektora - po prostu bierzemy każdy element macierzy i mnożymy go przez podaną liczbę. Poniższe równania doskonale ilustrują te działania i myślę, że są one zupełnie dla wszystkich mam nadzieję zrozumiałe.


  • Mnożenie macierzy.
Bardzo ważna i niesamowicie często przez nas wykorzystywana sprawa jest mnożenie macierzy przez siebie. W przeciwieństwie do dodawania, mnożenie ma tę ( nie wiem czy można to tak nazwać ;) zaletę, że macierze nie muszą być dokładnie tego samego rozmiaru ale muszą spełniać pewne inny warunek bez którego ich mnożenie nie byłoby możliwe. Otóż, aby pomnożyć dwie macierze przez siebie to liczba kolumn w pierwszej musi być równa liczbie wierszy w macierzy drugiej. Być może wprowadza to pewne zamieszanie w nasze rozważania, ale bez tej właściwości nie moglibyśmy bez stresowo korzystać z wynalazku macierzy w naszej twórczości. Oczywiście mnożenie jest trochę bardziej skomplikowane niż mnożenie liczb czy nawet wektorów. Jak dokonać więc tego skomplikowanego zadania. Przypatrzmy się najpierw ogólnemu algorytmowi mnożenia na przykładzie dwóch jednakowych ( rozmiarami ) macierzy:


Najpierw bierzemy pierwszą liczbę z pierwszego wiersza macierzy pierwszej i mnożymy ją przez pierwszą liczbę w pierwszej kolumnie macierzy drugiej. Czyli dostaniemy:


Wyniku nie zapisujemy w żadnej nowej macierzy bo to jeszcze nie koniec. Zapisujemy ten wynik sobie gdzieś na boku a my mnożymy dalej. Bierzemy drugą liczbę z pierwszego wiersza pierwszej macierzy i mnożymy przez drugą liczbę z pierwszej kolumny macierzy drugiej. Otrzymany wynik dodajemy do tego, który mamy z poprzedniej operacji mnożenia i znowu zapisujemy na boku:


Ponieważ jednak mamy nadal nie pomnożone czynniki w wierszu macierzy pierwszej i kolumnie macierzy drugiej... mnożymy dalej ! A więc trzeci element wiersza z macierzy pierwszej z trzecim elementem kolumny pierwszej macierzy drugiej ( uważajcie, żeby się nie zgubić ) i oczywiście dodajemy to do naszego tymczasowego wyniku:


Tak postępujemy, aż wymnożymy wszystkie składniki wiersza macierzy pierwszej i kolumny z macierzy drugiej i dodamy do siebie. Powstanie nam w wyniku tego niewątpliwie pewna liczba, którą widzicie poniżej razem z rozpiską całego przeprowadzonego przez nas działania:


Cóż z nią będziemy mogli sobie zrobić ? Otóż jak słusznie się zapewne domyślamy po wymnożeniu macierzy powinniśmy także dostać macierz. Liczba, którą otrzymaliśmy podczas naszego przykładowego mnożenia niewątpliwie weźmie jakiś udział w tej naszej nowej macierzy. A jaki to będzie udział ? Otóż liczba ta będzie składnikiem naszej nowej macierzy. Ktoś oczywiście natychmiast podniesie rękę i zapyta - a w którym miejscu macierzy należy ją umieścić ? Domyśleć jest się chyba bardzo łatwo, prawda ? Popatrzmy sobie na macierz pierwszą i drugą. Z pierwszej wzięliśmy wiersz numer 1 a z drugiej kolumnę nr 1. Czy coś wam już świta ? My szukamy miejsca w macierzy, współrzędnych naszego elementu, na które składają się numer wiersza i numer kolumny gdzie umieszczony zostanie nasz element. Patrząc na nasze macierze i numerki o których pisaliśmy przed momentem widać zapewne od razu. Współrzędne te to nic innego jak numer wiersza i kolumny, z których to składaliśmy nasz mnożony element. W naszym przypadku były to 1 i 1, czyli nasz element będzie położony w nowej macierzy w pierwszym wierszu i pierwszej kolumnie nowej macierzy. Tak samo oczywiście będziemy postępować w przypadku innych wierszy i kolumn. Gdy weźmiemy na przykład wiersz 1 i kolumnę trzecią to element będzie leżał we współrzędnych ( 1, 3 ). I tak możemy się bawić aż wszystkie elementy macierzy będą już na swoich miejscach. Każdy początkujący programista na studiach na pewno nie raz złorzeczył na funkcje do mnożenia macierzy. Ale w grafice jest to jedna z najbardziej podstawowych operacji i na pewno umiejętność mnożenia macierzy przyda nam się bardzo w przyszłości. Tak więc na pewno warto przyswoić sobie tą operację bliżej i zapamiętać ze szczegółami. Ogólny wzór na element w macierzy wygląda następująco, jeśli założyć na przykład, że "m" to liczba kolumn w pierwszej macierzy, odpowiadająca ściśle ilości wierszy w macierzy drugiej:


A pomnożona całkowicie macierz wygląda mniej więcej tak ( podaję za pewnym programem matematycznym:


Skoro jest mnożenie to powstaje pytanie co z dzieleniem. Jeśli przyglądniemy się algorytmowi na mnożenie to widać od razu, że operacji odwrotną nie bardzo da się zrobić. No bo przecież musielibyśmy z jednego elementu wygenerować wiersz w jednej i kolumnę w drugiej macierzy. Dlatego też dzielenia macierzy nie będziemy stosować w naszej grafice.

  • Wyznacznik.
Ciekawa rzeczą dotyczącą macierzy jest tak zwany wyznacznik. Z czym to się je i czy nam się przyda w grafice 3D ? Aby mówić o wyznacznikach powinniśmy poznać jeszcze taki termin jak macierz kwadratowa. Charakteryzuje się ona tym, że posiada taką samą liczbę wierszy i kolumn. Czyli macierzami kwadratowymi będą zarówno macierze posiadające jeden wiersz i jedną kolumnę, jak i takie, dla których liczba ta będzie wynosić 10. Dlaczego piszę o macierzach kwadratowych ? Otóż dlatego, że aby móc policzyć wyznacznik będziemy potrzebować właśnie macierzy kwadratowej. Nie damy rady policzyć wyznacznika dla macierzy posiadającej na przykład jeden wiersz i trzy kolumny ( albo odwrotnie ). Wyznacznik jest liczbą utworzoną z elementów macierzy. Ze względu na jego definicję kłopotliwe jest jego policzenie, szczególnie dla macierzy większych niż 2 x 2. Wyznacznik macierzy n x n jest zdefiniowany w zależności od wyznaczników mniejszych macierzy, które możemy znaleźć w naszej macierzy głównej. Wspomniałem coś o macierzy 2 x 2, dlaczego ? Otóż jeśli nasza macierz będzie zdefiniowana w taki sposób jak poniżej to wyznacznik takiej macierzy możemy policzyć bardzo łatwo, będzie on wynosił:




Ogólnie biorąc, wyznacznik macierzy n x n będzie wynosił:


gdzie A1j, będzie wyznacznikiem macierzy powstałej po usunięciu pierwszego wiersza i i-tej kolumny z macierzy o wymiarach n x n a rozmiar tej nowej macierzy będzie wynosił oczywiście ( n - 1 ) x ( n - 1 ). Obliczenia wyznacznika macierzy o dużych rozmiarach w ten sposób mogą przyprawić o ból głowy, ale od czego mamy komputery i genialne algorytmy ;). Oczywiście na upartego możemy liczyć wyznaczniki sami, ale przecież jest tyle gotowych implementacji, że chyba nie warto zawracać sobie tym głowy. Założę się też, że dużo z was miało takie przejścia na studiach. Ale w ramach wolnego czasu lub dla sportu można spróbować i potem na przykład sprawdzić sobie w Matlabie albo Mathcadzie, ale to już zostawiam wam i waszej silnej woli. Jeśli pragniecie sami spróbować swoich sił w liczeniu wyznaczników to polecam jakąś grubszą książkę do algebry liniowej i zapoznanie się na przykład z rozwinięciami Laplace'a. Zaś przykładowy wyznacznik naszej macierzy wynosi:


  • Transpozycja
Kolejną, unikalną operacją możliwą do przeprowadzenia z udziałem macierzy, wynikającą z jej specyficznej budowy jest tak zwana transpozycja macierzy. Na czym polega ? Otóż jak już wiemy doskonale macierz składa się z wierszy i kolumn. Otóż możemy sobie wziąć jakąkolwiek macierz i zamienić kolumny z wierszami. To znaczy pierwsza kolumna macierzy stanie się pierwszym wierszem przekształconej dzięki transpozycji nowej macierzy. I kolejno, druga kolumna będzie drugim wierszem itd. To samo oczywiście będzie miało miejsce w przypadku wierszy, które staną się kolumnami. Jak można od razu też zauważyć rozmiar macierzy będzie się zmieniał, w zależności od tego ile będzie posiadała kolumn i wierszy. Ilość kolumn zmieni się w ilość wierszy i odwrotnie. Rysunek rozwieje wam na pewno wszelkie wątpliwości mam nadzieję co do samej istoty tej operacji, która nie jest jakaś zbytnio trudna:


  • Macierz jednostkowa
Ciekawym przypadkiem w naszych rozważaniach jest tak zwana macierz jednostkowa. Charakteryzuje się ona tym, że po pierwsze jest macierzą kwadratową, po drugie wszystkie wartości składników macierzy mają wartość zero, prócz tych, które znajdują się na przekątnej. Przekątna macierzy to nic innego, tylko kolejne elementy, które posiadają taki sam numer kolumny i wiersza, w którym się znajdują, czyli kolejno A11, A22, A33 itd... w zależności od rozmiaru macierzy. Dlaczego o niej wspominam ? Ano przyjrzyjmy się za chwilę kolejnej operacji. A macierz jednostkowa wygląda następująco:


  • Odwracanie macierzy
Bardzo ważną, szczególnie dla nas, robiących w grafice operacją na macierzach jest tak zwane odwracanie macierzy. Jest to także chyba jedna z bardziej skomplikowanych operacji na macierzach jakie można wykonać w naszych początkach. Zanim omówimy sobie odwracanie macierzy trzeba wspomnieć oczywiście o ograniczeniach, bo takowe są. Podobnie jak w przypadku liczenia wyznacznika macierz musi być kwadratowa, nie da się odwrócić macierzy o jednym wierszu i trzech kolumnach, albo jakiejś innej kombinacji. Dodatkowym warunkiem jest wyznacznik tej macierzy różny od zera. Jeśli spełniamy wszystkie te warunki to macierz odwrotna będzie zdefiniowana następująco. Jeśli pomnożymy dwie macierze A i B przez siebie i w wyniku tego mnożenia dostaniemy macierz jednostkową to będzie znaczyło tyle, że macierz B jest odwrotna do macierzy A i możemy ją zapisać jako A(-1). Fakt tego, że A*B daje nam macierz jednostkową implikuje to, że operacja B*A da nam też ten sam wynik. Sposobów na obliczanie macierzy odwrotnych jest wiele, najbardziej znanym i przydatnym na nasze potrzeby jest wykorzystujący tak zwaną eliminację Gaussa. I tu znowu odsyłam was do podręczników, jeśli ktoś jest chętny. My w swoich programach będziemy wykorzystywać już sprawdzone i gotowe funkcje, które zrobią wszystko za nas. Jeśli zaś będziecie czuli niedosyt to postaram się to w jakiś sposób wam wynagrodzić. Jeśli naszą macierz przykładową odwrócimy to dostaniemy za programem matematycznym:


  • Na zakończenie
Prawie wszystkie te operacje na macierzach z pewnością nie raz były wałkowane na lekcjach informatyki i były tematem programów zaliczeniowych. My na szczęście nie będziemy musieli znów przechodzić katuszy z tym związanych, choć oczywiście dobrze byłoby znać wszelkie operacje i sposoby ich przeprowadzania, żeby w razie czego można było sobie napisać w krótkim czasie. Ponieważ już znamy najbardziej przydatne z nich, dlatego w następnej kolejności omówimy sobie jak macierze przekładają się na przekształcenia w przestrzeniach 2 i 3D. Na Internecie na pewno można znaleźć wiele gotowych implementacji powyższych operacji, tak że nie będziemy musieli zanadto wysilać naszego umysłu, ale ogólne pojęcie trzeba mieć swoją drogą. Mam nadzieję, że to na razie wystarczy a my przejdziemy dalej w naszych rozważaniach, żeby móc powrócić na drogę prawdziwej grafiki 3D. Do następnego razu więc.

Wersja do druku (pdf)

©Copyright by Robal   



Tutoriale - Matematyka
Nasze newsy s� w RSS: backend.php
PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Tworzenie strony: 0.04 sekund

:: Layout strony został stworzony przez www.nukemods.com w oparciu o styl phpbb2 Helius, którego autorem jest Cyberalien ::