gk 03 obszar id 191747 Nieznany

background image

Grażyna Kamińska, Paweł Fritzkowski

Grafika komputerowa

Klasa WindowRange

Definiowanie układu współrzędnych użytkownika

z wykorzystaniem klasy

WindowRange

W systemie Windows rysowanie w oknach programów odbywa się za pośrednictwem kontekstu urządzenia (ang. device con­

text). Kontekst urządzenia jest strukturą danych zawierającą informacje, które pozwalają systemowi przetłumaczyć żądania programi ­
sty na konkretne operacje na urządzeniu fizycznym. Kontekst ekranowy dotyczący obszaru roboczego okna pełni wiele funkcji, mię­
dzy innymi:

- chroni przed modyfikacją ten obszar ekranu, który mu nie podlega,
- określa dwuwymiarowy układ współrzędnych wraz z jego orientacją,
- określa właściwości rysowania: kolor pióra, kolor pędzla, czcionkę, kolor tła, kolor tekstu, itp.

Układ współrzędnych określony przez kontekst urządzenia pokazano na rys. 1. Początek układu znajduje się w lewym górnym na­
rożniku obszaru roboczego. Oś X skierowana jest w prawo, a oś Y – w dół. Omawiany układ współrzędnych ma ścisły związek z roz­
dzielczością ekranu. W efekcie współrzędne (x, y) punktu wyraża się w pikselach, a zakresy osi X i Y są ograniczone rozmiarem
okna.

Rys. 1. Układ współrzędnych obszaru roboczego okna

Wszystkie standardowe funkcje graficzne wykonują operacje w tak określonym układzie współrzędnych.
Aby umożliwić zdefiniowanie układu współrzędnych użytkownika wzorowanego na układzie współrzędnych rzeczywistych,

stworzono klasę

WindowRange. Obiekt tej klasy przypisany do danego okna pozwala:

ustawić zakres osi prawoskrętnego układu współrzędnych (bez inwersji osi Y),

zapewnia zachowanie jednakowej długości jednostek na obu osiach.

Klasę

WindowRange należy traktować jako pomocniczą – jej obiekt przechowuje informacje o układzie użytkownika i umożli­

wia jego zmianę. Informacje te są następnie wykorzystywane przez obiekt klasy

Graphics2D, pozwalającej wykonywać operacje

graficzne z wykorzystaniem współrzędnych rzeczywistych.

Obiekt zakresu okna

najlepiej utworzyć w momencie, gdy okno jest tworzone (komunikat WM_CREATE). Konstruktor wymaga po­

dania uchwytu okna:

WindowRange wr= WindowRange(hwnd);

Następnie możemy ustawić przedziały zmiennych rzeczywistych x i y, wywołując metodę

SetRange, przy czym zmodyfikuje ona

podane przedziały, by zapewnić zachowanie proporcji elementów obrazu:

wr.SetRange(-50, -100, 200, 100);

W kodzie procedury okna należy również zadbać o aktualizację układu współrzędnych, która staje się konieczna w przypadku zmiany
wymiarów okna (komunikat

WM_SIZE). Uaktualnienie układu użytkownika nastąpi wskutek wywołania metody Update:

wr.Update(hwnd);

Poniżej szczegółowo opisano funkcje składowe klasy

WindowRange.

void SetProportional(bool prop)
prop – parametr określający, czy obraz rysowany jest z zachowaniem proporcji.

Funkcja włącza lub wyłącza tryb zachowania proporcji rysowanych obiektów. Aby zapewnić jednakowe jednostki na obu osiach, pa­
rametr

prop powinien mieć wartość true.

void SetRange(float x1, float y1, float x2, float y2)
x1, y1 – współrzędne lewego dolnego wierzchołka prostokąta ograniczającego.
x2, y2 – współrzędne prawego górnego wierzchołka prostokąta ograniczającego.

1

background image

Grażyna Kamińska, Paweł Fritzkowski

Grafika komputerowa

Klasa WindowRange

Metoda ustawia zakresy osi układu użytkownika w oparciu o prostokątny obszar rysowania zdefiniowany przez współrzędne dwóch
przeciwległych wierzchołków.
Jeżeli włączony jest tryb zachowania proporcji, zapewnienie jednakowych jednostek na obu osiach może wymagać modyfikacji po­
danych wartości. W zależności od proporcji obszaru roboczego okna, zakres jednej z osi może zostać zwiększony przez dodanie od­
powiednich marginesów.

Niech k oznacza stosunek szerokości w do wysokości h obszaru roboczego wyrażonych w pikselach:

k = w

h

.

Z kolei niech

k '

będzie współczynnikiem proporcji obszaru zdefiniowanego w jednostkach użytkownika

k '= w '

h'

,

gdzie

w '= x

2

x

1

oraz

h' = y

2

y

1

.

Możliwe są trzy przypadki:

a)

k >k '

– stosuje się obustronny margines poziomy m

x

(rys. 2a); podany zakres dla osi Y nie ulega zmianie, zatem

x

min

=

x

1

m

x

, x

max

=

x

2

+

m

x

,

y

min

=

y

1

,

y

max

=

y

2

,

b)

k <k '

– stosuje się obustronny margines pionowy m

y

(rys. 2b); podany zakres dla osi X nie ulega zmianie, zatem

x

min

=

x

1

, x

max

=

x

2

,

y

min

=

y

1

m

y

,

y

max

=

y

2

+

m

y

,

c)

k =k '

– podane zakresy dla obu osi nie ulegają zmianie, czyli

x

min

=

x

1

, x

max

=

x

2

,

y

min

=

y

1

,

y

max

=

y

2

.

Jak wynika z powyższych informacji, użytkownik ma pewność, że zdefiniowany przez niego prostokątny obszar rysowania zostanie
odwzorowany w całości na obszar widoku.

Rys. 2a)

Rys. 2b)

Rys. 2. Proporcje obszaru roboczego, a obszar zdefiniowany przez użytkownika

2

background image

Grażyna Kamińska, Paweł Fritzkowski

Grafika komputerowa

Klasa WindowRange

void Update(HWND hwnd)
hwnd – uchwyt okna.
Funkcja aktualizuje zakres współrzędnych użytkownika, korzystając z wymiarów okna, którego uchwyt przekazujemy. Wywołanie
metody jest niezbędne przy zmianie proporcji okna.

bool GetProportional()
Funkcja określa, czy włączony jest tryb zachowania proporcji – zwraca wartość

true, jeśli tryb ten jest włączony.

float GetX1()
float GetY1()
float GetX2()
float GetY2()
Funkcje zwracają ustalone granice obszaru rysowania wyrażone w jednostkach użytkownika – minimalne i maksymalne wartości
współrzędnych w obszarze roboczym.

float GetWidth()
float GetHeight()
Metody zwracają odpowiednio szerokość i wysokość obszaru rysowania w jednostkach użytkownika.

void GetWindowSize(int * w, int * h)
void GetWindowSize(float * w, float * h)
w – wskaźnik do zmiennej przechowującej szerokość okna.
h – wskaźnik do zmiennej przechowującej wysokość okna.

Funkcje pozwalają pobrać wymiary okna skojarzonego z obiektem klasy

WindowRange. Wymiary wyrażone są w pikselach, przy

czym druga z funkcji dokonuje ich konwersji na liczby rzeczywiste typu

float.

float GetAspectRatio()

Metoda oblicza współczynnik proporcji obszaru roboczego – stosunek jego szerokości do wysokości.

void ScaleRange(float s)
s – współczynnik skali.
Metoda dokonuje przeskalowania granic obszaru w jednostkach użytkownika. Gdy s < 1, następuje s-krotne zmniejszenie przedzia­
łów zmiennych x i y, czyli powiększenie elementów rysunku. Natomiast współczynnik s > 1 powoduje s-krotne zwiększenie zakresu
współrzędnych, tzn. pomniejszenie tworzonego obrazu.

3


Wyszukiwarka

Podobne podstrony:
ei 2005 03 s024 id 154147 Nieznany
Notatki 03 PRODUKT id 322319 Nieznany
ei 2005 03 s006 id 154146 Nieznany
cw 03 formularz id 121361 Nieznany
atmwp recenzja re 03 2006 id 71 Nieznany (2)
gk 01 wstep id 191745 Nieznany
monitor 03 2011 id 307221 Nieznany
24 03 2011 id 30495 Nieznany (2)
23 03 2011 id 29948 Nieznany
3 03 2011 2 id 32823 Nieznany (2)
gk 02 graphics2d id 191746 Nieznany
ei 2005 03 s027 id 154148 Nieznany
9 03 2011 id 47909 Nieznany (2)
gk 04 gui id 191748 Nieznany
P 2 03 PL id 343574 Nieznany
MT wyk3 29 03 2011 id 310120 Nieznany
30 03 2011 id 34421 Nieznany (2)
Zestaw 03 InzB id 587905 Nieznany

więcej podobnych podstron