Rysowanie punktów na powierzchni graficznej



Podobne dokumenty
Obcinanie grafiki do prostokąta

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

Szybkie tworzenie grafiki w GcIde

Janusz Ganczarski. OpenGL Pierwszy program

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

Wprowadzenie do rysowania w 3D. Praca w środowisku 3D

TWORZENIE OBIEKTÓW GRAFICZNYCH

Praktyka programowania projekt

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM)

WYKŁAD 3 WYPEŁNIANIE OBSZARÓW. Plan wykładu: 1. Wypełnianie wieloboku

4. Rysowanie krzywych

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Programowanie: grafika w SciLab Slajd 1. Programowanie: grafika w SciLab

TWORZENIE SZEŚCIANU. Sześcian to trójwymiarowa bryła, w której każdy z sześciu boków jest kwadratem. Sześcian

KGGiBM GRAFIKA INŻYNIERSKA Rok III, sem. VI, sem IV SN WILiŚ Rok akademicki 2011/2012

1 Wstęp teoretyczny. Temat: Obcinanie odcinków do prostokąta. Grafika komputerowa 2D. Instrukcja laboratoryjna Prostokąt obcinający

Wstęp Pierwsze kroki Pierwszy rysunek Podstawowe obiekty Współrzędne punktów Oglądanie rysunku...

Przeciąganie, rzutowanie, płaszczyzna konstrukcyjna

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Podział programu na moduły

WASM AppInventor Lab 3. Rysowanie i animacja po kanwie PODSTAWY PRACY Z KANWAMI

Maskowanie i selekcja

Podstawy Informatyki Wykład V

Simba 3D LOGO. Cele zajęć: - Poznanie zasad i sposobów tworzenia procedur z parametrami. - Poznanie zasad wywoływania procedur z parametrami.

AUTOCAD teoria i zadania z podstaw rysowania Rysowanie linii, prostej, półprostej, punktu, trasy, polilinii. Zadania geodezyjne.

Wprowadzenie do programowania z wykorzystaniem biblioteki OpenGL. Dorota Smorawa

Skrypt 19. Trygonometria: Opracowanie L3

Grażyna Koba. Grafika komputerowa. materiały dodatkowe do podręcznika. Informatyka dla gimnazjum

Grafika komputerowa Wykład 2 Algorytmy rastrowe

CorelDraw - podstawowe operacje na obiektach graficznych

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Opis implementacji: Poznanie zasad tworzenia programów komputerowych za pomocą instrukcji języka programowania.

CorelDraw - wbudowane obiekty wektorowe - prostokąty Rysowanie prostokątów

TEMAT : KLASY DZIEDZICZENIE

Scenariusz lekcji opartej na programie Program nauczania informatyki w gimnazjum DKW /99

Rysowanie precyzyjne. Polecenie:

Obsługa programu Paint materiały szkoleniowe

Programowanie strukturalne i obiektowe. Funkcje

Część 4 życie programu

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

zajęcia 2 Definiowanie wektorów:

narzędzie Linia. 2. W polu koloru kliknij kolor, którego chcesz użyć. 3. Aby coś narysować, przeciągnij wskaźnikiem w obszarze rysowania.

Rys. 1. Rozpoczynamy rysunek pojedynczej części

Ćwiczenie 2 Warstwy i kształty podstawowe

Programowanie, część III

Laboratorium 5: Tablice. Wyszukiwanie binarne

37. Podstawy techniki bloków

8. Dynamiczne generowanie grafiki, cz. 2

Układ scalony UL 1111

1. Prymitywy graficzne

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD

Zajęcia nr 15 JavaScript wprowadzenie do JavaScript

GRAFIKA. Rodzaje grafiki i odpowiadające im edytory

TWORZENIE SZEŚCIANU. Sześcian to trójwymiarowa bryła, w której każdy z sześciu boków jest kwadratem. Sześcian

POMIARY WIDEO W PROGRAMIE COACH 5

Bitmapy - format i zastosowanie. Podstawowy format plików bitmapowych, dogodność zastosowania bitmap w prostych animacjach 2D.

3.7. Wykresy czyli popatrzmy na statystyki

Wstęp 7 Rozdział 1. OpenOffice.ux.pl Writer środowisko pracy 9

Metodyka wykonania kartogramu z podziałem na klasy wg punktów charakterystycznych wraz z opracowaniem kartogramicznej legendy.

Formaty obrazów rastrowych biblioteki PBM

Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy.

BSP_LCD_Clear(LCD_COLOR_WHITE); BSP_LCD_SetFont(&Font16); BSP_LCD_SetTextColor(LCD_COLOR_BLACK);

Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków do plików, bitmapy pozaekranowe.

I. Spis treści I. Spis treści... 2 II. Kreator szablonów Tworzenie szablonu Menu... 4 a. Opis ikon Dodanie nowego elementu...

GRAFIKA RASTROWA. WYKŁAD 1 Wprowadzenie do grafiki rastrowej. Jacek Wiślicki Katedra Informatyki Stosowanej

WOJEWÓDZKI KONKURS INFORMATYCZNY DLA UCZNIÓW SZKÓŁ PODSTAWOWYCH ETAP SZKOLNY BIAŁYSTOK, 19 LISTOPADA 2018 R.

Przedmiotowy Konkurs Informatyczny LOGIA powołany przez Mazowieckiego Kuratora Oświaty

Rysowanie istniejącego profilu

Programowanie w JAVA Lab. 5 - Wątki. 1. Wykorzystując metodę Monte Carlo narysować wykres funkcji oraz obliczyć całkę: 7 x ) xy, 8,8

Schematy blokowe. Algorytmy Marek Pudełko

Wstęp do Programowania, laboratorium 02

Kod źródłowy programu: program Grafika1; uses crt, graph; (1) var sterownik, tryb:smallint; (2)

KRYPTOGRAFIA I OCHRONA DANYCH PROJEKT

Rozdział 4 KLASY, OBIEKTY, METODY

Przedmiotowy Konkurs Informatyczny LOGIA powołany przez Mazowieckiego Kuratora Oświaty

Część II Wyświetlanie obrazów

PyGame Gra w Ponga. Spis treści

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Kurs Adobe Photoshop Elements 11

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 3 - sem.iii. Dr inż. M. Czyżak

Zadanie Wstaw wykres i dokonaj jego edycji dla poniższych danych. 8a 3,54 8b 5,25 8c 4,21 8d 4,85

Formaty plików graficznych - wprowadzenie

I - Microsoft Visual Studio C++

Zastosowania informatyki w geologii ćwiczenia 1,2 INKSCAPE 1

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Podstawy Processingu. Diana Domańska. Uniwersytet Śląski

Paweł Kaźmierczak. styczeń 2009

RYSUNEK TECHNICZNY I GEOMETRIA WYKREŚLNA INSTRUKCJA DOM Z DRABINĄ I KOMINEM W 2D

3. Instrukcje warunkowe

TEMAT : Przykłady innych funkcji i ich wykresy.

Grafika i komunikacja człowiek komputer Laboratorium. Część 2: Graphics

? 14. Dana jest funkcja. Naszkicuj jej wykres. Dla jakich argumentów funkcja przyjmuje wartości dodatnie? 15. Dana jest funkcja f x 2 a x

b) Dorysuj na warstwie pierwszej (1) ramkę oraz tabelkę (bez wymiarów) na warstwie piątej (5) według podanego poniżej wzoru:

Programowanie II. Lista 3. Modyfikatory dostępu plik TKLientBanku.h

Usługi Informatyczne "SZANSA" - Gabriela Ciszyńska-Matuszek ul. Świerkowa 25, Bielsko-Biała

4. Funkcje. Przykłady

Zadania domowe. Ćwiczenie 2. Rysowanie obiektów 2-D przy pomocy tworów pierwotnych biblioteki graficznej OpenGL

Grafika Komputerowa Materiały Laboratoryjne

Transkrypt:

Rysowanie punktów na powierzchni graficznej Tworzenie biblioteki rozpoczniemy od podstawowej funkcji graficznej gfxplot() - rysowania pojedynczego punktu na zadanych współrzędnych i o zadanym kolorze RGB. Przy projektowaniu założymy, iż powierzchnia graficzna pracuje w trybie pikseli 32 bitowych. Dla innych trybów należałoby utworzyć analogiczne funkcje lub funkcję ogólną - stosowny przykład można znaleźć w dokumentacji SDL. Jednakże ogólność funkcji znacznie ją spowalnia, gdyż każdorazowo musi testować tryb graficzny powierzchni - przy dużej ilości punktów ma to znaczenie. Definicja funkcji jest następująca: UWAGA: Poniższy kod funkcji gfxplot() dopisz do końca pliku SDL_gfx.cpp. // gfxplot() rysuje piksel 32 bitowy // screen - wskaźnik struktury SDL_Surface // x,y - współrzędne piksela // color - 32 bitowy kod koloru piksela //------------------------------------------------- ----------------- void gfxplot(sdl_surface * screen, Sint32 x, Sint32 y, Uint32 color) Uint32 * p = (Uint32 *)screen->pixels + y * screen->w + x; * p = color; Przyjrzyjmy się dokładniej gfxplot(). Lista parametrów obejmuje: screen - wskaźnik do zainicjowanej struktury typu SDL_Surface. Utworzona wcześniej powierzchnia musi zawierać piksele 32 bitowe oraz być zablokowana dla innych wątków. x, y - współrzędne punktu, który ma zostać narysowany na powierzchni wskazywanej przez parametr screen. Współrzędne x,y muszą wskazywać punkt leżący wewnątrz powierzchni. jeśli będzie on na zewnątrz, to powstaną nieprzewidywalne błędy - łącznie z zawieszeniem programu. color - 32 bitowy kolor punktu. Wewnątrz funkcji gfxplot() tworzymy wskaźnik pikseli p. Ponieważ piksel jest daną 32 bitową, wskaźnik p posiada typ Uint32 *. Inicjujemy p adresem piksela. Pod adresem p umieszczamy kod piksela. To wszystko, funkcja jest gotowa do użytku. UWAGA: Na końcu pliku nagłówkowego SDL_gfx.h dopisz: void gfxplot(sdl_surface * screen, Sint32 x, Sint32 y, Uint32 color);

Teraz napiszemy kilka prostych aplikacji wykorzystujących naszą funkcję gfxplot(). Przejdź w edytorze do pliku main.cpp i wpisz poniższy kod: // // P005 - test funkcji gfxplot() //------------------------------ #include <windows.h> #include <SDL/SDL_gfx.h> const int SCRX = 320; // stałe określające szerokość i wysokość const int SCRY = 240; // ekranu w pikselach int main(int argc, char *argv[]) if(sdl_init(sdl_init_video)) MessageBox(0, SDL_GetError(), "Błąd inicjalizacji SDL", MB_OK); atexit(sdl_quit); SDL_Surface * screen; // przechowuje wskaźnik struktury SDL_Surface; // tworzymy bufor obrazowy SCRXX x SCRY pikseli if(!(screen = SDL_SetVideoMode(SCRX, SCRY, 32, SDL_HWSURFACE))) MessageBox(0, SDL_GetError(), "Błąd tworzenia // testujemy nowo utworzoną funkcję Plot32 if(sdl_locksurface(screen) < 0)

MessageBox(0, SDL_GetError(), "Błąd blokady // Na środku ekranu rysujemy w narożach kwadratu cztery punkty - czerwony, // zielony, niebieski i biały int x = screen->w / 2, y = screen->h / 2; // wsp. środka ekranu gfxplot(screen, x - 2, y - 2, 0xff0000); // punkt czerwony gfxplot(screen, x + 2, y - 2, 0x00ff00); // punkt zielony gfxplot(screen, x - 2, y + 2, 0x0000ff); // punkt niebieski gfxplot(screen, x + 2, y + 2, 0xffffff); // punkt biały SDL_UnlockSurface(screen); SDL_UpdateRect(screen, x - 2, y - 2, 5, 5); MessageBox(0, "Kliknij przycisk OK", "Koniec", MB_OK); return 0; Efektem działania tego programu jest okienko graficzne z czterema punktami umieszczonymi w narożnikach małego kwadratu.

Poeksperymentuj z powyższym programem. Zastanów się, co należy w nim zmienić, aby otrzymać poniższe efekty graficzne: Opanowawszy rysowanie pojedynczych punktów zajmiemy się rysowaniem linii. Na początek przypadki proste - rysowanie linii poziomych gfxhline() i pionowych gfxvline(). UWAGA: Poniższy kod funkcji gfxhline() gfxvline dopisz do końca pliku SDL_gfx.cpp. // gfxhline() rysuje linię poziomą // screen - wskaźnik struktury SDL_Surface // x,y - współrzędne lewego początku lini // color - 32 bitowy kod koloru linii // len - długość linii w pikselach //------------------------------------------------- ----------------- void gfxhline(sdl_surface * screen, Sint32 x, Sint32 y, Uint32 color, Uint32 len)

Uint32 * p = (Uint32 *)screen->pixels + y * screen->w + x; for(int i = 0; i < len; i++) * p++ = color; // gfxvline() rysuje linię pionową // screen - wskaźnik struktury SDL_Surface // x,y - współrzędne górnego początku lini // color - 32 bitowy kod koloru linii // len - długość linii w pikselach //------------------------------------------------- ----------------- void gfxvline(sdl_surface * screen, Sint32 x, Sint32 y, Uint32 color, Uint32 len) Uint32 ylen = screen->w; Uint32 * p = (Uint32 *)screen->pixels + y * ylen + x; for(int i = 0; i < len; i++) * p = color; p += ylen; UWAGA: Na końcu pliku nagłówkowego SDL_gfx.h dopisz: void gfxhline(sdl_surface * screen, Sint32 x, Sint32 y, Uint32 color, Uint32 len); void gfxvline(sdl_surface * screen, Sint32 x, Sint32 y, Uint32 color, Uint32 len); Obie funkcje przyjmują następujące parametry: screen - wskaźnik do zainicjowanej struktury typu SDL_Surface. Utworzona wcześniej powierzchnia musi zawierać piksele 32 bitowe oraz być zablokowana dla innych wątków. x, y - współrzędne początku linii - dla gfxhline jest to lewy wierzchołek, a dla gfxvline jest to górny wierzchołek. color - 32 bitowy kolor punktu. len - długość linii w pikselach. gfxhline rysuje linię od punktu x,y w prawo, gfxvline rysuje ją od punktu x,y w dół. Rysowana linia powinna w całości mieścić się na zarezerwowanej powierzchni graficznej, inaczej powstaną nieprzewidywalne efekty. Działanie obu funkcji jest bardzo podobne. Najpierw w zmiennej p obliczamy adres pierwszego punktu linii. Następnie rysujemy len punktów, każdorazowo zwiększając adres dla gfxhline() o szerokość piksela, a dla gfxvline() o

szerokość linii. W efekcie powstaje linia pozioma lub pionowa. Poniższy program rysuje wykresy funkcji sinus i cosinus wykorzystując zaprojektowane funkcje biblioteczne - zwróć uwagę na jego względną prostotę w stosunku do osiąganego wyniku! // // P006 - wykresy funkcji sinus i cosinus //--------------------------------------- #include <windows.h> #include <SDL/SDL_gfx.h> #include <math.h> // dostęp do funkcji trygonometrycznych const int SCRX = 320; // stałe określające szerokość i wysokość const int SCRY = 240; // ekranu w pikselach int main(int argc, char *argv[]) if(sdl_init(sdl_init_video)) MessageBox(0, SDL_GetError(), "Błąd inicjalizacji SDL", MB_OK); atexit(sdl_quit); SDL_Surface * screen; if(!(screen = SDL_SetVideoMode(SCRX, SCRY, 32, SDL_HWSURFACE))) MessageBox(0, SDL_GetError(), "Błąd tworzenia if(sdl_locksurface(screen) < 0) MessageBox(0, SDL_GetError(), "Błąd blokady

int x = screen->w / 2, y = screen->h / 2; // współrzędne środka ekranu double a = y * 0.9; // współczynnik skalowania wykresu gfxhline(screen, 0, y, 0xffffff, screen->w); // oś x gfxvline(screen, x, 0, 0xffffff, screen->h); // oś y for(x = 0; x < screen->w; x++) // wykres sinus i cosinus gfxplot(screen, x, y - a * sin(6.28 * x / screen->w), 0xff00ff); gfxplot(screen, x, y - a * cos(6.28 * x / screen->w), 0x00ffff); SDL_UnlockSurface(screen); SDL_UpdateRect(screen, 0, 0, 0, 0); MessageBox(0, "Kliknij przycisk OK", "Koniec", MB_OK); return 0;

Wykorzystaj program do narysowania innych wykresów funkcji. Zastanów się jak wyskalować wykres, aby nie wychodził poza obszar okna - możesz również sprawdzać, czy współrzędna y punktu mieści się w zakresie od 0 do screen->h - 1. Jeśli tak, punkt rysujesz, jeśli nie, nie rysujesz punktu. Proste? Kolejna funkcja biblioteczna gfxrectangle() będzie rysowała prostokątne ramki. Funkcja wykorzystuje zdefiniowane wcześniej funkcje gfxhline() i gfxvline() do rysowania boków poziomych i pionowych. UWAGA: Poniższy kod funkcji gfxrectangle dopisz do końca pliku SDL_gfx.cpp. // gfxrectangle() rysuje ramkę na obrysie prostokąta // screen - wskaźnik struktury SDL_Surface // r - definiuje prostokąt ramki // color - 32 bitowy kod koloru ramki //------------------------------------------------- ----------------- void gfxrectangle(sdl_surface * screen, SDL_Rect * r, Uint32 color) if(r) gfxhline(screen, r->x, r->y, color, r->w); gfxhline(screen, r->x, r->y + r->h - 1, color, r->w); gfxvline(screen, r->x, r->y, color, r->h); gfxvline(screen, r->x + r->w - 1, r->y, color, r->h); else gfxhline(screen, 0, 0, color, screen->w); gfxhline(screen, 0, screen->h - 1, color, screen->w); gfxvline(screen, 0, 0, color, screen->h); gfxvline(screen, screen->w - 1, 0, color, screen->h); Jeśli dokładnie przeanalizujesz kod funkcji gfxrectangle(), to zauważysz, iż boki pionowe są rysowane pomiędzy punktami narożnymi prostokąta, w

których postawiliśmy już piksele przy okazji rysowania boków poziomych. Może wpadniesz na pomysł zmodyfikowania współrzędnych i długości odcinków pionowych - nie rób tego. Czas tracony przez komputer na wyliczenia współrzędnych i długości może być większy od czasu postawienia tych czterech pikseli (a może nie będzie - sprawdź oba warianty, jeśli potrafisz). Funkcja gfxrectangle() posiada następujące parametry: screen - wskaźnik do zainicjowanej struktury typu SDL_Surface. Utworzona wcześniej powierzchnia musi zawierać piksele 32 bitowe oraz być zablokowana dla innych wątków. r - wskaźnik struktury typu SDL_Rect, która definiuje prostokąt. Jeśli r zawiera NULL, prostokąt jest rysowany na całej powierzchni graficznej. color - 32 bitowy kolor punktu. UWAGA: Na końcu pliku nagłówkowego SDL_gfx.h dopisz: void gfxrectangle(sdl_surface * screen, SDL_Rect * r, Uint32 color); Poniższy program testuje funkcję gfxrectangle() rysując na środku powierzchni graficznej coraz mniejsze ramki o malejącej jasności. Osiągamy dosyć ciekawy efekt graficzny. Zwróć uwagę jak modyfikowany jest kolor kolejnej ramki - zmniejszeniu ulegają wszystkie składowe R, G i B. // // P007 - test ramek //------------------ #include <windows.h> #include <SDL/SDL_gfx.h> const int SCRX = 320; // stałe określające szerokość i wysokość const int SCRY = 240; // ekranu w pikselach int main(int argc, char *argv[]) if(sdl_init(sdl_init_video)) MessageBox(0, SDL_GetError(), "Błąd inicjalizacji SDL", MB_OK); atexit(sdl_quit);

SDL_Surface * screen; if(!(screen = SDL_SetVideoMode(SCRX, SCRY, 32, SDL_HWSURFACE))) MessageBox(0, SDL_GetError(), "Błąd tworzenia if(sdl_locksurface(screen) < 0) MessageBox(0, SDL_GetError(), "Błąd blokady Uint32 color = 0xffffff; SDL_Rect * r = new SDL_Rect; prostokąta // wskaźnik for(int i = 0; i < 120; i++) r->x = r->y = i; definicję prostokąta ramki r->w = screen->w - 2 * i; r->h = screen->h - 2 * i; // tworzymy gfxrectangle(screen, r, color); // rysujemy ramkę color -= 0x020202; kod koloru dla kolejnej ramki // obliczamy SDL_UnlockSurface(screen); SDL_UpdateRect(screen, 0, 0, 0, 0); MessageBox(0, "Kliknij przycisk OK", "Koniec", MB_OK); return 0;

screen r color Do wypełniania prostokątnych obszarów na powierzchni graficznej w bibliotece SDL istnieje funkcja SDL_FillRect() o następującej definicji: int SDL_FillRect(SDL_Surface * screen, SDL_Rect * r, Uint32 color); - wskazuje strukturę SDL_Surface z powierzchnią graficzną, po której chcemy rysować. Jeśli na powierzchni jest zdefiniowany prostokąt obcinania, to prostokąt wypełniający pojawi się tylko wewnątrz prostokąta obcinania, w obszarze wspólnym. Powierzchnia graficzna może być dowolnego typu, niekoniecznie 32- bitowa. - wskazuje strukturę SDL_Rect definiującą prostokątny obszar. Jeśli wskaźnik ma wartość NULL, to wypełniona zostanie cała powierzchnia graficzna (patrz wyżej - prostokąt obcinania). - 32 bitowy kolor punktu. Kod piksela musi być kompatybilny z formatem graficznym powierzchni. Dla dowolnej powierzchni można go uzyskać przy pomocy wywołania funkcji biblioteki SDL: Uint32 SDL_MapRGB(SDL_PixelFormat *fmt, Uint8 r, Uint8 g, Uint8 b); - wskazuje strukturę SDL_PixelFormat definiującą format pikseli. Można tutaj podać zawartość pola fmt format struktury SDL_Surface, po której chcemy rysować. r,g,b - składowe kolorów bazowych: r - czerwony, g - zielony i b - niebieski Wykorzystaj tę funkcję wraz z gfxrectangle() do utworzenia poniższych rysunków (zastanów się nad efektywnym wykorzystaniem struktur SDL_Rect):