• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Plan na niewielki projekt w SFML ( mój pomysł na pewien algorytm )

VPS Starter Arubacloud
+2 głosów
341 wizyt
pytanie zadane 9 stycznia 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)
zamknięte 14 stycznia 2019 przez Jakub 0

Witam, chcę napisać prostego Paint'a z użyciem SFML. Wolę wszystko wcześniej obmyślić...

Przez jakiś czas zastanawiałem się nas tym jaki algorytm użyć do zapełniania danego obszaru kolorem, wiem że mogłem na ten temat poczytać w internecie ale celowo chcę myśleć samemu. W końcu wpadłem na bardzo prosty rekurencyjny sposób:

Mamy obszar który chcemy wypełnić na pomarańczowo, zapisujemy do zmiennej początkowy kolor pierwszego "klikniętego" piksela ( biały ). Następnie zmieniamy jego kolor na pomarańczowy oraz wywołujemy rekurencyjnie funkcje dla ośmiu sąsiednich pikseli. Dla nich robimy to samo, tyle że jeśli pobrany kolor piksela będzie różny od tego zapisanego w zmiennej ( w tym przypadku białego ) to nic już nie robimy ( powrót ). Co sądzicie o tej metodzie?

Drugie pytanie dotyczy tego co lepiej zastosować jako "płótno". Mamy w SFML do dyspozycji sf::Texture oraz sf::Image, co lepiej wykorzystać? Wydaje mi się że chyba niżej poziomowe jest sf::Texture ( więc szybsze ). Ale nie jestem pewny. Co prawda możliwość zapisu obrazka do pliku daje tylko sf::Image, ale sf::Texture może być na ten typ skonwertowany...

Z góry dziękuje za rady :)

komentarz zamknięcia: temat wyczerpany
komentarz 9 stycznia 2019 przez sebeks Mądrala (5,300 p.)
Planujesz mieć funkcję zapisu do pliku png?
komentarz 9 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)
Tak,  sfml takie metody zawiera.
2
komentarz 9 stycznia 2019 przez monika90 Pasjonat (22,940 p.)
sf::Texture nie ma chyba funkcji za pomocą której mógłbyś sprawdzić kolor piksela. A funkcja za pomocą której mógłbyś go zmienić (czyli update) na pewno jest wolniejsza niż sf::Image::setPixel.
komentarz 10 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)
Dzięki, faktycznie. Przeglądałem prototypy metod z klasy sf::Texture ale nie czytałem co robią i odniosłem mylne wrażenie :)

2 odpowiedzi

+1 głos
odpowiedź 10 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
wybrane 14 stycznia 2019 przez Jakub 0
 
Najlepsza
Nie chcesz czytać? Ok. No to tylko podpowiem...

Tworzysz kolejkę i po zmianie koloru punktu na docelowy, odkładasz jego współrzędne do kolejki. W pętli rozkolekowujesz kolejkę i badasz 4 lub 8 jej sąsiadów także dodając ich do kolejki.

Nie będę opisywał tego dokładnie bo napisałeś że chcesz sam to obmyślić. Ważne że taki algorytm nie będzie rekurencyjny.

PS. Można to także wykonać ze stałą zajętością pamięci ale to już jest nieco bardziej skomplikowane.
komentarz 10 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)
Chyba rozumiem o co chodzi. Ogólnie działanie dosyć podobne do tego mojego rekurencyjnego algorytmu tyle że kolejka zamiast wywołań "pod-funkcji". Dziękuje bardzo za odp :)
+1 głos
odpowiedź 10 stycznia 2019 przez obl Maniak (51,280 p.)
Rekurencyjnie powiadasz? To ja ci zrobię psikusa i otworzę bitmapę 1000x1000 zamalowaną na biało i sobie kliknę. Rekurencyjnie będzie to trwało bardzo długo a po drugie możesz się nie doczekać w zależności od implementacji może ci zbraknąć pamięci. Pamiętaj, kopiowanie pamięci kosztuje dużo czasu i pamięci ram.

Ja bym to raczej próbował rozwiązywać w sposób iteracyjny jeżeli chcesz zrobić algorytm, który jest w pewnym stopniu wydajny. Np. klikasz w pewnym punkcie bitmapy. Zapamiętujesz kolor tego puntu. Zamalowujesz punkt kolorem docelowym oraz na masce bitowej zapisujesz informację, że ten punkt już został przeszukany. Przeszukujesz sąsiedztwo punktu pod względem zgodności koloru z uwzględnieniem np. procentowego odchylenia od koloru początkowego oraz sprawdzasz, czy punt nie był już zaznaczony jako przeszukany. Zapamiętujesz te punkty w tablicy dynamicznej i w następnym kroku zdejmujesz jeden element z tej tablicy i znów robisz mniej więcej to samo co wcześniej.

Nie szedł bym w SFML są biblioteki i metody operowania bezpośrednio na bitmapie.
komentarz 10 stycznia 2019 przez Jakub 0 Pasjonat (23,120 p.)

Dziękuje za odp.

Przeszukujesz sąsiedztwo punktu

To jest właśnie zasadnicza i najtrudniejsza rola algorytmu  ;) Dla rekurencji jest to proste bo po prostu wywołuje funkcje z innymi argumentami. Jak to zrobić iteracyjnie to trochę myślałem...

Ale wpadłem na pewien pomysł, rozwiązanie było by podobne jak w grze saper kiedy zwiększamy numer ( etykietę pól ) w pobliżu miny. Mam współrzędne punktu (x;y). Dla każdego punktu robię przeszukanie w tym stylu:

x = (...)
y = (...)

for( i=-1; i<=x+1; ++i)
       for( j=-1; j<=y+1; ++j)
                punkt(x+i , y+j ); 

 Oczywiście to co napisałem to bardziej ogólny pseudokod ;) Ale myślę o czymś takim.

Nie szedł bym w SFML są biblioteki i metody operowania bezpośrednio na bitmapie.

Właśnie zależało mi żeby wykorzystać SFML bo nic innego nie znam. No ale z drugiej stronie w SFML można by było napisać tylko samo GUI aplikacji  ( choć pewnie lepsze do tego jest Qt ).

Co do innych bibliotek to znalazłem takie coś: https://github.com/skeeto/bmp

Tylko nwm. bo ona daje nam możliwość edytowania pliku BMP, ale pasuje tworzony obrazek też na bieżąco pokazywać w chwili rysowania. Nie mam pojęcia jak to zrobić bez przykładowo SFML...

* w okienku aplikacji SFML, piksele mogą być na bieżąco zmieniane razem z mapą obrazu. Ale nie wiem czy to jest wydajne.

1
komentarz 14 stycznia 2019 przez obl Maniak (51,280 p.)
Nie kombinuj, użyj maski do zapamiętywania który punkt został przeznaczony do zamalowania. A tablicy dynamicznej do zapamiętywania kolejnych punktów do przeszukania, Co do bibliotek to nie doradzę ci, bo pewnie i tak byś nie skorzystał. W Qt jest klasa QImage, ona tam gdzieś ma metodę, która udostępnia ci dostęp do bitów bitmapy i możesz sobie na nich operować jak chcesz. To całkiem niezłe ćwiczonko z praktycznego zastosowania wskaźników będzie :) Kiedyś bawiłem się sporo bitmapami oj bitmapę 3000px na 12000 px na wskaźnikach algorytm przerabiał w locie. Oczywiście to były proste operacje jak rozjaśnienie czy desaturacja. Nie zmienia to faktu, że wskaźniki w takich przypadkach pokazują jak bardzo są one szybkie.
komentarz 14 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)

Nie zmienia to faktu, że wskaźniki w takich przypadkach pokazują jak bardzo są one szybkie

IMHO... Na piechotę wskaźnikami, edukacyjnie czemu nie. Ale jak już są takie operacje "na poważnie", lepiej użyć jawnie lub niejawnie SIMD. Czyli albo intrisics albo np.. std::valarray. O tym ostatnim kontenerze wielu zapomina.

Nie.. wskaźniki nie są "najszybsze na świecie". To mit i typowy częsty błąd wyręczania kompilatora. Raczej generują wiele problemów utrzymaniowych. Stąd powinny być bardzo usprawiedliwione (np. embedded i surowe rejestry).

Podobne pytania

0 głosów
1 odpowiedź 172 wizyt
+1 głos
1 odpowiedź 424 wizyt
pytanie zadane 27 maja 2020 w Nasze projekty przez nanautzin Obywatel (1,510 p.)
0 głosów
0 odpowiedzi 323 wizyt
pytanie zadane 14 maja 2018 w SPOJ przez coderCpp93 Gaduła (4,200 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...