Niedziela 19 Maj 2024r. Godz 00:00:00      
Postów: 251      

Rysowanie okręgu VGA

Koło w grafice komputerowej składa się z punktów. Ale że oko można oszukać to stosuje się mały trik i rysuje się około 100 punktów na obwodzie okręgu. i łączy się je odcinkami. Jeżeli okrąg wychodzi zbyt kanciasty zwiększamy liczbę punktów.

No ale jak wyznaczyć te punkty. Potrzebne nam będą promień oraz punkt środka okręgu. Resztę sobie policzymy.
Poszczególne punkty wyznacza się za pomocą funkcji sinus i cosinus. Caly obrót to 360 stopni. czyli w radianach 2 pi. współżędną po osi x wyznaczamy według funkcji cosinus danego kąta, a y wedłóg sinusa.

Dlaczego z sinusa i cosinusa? Mamy jakąś prostą w układzie współżędnym przechodzącą przez punkt (0,0) i nachylonej pod kątem a. Na niej mamy punkt oddalony od środka układu o długość r. Współżędne danego punktu możemy wyliczyć używając do tego funkcji sinus i cosinus. Nie chce mi się tego tłumaczyć bo to się robi w podstawówce na matematyce. Mniejwięcej pokazuje to rysunek poniżej. Jeżeli teraz będziemy obracać punkt r wokół punktu (0,0) i zaznaczali punkt co kąt da gdzie da dąży do 0 to narysujemy okrąg. Teraz nie pozostaje nam nic jak to wykonać. Możemy wykożystać niedokładność komputera i ludzkiego oka i zwiększamy kąt da a pomiędzy tymi punktami prowadzimy proste. Cały obrót dzielimy sobie na określoną liczbę segmentów, czyli wycinków okręgu o kącie da.

 Czyli do wykonania potrzebujemy następujące zmienne:
 

  • segment - liczba segmentów (ilość punktów pomiędzy kturymi prowadzimy proste)
  • r - promień
  • pi - chyba każdy wie co to za liczba. 3.1415.... Dokładnie wyznaczamy ją z funkcji arcus tangens z 1
  • a - kąt (w radianach) w pod którym aktualnie wyznaczamy punkt. Jego wartością początkową wyznaczamy punkt rozpoczęcia rysowania koła.
  • da - kąt segmentu, czyli kąt pomiędzy dwoma punktami.
  • new_x, new_y - Musimy wyznaczyć i zapamiętać współżędne każdego punktu.
  • old_x, old_y - Musimy jeszcze zapamiętać poprzednie współżędne punktu
  • No i zmienne sterujące pętlami...


No to do dzieła. Będziemy kożystać z funkcji matematycznych więc musimy dołączyć stosowną bibliotekę.

 


#include<math.h>
void okrag(int x, int y, int r, double a=0, int segment=100)
{
        int old_x, old_y, new_x, new_y;
        double da=0;
        double pi=4*atan(1);
        da=2*pi/segment;
        old_x=(int)(r*cos(a)+x);
        old_y=(int)(r*sin(a))+y;
        a+=da;
        for(register int i=0;i<=segment;++i)
        {
                new_x=(int)(r*cos(a)+x);
                new_y=(int)(r*sin(a)+y);
                linia(old_x, old_y, new_x, new_y);
                a+=da;
                old_x=new_x;
                old_y=new_y;
        }

}

Skoro koło rysuje się z odcinków, czyli jest wielokątem. Więc tę samą funkcję możemy zastosować do rysowania wielokątów. Na przykład pięcioboku.. Wyznaczamy sobie środek pięcioboku, promień licząc od środka do wierzchołka no i rysujemy:
okrag(100,200,30,0,5)
Inaczej środek x=100, y=200,
promień = 30,
kąt początkowy alfa = 0,
no i pięciobok

Więc nic prostrzego narysować kwadrat podając połowę przekątnej, trójkąt znając 2/3 wysokości, 7dmio kąt czy 21dno kąt :))

Elipsę rysuje się na algorytmie koła. różni się tym że podaje się inny promień dla osi x i y. Z tego powodu wychodzi na spłaszczenie koła. Funkcja wygląda podobnie:


#include<math.h>
void elipsa(int x, int y, int rx, int ry, double a=0, int segment=100)
{
        int old_x, old_y, new_x, new_y;
        double        da=0;
        double pi=4*atan(1);
        da=2*pi/segment;
        old_x=(int)(rx*cos(a)+x);
        old_y=(int)(ry*sin(a))+y;
        a+=da;
        for(register int i=0;i<=segment;++i)
	{
		new_x=(int)(rx*cos(a)+x);
		new_y=(int)(ry*sin(a)+y);
		linia(old_x, old_y, new_x, new_y);
		a+=da;
		old_x=new_x;
		old_y=new_y;
	}

}