Dirty Rectangles - GUI

0

Otoz mam maly a wlasciwie duzy :( problem ;/...
....otoz pisze sobie GUI i powstal problem odswiezania tego co mam na pulpicie. Znam 3 metody na odswiezanie:
a) odrysuj wszytsko w buforze i wywal calosc na ekran - baaardzo wolne i nieefektywne na starszych i wolniejszych kompach, choc bardzo proste
b) odrysuj cale okno, a pozniej w przypadku gdy inne okna je czesciowo zaslaniają, odrysuj ich fragmenty i wywal bufor na ekran - dobre w przypadku gdy wieksza czesc lub calosc okna jest widoczna, im bardziej zasloniente i okno wieksze tym bardziej nieefektywne i wolne
c) dirty rectangles - odswiez tylko to co sie zmienilo i tylko ten fragment okna ktory widzisz - bardzo efektywne, szeroko stosowane, szybkie, ale trudne w realizacji

Tak wiec chcialbym wykorzystac metode dirty rectangles, poniewaz bardzo zalezy mi na predkosci. Metoda ta dziala mniej wiecej tak:

Mam jedno okno ktore wysyla komunikat do silnika GUI aby zostalo odswiezone, w przypadku gdy okno jest w calosci widoczne wystarczy wywalic na ekran cale okno (lub fragment bufora ekranu). Jednak problem robi sie gdy częsc okna jest zalonienta przez inne.
Dirty rectangles dziala w ten sposob, ze mamy liste prostokątnych fragmentow ekranu ktore mają byc odswiezone. Tak wiec gdy okno jest czesciowo zasloniente musimy podzielic widoczny obszar na prostokaty ktore nastepnie zostana odswiezone.
I tu jest moje dokladne pytanie:
Jak podzielic obszar o nieregularnych ksztaltach czyli konkretnie ta czesc okna ktora jest widoczna pod innymi oknami, na prostokaty. Interesuje mnie sam algorytm, poniewaz cala reszta jest juz zrobiona, chcialbym aby to bylo cos w stylu procki do ktorej podajemy wymiary i pozycje okna, i ew. innych okien na wyzszych planach ktore mogą zaslaniac nasze okienko, i zeby ta procka zrobila liste prostokatow (czyli wymiary x,y,width,height), ktore pozniej beda odswiezone.

Bardzo prosze Was o pomoc gdyz naprawde nie jestem sobie w stanie z tym poradzic :/

0

Jeżeli masz wielokąt (tzn. współrzędne wierzchołków, które możesz bez problemu otrzymać) to najlepiej chyba dokonać triangulacji i potem ew. pozbierać po dwa trójkąty w prostokąt.

0

Hehe Dryo moglbys deczko jasniej ;]

0

Hehe Dryo moglbys deczko jasniej ;]

Po prostu musisz podzielić wielokąt na trójkąty i rysować poszczególne trójkąty (lub pary trójkątów prostokątnych, które będą się składać na jeden trójkąt prostokątny). Jest kilka algorytmów triangulacji, ale musisz je już sam znaleźć, bo ja do takowych linków nie posiadam.

0

Ok już sobie z tym poradzilem :D

0

To mógłbyś to opisać :P Np. jakiś art byłby miłym prezentem :)

0

Pomysl na rozwiazanie mi podsunal bies z forum na warsztat.pac.pl za co mu wielkie THX. Dziala to tak:

Wyobrazcie sobie sytuacje gdy jeden prostokat jest czesciowo zaslonienty przez inne. Nastepnie poprowadzcie linie poziome i ponowe od kazdego wierzcholka (jezeli wierzcholek ten jest na obszarze zaslonientego okienka) prostokata ktory zaslania nasz prostakat. Utworzy to na np: rysunku uklad poprzecinanych lini ktore beda tworzyly bardzo wiele prostakatow roznch rozmiarow. I to jest klucz do dirty rectangles.

Algorytm dziala tak:

  1. ustaw wymiar okna ktore jest zasloniente
  2. wyselekcjonuj z mozliwych prostakatow ktore zaslaniaja, te ktore przynajmniej czesciowo zaslanija nasz prostokat (okienko), jezeli dany prostokat zaslaniajacy nie lezy calkowicie na naszym zaslanianym to uwzglednij tylko ten frgament ktory zaslania - ma to na celu wyeliminowanie wierzcholkow ktore sa poza obszarem zaslanianego prostakata
  3. <ort>stwurz </ort>liste z pozycjami x,y wierzcholkow ktore sa w <ort>obrzerzach </ort><ort>zaslonientego </ort>prostakata - kazdy z wymiarow x i y bedzie linia dzielenia prostakaty na mniejsze
  4. sortuj i jednoczesnie uwzgledniaj tylko raz powtarzajace sie wymiary - dzieki temu uzyskamy uporzadkowana liste x i liste y z ktorej już bardzo latwo zrobimy wymiary posczzegolnych petli
  5. rob petle w ktorej bedzie sie odbywalo ustalanie wymiarow <ort>poszczegulnych </ort>prostakatow i dodawanie tych wymiarow to listy prostakatow:
    x1 = x[n];
    x2 = x[n + 1];
    y1 = y[n];
    y2 = y[n + 1];
  6. sortuj i jednoczesnie uzun powtarzajace sie wymiary
  7. usun z listy prostakatow te ktore sa czescia tych prostakatow ktore zaslaniaja nasz prostakat

i to wlasciwie wszytsko, w wyniku uzyskujemy liste zawierajaca wymiary x1,y1,x2,y2. Te wymiary to protstakaty ktore razem tworza wielokat powstaly z wymiarow zaslonientego prostakata po odjeciu zaslonientcyh powierzchni.

Glowne zastosowanie dirty rectangles to biblioteki GUI, oraz gry w ktorych zalezy nam na szybkim <ort>odswierzaniu </ort>tych obszarow ktore sie zmienily :)

Artykulik moze sie tysh kiedys napisze:

1 użytkowników online, w tym zalogowanych: 0, gości: 1