Wykrywanie obiektu na PaintBox

0

Hej!
Mam pewien problem. Rysuje na PaintBox obraz pobrany do aplikacji w ten sposob:

obraz:=TPortableNetworkGraphic.Create;
obraz.LoadFromFile('img/obrazek.png');

Chcialbym teraz wykryc na PaintBox kiedy kursor myszy wskaze na ten obraz. Problem jest stosunkowo latwy do rozwiazania kiedy obraz jest np kwadratem, jak to zrobic jednak kiedy ksztalt na obrazie jest nieregularny?
Trzymac w tablicy jakies wspolrzedne czy jednak jest mozliwosc rysowania obiektow i potem ich 'wykrywania'?

Prosze o podpowiedz :)

2

Pobaw się regionami https://msdn.microsoft.com/en-us/library/windows/desktop/dd162915(v=vs.85).aspx
później łatwo wykryjesz gdzie masz kursor używając funkcji PtInRegion

1

Innym sposobem wykrywania kursora nad nieregularnym kształtem jest korzystanie z obrazu maski, o takich samych wymiarach jak właściwa grafika. Maska może być bitmapą monochromatyczną lub dowolną inną. Potrzebne są dwa kolory - jeden dla tła i jeden dla obiektu. Aby móc oznajmić, że kursor znajduje się nad obiektem, musi się znajdować w prostokątnym obszarze grafiki, a po drugie, musi się znajdować nad pikselem, którego kolor w masce odpowiada kolorowi obiektu.

Przykład - poniżej właściwa grafika z jakimś obiektem:

mantis.png

I jej obraz maski:

mask.png

Ładujemy oba obrazy do pamięci, rysujemy ten właściwy. Podczas przesuwania kursorem sprawdzamy, czy ten znajduje się nad prostokątnym obszarem grafiki. Jeśli znajduje się to obliczamy relatywne współrzędne kursora (względem lewego górnego rogu grafiki) i sprawdzamy, czy pod tymi koordynatami w grafice maski znajduje się (w tym przypadku) czarny kolor. Jeśli tak - kursor znajduje się nad obiektem i np. zmieniamy kursor na łapkę. Samo sprawdzenie czy kursor znajduje się nad obiektem to właściwie jeden warunek.

Maską nie musi być obraz - równie dobrze może nią być dwuwymiarowa macierz wartości logicznych, generowana w locie. Dzięki temu można zaoszczędzić sporo pamięci, a umiejętne posługiwanie się operacjami boolowskimi i przesunięciami bitowymi pozwoli na jeszcze większą kompresję takiej maski (jeden bit maski - jeden piksel grafiki).


Taki sposób ma wiele zalet:

  • możliwa obsługa dowolnych obiektów (kształtów, map itd., przede wszystkim mocno nieregularnych, np. poszarpanych jak powyższa),
  • łatwość wykonania - maskę można szybko przygotować w dowolnym lepszym programie graficznym lub wygenerować w locie,
  • łatwość przygotowania kodu do wykrywania momentu najechania kursorem na właściwy obiekt,
  • wielowarstowość - maska może zawierać wiele informacji, nie tylko dwie (tło/obiekt),
  • duży uniwersalizm.

Niestety ma też wady:

  • większe zużycie pamięci,
  • generowanie maski w locie:
    • oznacza większą złożoność czasową,
    • może nie być najprostsze w implementacji,
  • nie nadaje się do dużych grafik, ew. konieczne wysokie optymalizacje.

Ale coś za coś.

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