Autor Wątek: Powiększanie i obcinanie grafiki wektorowej.  (Przeczytany 656 razy)

Offline camillos

  • Użytkownik

# Grudzień 14, 2011, 13:43:34
Witam, pisze prosty edytor grafiki wektorowej i nie bardzo wiem jak ugryź powiększanie jej.

Pierwszym moim pomysłem było żeby wszystkie obiekty przemnożyć przez wybraną skale, narysować na powiększonej bitmapie i wyświetlić tylko jej pewien fragment. Ale takie powiększanie niestety będzie zużywało bardzo dużo pamięci, bo muszę taką dużą bitmapę stworzyć, no i rysowanie po niej jest czasochłonne.

Drugim pomysłem jest żeby rysować tylko to co widać po powiększeniu, ale nie wiem jak mam wybrać obiekty które powinienem narysować, tym bardziej że niektóre z nich mogą mieć skomplikowane kształty.
Można by posłużyć się jakimś algorytmem do obcinania odcinków, co powodowało by próbę rysowanie każdego obiektu, a każdą linie (wektor) wchodzący w jego skład musiałbym sprawdzać algorytmem do przycinania, wiec takie coś jest bardzo złożone obliczeniowo.

Dokładnie ten sam problem mam jeśli chodzi o przesuwanie obszaru obcinającego, bo za każdym razem musiałbym od początku to wszystko liczyć i rysować.

Proszę o jakieś porady, bo bardzo mi zależy na skończeniu tego projektu.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Kos

  • Użytkownik
    • kos.gd

# Grudzień 14, 2011, 14:00:18
Jak piszesz edytor grafiki wektorowej, to pierwsze, co potrzebujesz, to rasteryzacja każdego obiektu wektorowego na bitmapę - ona musi być szybka, bo będzie robiona przy każdej modyfikacji (i nie tylko).

Generalnie dla obiektów (np. złożonych z krzywych) rasteryzacja wygląda tak, że wyznaczasz jego np. bbox i dla każdego piksela w bboksie robisz test, czy należy do figury, czy nie - jeśli należy, to zamalowujesz, jeśli nie, to nie. Jeśli obiekt jest częściowo poza ekranem, to po prostu robisz to dla pikseli leżących w przecięciu bboksa z prostokątem widzialnej części płótna.

Nie ma zupełnie znaczenia, czy robisz to na powiększeniu, czy na obrocie, czy cokolwiek- po prostu bierzesz pod uwagę obiekty odpowiednio przetransformowane.

Offline Kos

  • Użytkownik
    • kos.gd

# Grudzień 14, 2011, 14:02:59
Cytuj
Dokładnie ten sam problem mam jeśli chodzi o przesuwanie obszaru obcinającego, bo za każdym razem musiałbym od początku to wszystko liczyć i rysować.

Generalnie da się kombinować z optymalizacjami. Przesuwanie możesz zrobić poprzez odrysowanie nie całego ekranu, tylko części "odsłoniętej", pozostałą część ekranu jedynie blitując z przesunięciem.

Przy obrotach i skalowaniu możesz też kombinować, by ograniczyć obszar do odrysowania, ale tu ciężko byłoby to zrobić bez straty na jakości.