ZL31ARM: funkcje graficzne 3D

Na początku pliku graphics.c jest zdefiniowana struktura zawierająca współrzędne początku i końca linii w przestrzeni 3D:

Zostanie ona wykorzystana w tablicy typu line3D[] przechowującej krawędzie sześcianu:

gdzie CWH to CUBE_WIDTH_HALF, czyli połowa długości boku, zdefiniowana na początku pliku jako:

Właściwie to są tworzone dwie tablice, z których cube[] zawiera stałe wartości wykorzystywane podczas transformacji, a rotatedCube[] będzie zawierał wynik tychże transformacji, które mogą się zmieniać w czasie działania programu.
Aby teraz narysować bryłę należy wykonać poniższe instrukcje:

Obrót i przesunięcie sześcianu

W celu dokonania obrotu bryły należy obrócić wszystkie linie tworzące krawędzie, które potem zostaną narysowane. Jest to robione za pomocą funkcji rotateLine() w pętli for:

Funkcja ta przyjmuje jako argumenty: strukturę wartości współrzędnych końcowych linii do obrócenia, wskaźnik do struktury w której zostaną zapisane przetransformowane współrzędne, oraz 3 kąty obrotu względem kolejnych osi układu OXYZ. Jej definicja wygląda następująco:

Ostatnia funkcja, która realizuje elementarny obrót punktów, o zadany kąt, wykorzystuje dwie zależności matematyczne:

 

 

i jest zaimplementowana następująco:

Pierwsze dwa argumenty funkcji to wartości aktualne współrzędnych punktu na określonej powierzchni, kolejny parametr to zadany kąt obrotu, a ostatnie dwa to wskaźniki na zmienne typu float do których zostaną zapisane nowe, przetransformowane wartości współrzędnych.
Efekt działania takiego kodu można sprawdzić za pomocą wywołania funkcji drawCube(), której struktura wygląda następująco:

Do pobrania

O autorze