Witam. Chcę stworzyć mini Painta. Mam już rysowanie prostych krzywych i elips. Teraz chcę zrobic zaznaczanie narysowanych obiektów (co bedzie mi potrzebne do edycji obiektów). Nie mam pojecia jak to zrobić i nie moge znaleźć nic na necie co mogłoby mi pomóc. Czy jest ktoś na tym forum i bedzie mogl mi pomóc. Pozdrawiam
To dość proste: na Twoim picturebox'ie tworzysz 2 zdarzenia - MouseDown (tutaj pobierasz polozenie kursora - e.X i e.Y) i MouseUp (robisz to ponownie, teraz pytasz kazdego narysowanego obiektu czy zawiera sie w tym ograniczeniu) i tyle. Pozdr
Yyyy, w paincie nie ma obiektów. Są tylko piksele. [???]
Więc o co ci chodzi ???
To zależy jak sobie to narysuje na picturebox'ie.
Jeśli bedzie wszystko co narysuje wsadzał do tablicy to może sobie pózniej "odpytać" co ma jakie współdzędne.
hmmm czyli np. Mam pictureboxa o wymiarach 100x100 px. Tworze tablice [100][100] i wypełniam samymi jedynkami (białe tło). Teraz tworze pierwszy obiekt - kwadracik (bez wypełnienia). W tablicy pojawiły mi się nowe wartości 0 (symbolizujące obiekt). I teraz mam rozumieć zrobić akcje, w której najeżdżając myszką na czarny pixel mam miec mozliwosc "zaznaczenia" obiektu. O to ci chodzi??. Hmm niby to jest proste ale jakoś nie widze jeszce tego jak to z tą edycją bedzie w tym wypadku :/.
Edycja będzie skomplikowana.... trzeba jeszcze raz wszystko przerysować z już nowym prostokątem.
Ale się zdecyduj edytor rastrowy czy wektorowy. Jeśli chcesz mieć edytor wektorowy (obiekty itd...) to trzeba te obiekty jakoś pamiętać. Przykładowo aby zapamiętać kwadrat potrzebujesz 4 współrzędne. I teraz aby sprawdzić, czy kliknięcie było na kwadracie sprawdzasz czy miejsce kliknięcia mieści się w tych 4 współrzędnych. Jest to zagadnienie kolizji. Dla każdej figury sprawdzasz kolizję zaczynając od tej najbardziej na wierzchu, idąc w dół zatrzymujesz się na pierwszej znalezionej. Edycja polegała by na tym, że modyfikujesz te 4 współrzędne i na nowo odrysowanie wszystkiego.
Jeśli to ma być edytor rastrowy tak jak paint to nie można zaznaczyć obiektów bo ich nie ma po prostu. Są tylko piksele i można zaznaczać konkretne obszary (zadany prostokąt, obszar o tym samym kolorze itp.)
No właśnie moze źle to ujałem ze ma byc jak w paincie bo tam sie tego nie da zrobic :) ... ale chodzi po prostu o to ze tworzymy obiekt (kwadrat) i potem po prostu mamy miec mozliwosc jego edycji.
No to tak jak pisałem. Każdą figurę przechowujesz jako współrzędne. Aby zaznaczyć obiekt sprawdzasz kolizję między figurą a miejscem kliknięcia. Przykładowy kwadrat o boku a oraz środku w pkt. (ox, oy) koliduje z punktem kliknięcia kx, ky jeśli
ox-a/2 <= kx <= ox+a/2
oraz
oy-a/2 <= ky <= oy+a/2
<= - mniejszy lub równy (żebyś nie myślał że to jakieś wynikanie)
spoko spoko ... co do wspolrzędnych to nie musisz mi tlumaczyc bo znam sie na "kolizjach" :). Bardziej martwi mnie fakt jak obiekty będą się przecinać i wtedy zaznaczanie bedzie troche nie teges :/. Ale jeszcze mysle wciaz nad rozwiazaniem tego problemu. Pozdrawiam
michal_robak napisał(a)
Bardziej martwi mnie fakt jak obiekty będą się przecinać i wtedy zaznaczanie bedzie troche nie teges :/.
to znaczy ? Chodzi ci o to jak będą nachodzić na siebie ? Przecież to żaden problem. Przy rysowaniu zaczynasz od tego najbardziej na spodzie i idziesz w górę. Przy zaznaczaniu sprawdzasz kolizję od tego najbardziej na wierzchu i idziesz w dół. Musisz mieć zapamiętaną kolejność obiektów, po prostuj trzymaj je w tablicy albo liście posortowane względem głębokości.
no ten pomysł z tym szukaniem obiektów po współrzędnych i sprawdzanie na który obiekt się trafiło nie jest zły z tym, że on nie chodzi o zazaczanie obiektów które są wypełnione ale o takie które mają same krawędzie i zaznaczenie nie bedzie polegało na tym że gdy jestesmy w środku obiektu to mozemy go zaznaczyc ale gdy najedziemy na krawędź czy to linii elipsy krzywej czy kwadratu. Pozdro
To wyobraź sobie, że krawędź to po prostu długi wąski prostokąt (wąski na kilka pikseli). I po problemie. Poza tym w każdym normalnym programie tego typu figury zamknięte można zaznaczać klikając wewnątrz nich, nie ważne czy mają wypełnienie czy nie. Tą zasadę z długim wąskim prostokątem możesz stosować w przypadku samych linii (odcinki, krzywe, łamane itp.).
Sory, że odgrzebuje taki stary temat, ale mam bardzo podobny problem. Tylko ze u mnie istnieją obiekty, bo to edytor wektorowy. Myślałem żeby każdy obiekt zrobić kontrolką i w tedy miałbym super obsługę zdarzeń, ale nie umiem sobie poradzić, jak zrobić kontrolkę np. w formie elipsy, ponieważ te dodawane w formie UserControl są prostokątami. Czy ktoś mógłby mi poradzić czy takie rozwiązanie ma sens i jak to ogarnąć, czy jednak trzeba szukać po obiektach sugerując się współrzędnymi kliknięcia.
adf88 napisał(a)
To wyobraź sobie, że krawędź to po prostu długi wąski prostokąt (wąski na kilka pikseli). I po problemie. Poza tym w każdym normalnym programie tego typu figury zamknięte można zaznaczać klikając wewnątrz nich, nie ważne czy mają wypełnienie czy nie. Tą zasadę z długim wąskim prostokątem możesz stosować w przypadku samych linii (odcinki, krzywe, łamane itp.).
Zdecydowanie obiekty. Kontrolki będą działały za wolno. Za bardzo mechanizm byłby związany z interfejsem użytkownika.
<quote=gosc_z_pytaniem>
adf88 napisał(a)
To wyobraź sobie, że krawędź to po prostu długi wąski prostokąt (wąski na kilka pikseli). I po problemie. Poza tym w każdym normalnym programie tego typu figury zamknięte można zaznaczać klikając wewnątrz nich, nie ważne czy mają wypełnienie czy nie. Tą zasadę z długim wąskim prostokątem możesz stosować w przypadku samych linii (odcinki, krzywe, łamane itp.).
kliknąłem nie ten przycisk "cytuj", który trzeba :-)