ZL31ARM: implementacja funkcji graficznych 2D

Rysowanie okręgu i koła

Dana operacja wymaga wykorzystania funkcji sinus i cosinus. Można je zrealizować w postaci tablicy wartości dla określonych kątów albo też wykorzystać gotowe sin() i sin(), dostępne w bibliotece z funkcjami matematycznymi math.h., i które przyjmują wartości w radianach.
W danym projekcie zostały wykorzystane gotowe funkcje, jednak jeżeli czas obliczeń jest istotny to można wykorzystać dwie tablice typu float (dostępne w przykładowym rozwiązaniu): sinus[] i cosinus[]. W tym przypadku pomocną okaże się funkcja konwertująca kąt zadawany w stopniach na indeks elementu w tablicy:

Funkcja przyjmuje wartości (również ujemne) kąta w stopniach i w razie potrzeby konwertuje ją do przedziału od 0 do ±359 stopni. Dalej obliczany jest indeks odpowiedniego elementu w tablicy i w zależności od tego czy kąt jest ujemny czy dodatni, indeks jest brany odpowiednio od końca lub od początku tablicy.
Rysowanie okręgu/koła polega na podaniu punktu środkowego oraz promienia. Oprócz tego funkcja przyjmuje 2 dodatkowe parametry, tak jak poprzednio, kolor i styl (w przypadku przekazania 1 jest rysowane koło wypełniane zadanym kolorem). Okrąg jest budowany przez wyznaczanie kolejnych punktów na obwodzie i ich łączeniu. Natomiast rysowanie koła wykonuje się za pomocą funkcji drawLine(), która to rysuje kolejne linie zawarte na płaszczyźnie ograniczonej przez obwód koła i w efekcie otrzymuje się zapełnioną zadanym kolorem figurę. Struktura funkcji drawCircle() jest następująca:

W celu zobrazowania działania funkcji można wykonać następujący przykład:

lub:

Rysowanie elipsy i owalu

Funkcja realizująca daną operację jest bardzo podobna do poprzedniej, jednak w obecnym przypadku zamiast podawania jednego promienia należy podać ich dwa. Pierwszy jest liczony w kierunku osi x (parametr a), a drugi w osi y (parametr b). Mimo takiej samej metody rysowania konturu figury jak w przypadku poprzednim (z wyjątkiem występowania dwóch promieni), sposób rysowania wraz z wypełnianiem jest nieco inne, a mianowicie różnica polega na zastosowaniu innego wzoru w postaci kanonicznej:

 

 

Niżej przedstawiono kod funkcji drawEllipse():

O autorze