Implementacja zaznaczania dynamicznie dodawanych obiektów
Stronę tą wyświetlono już: 2175 razy
Wstęp
Pierwsze co należy zrobić zanim przystąpi się do obsługi zadania związanego z zaznaczaniem naszych obiektów w programie Rysowanie, konieczne jest zastanowienie się, jak powinno wyglądać takie zaznaczanie obiektów? Oto kilka zasad, jakie ja postawiłem sobie aby mój program spełniał:
- wyróżnienie obiektu, nad którym znajduje się kursor myszki;
- zaznaczenie obiektu klikniętego lewym przyciskiem myszki, który znajduje się pod kursorem myszki;
- jeżeli pod kursorem myszki nie ma żadnego obiektu w chwili kliknięcia lewym przyciskiem myszy to odznacz wszystkie obiekty i umożliw zaznaczanie obiektów po upuszczeniu lewego przycisku myszy, które znajdą się w prostokącie wyznaczonym przez punkt kliknięcia oraz punkt zwolnienia lewego klawisza myszki;
- jeżeli wciśnięty został klawisz shift to umożliw dodawanie do zaznaczenia pojedynczych obiektów.
Do realizacji tego zadania zostanie utworzona specjalna klasa o nazwie select_obj, która będzie odpowiedzialna za realizację zadań związanych z zaznaczaniem i edycją obiektów. Poniżej zamieszczam mały diagram UML zależności klas w programie.
Klasa select_obj jest powiązana z klasą i_dr_obj za pośrednictwem pola tSelObj oraz konstruktora i metod związanych z obsługą zaznaczania obiektów.
Mechanizm wyrywania obiektu pod kursorem myszki
Podstawowe pytanie, jakie należy sobie zadać, to: jak wykrywać obiekt znajdujący się pod kursorem myszki? Odpowiedź na to pytanie nie jest prosta, ponieważ ten mechanizm jest zależy od rodzaju obiektu. Dla linii trzeba wykryć, czy obiekt znajduje się nad tą linią z pewną dopuszczalną tolerancją błędu, dla prostokąta czy punkt kursora znajduje się w jego wnętrzu, podobnie rzecz się ma z okręgiem, ale oba te obiekty muszą realizować swoje zadania w nieco inny sposób.
Wykrywanie kursora nad linią
Dobra - ktoś powie, o co tutaj chodzi? Czyżby twierdzenie Pitagorasa uległo zmianie od czasów, gdy ukończyłem podstawówkę? Co to w ogóle za wzór jest?! Spokojnie to jest twierdzenie Pitagorasa zapisane w nieco innej bo wektorowej postaci. Trzeba mieć świadomość, że iloczyn skalarny dwóch wektorów jest równy sumie iloczynu poszczególnych składowych. A więc powyższy wzór można rozpisać do bardziej normalnej postaci:
Skoro obsłużony został ten paskudny wyjątek, teraz można zakasać rękawy i obliczyć prostopadły punktu kursora myszki mousepos na linię. Do tego celu należy wykorzystać wzory z strony Programowanie → Algorytmy obliczeniowe → Rzutowanie punktu na prostą. Wzorów tych nie będę tutaj przytaczał napiszę tylko, że po rzutowaniu należy obliczyć odległość tegoż punktu od kursora myszy i jeżeli jest on mniejszy od pewnej zadanej wartości to należy jeszcze sprawdzić czy punkt zrzutowany znajduje się pomiędzy końcami linii.
Poniżej zamieszczam fragment kodu klasy line, który dotyczy wykrywania obiektu tego typu znajdującego się pod kursorem myszy:
Wykrywanie kursora nad kołem
W przypadku koła, czyli klasy circle znów trzeba się posilić twierdzeniem Pitagorasa, jednakże do tego celu będzie potrzebny punkt centralny, od którego kwadrat odległości dzielącej go od punktu kursora myszki go dzieli. Kod realizujący tę część zadania będzie wyglądał następująco:
Wykrywanie kursora nad prostokątem
W przypadku prostokąta sprawa jest jeszcze prostsza, ponieważ istnieje pewna funkcja PtInRect, która sama odwali za nas brudną robotę. Kod realizujący to zadanie będzie miał następującą postać:
Zmiany w kodzie programu
Zmiany w kodzie klasy i_dr_obj oraz klas dziedziczących po niej
Oto zmieniony nieco kod klasy i_dr_obj oraz klas po niej dziedziczących:
Dodanie nowego kodu klasy select_obj
Do projektu dodać należy plik nagłówkowy o nazwie select.h a w nim znajdzie się kod klasy obsługującej zaznaczanie obiektów:
Plik select.h należy załączyć do pliku winmain.cpp.
Zmiany w funkcji procedury okna rysowania
Oto kod procedury okna rysowania, który również musiał ulegnąć zmianie:
Wygląd programu
Oto wygląd naszego programu, w którym można już zaznaczać poszczególne obiekty.
Tytuł:
C++ Zbiór zadań z rozwiązaniami
Autor:
Tomasz Jaśniewski
Tytuł:
Mikrokontrolery dla hobbystów. Projekty DIY w języku C i C++
Autor:
Miguel Angel Garcia-Ruiz, Pedro Cesar Santana Mancilla
Tytuł:
Architektura oprogramowania bez tajemnic. Wykorzystaj język C++ do tworzenia wydajnych aplikacji i systemów
Autor:
Adrian Ostrowski, Piotr Gaczkowski
Tytuł:
Wprowadzenie do C++
Autor:
Michał Matlak
Tytuł:
Opus magnum C++ 11. Programowanie w języku C++. Wydanie II poprawione (komplet)
Autor:
Jerzy Grębosz
Tytuł:
Programowanie wieloplatformowe z C++ i wxWidgets 3
Autor:
Bartosz W. Warzocha
Tytuł:
Język C++ i przetwarzanie współbieżne w akcji. Wydanie II
Autor:
Anthony Williams
Tytuł:
C++ dla bystrzaków. Wydanie VII
Autor:
Stephen R. Davis
Tytuł:
Tablice informatyczne. Podstawy C++
Autor:
Radosław Sokół
Tytuł:
Opus magnum C++11. Programowanie w języku C++ (komplet)
Autor:
Jerzy Grębosz