C++ Builder 6 Tworzenie punktów i zbieranie ich współrzędnych

0

Czołem!
W programowaniu jestem jeszcze zielony, zaczynam raczkować, stąd moja prośba o pomoc i pytania.
W aplikacji, którą tworzę chciałbym poprzez kliknięcie lewym klawiszem myszy na jakimś obszarze (np. PaintBox) utworzyć punkt/okrąg. Pierwsza koncepcja jaką udało mi się wymyślić wyglądała następująco:

void __fastcall TForm1::PaintBox1MouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
        Canvas->Pen->Color=clBlack;
        Canvas->Pen->Width=1;
        Canvas->Ellipse(X-3, Y-3, X+3, Y+3);

} 

Jednak nie jest do końca to o co mi chodzi. Czy da się zrobić coś podobnego lecz zamiast rysować, wygenerować taki okrąg (np. obiekt typu Shape), który mógłbym potem przesuwać poprzez kliknięcie lewym klawiszem myszy, przytrzymanie i przeciągnięcie w upodobaną lokalizację?
Ponadto współrzędne utworzonych punktów będą mi potrzebne. Chodzi tutaj o ostateczną pozycję punktu np.: tworzę punkt, pobierane są współrzędne punktu, następnie przesuwam go i poprzednie współrzędne zostają zastąpione nowymi. Jak utworzyć taką 'bazę współrzędnych', która by się aktualizowała z dodaniem nowego punktu i każdorazowym jego przesunięciu?

Mam nadzieję, że w miarę jasno opisałem mój problem i wizję. Byłbym wdzięczny za jakąkolwiek pomoc.
Pozdrawiam ;)

0

Przesuwać możesz ten rysowany również. W klasie dodaj vector<TPoint> Tb; Przy kliknięciu Tb.push_back(Point(X,Y)); Invalidate; W OnPaint w pętle rysujesz wszystkie.

0

Tworzenie punktów zrealizowałem następująco:

TShape*punkt=new TShape(this);
                punkt->Width = 10;
                punkt->Height = 10;
                punkt->Left = x - 5;
                punkt->Top = y - 5;
                punkt->Brush->Color = clBlue;
                punkt->Shape=stCircle;
                punkt->Parent = this; 

Natomiast jeśli chodzi o 'zbieranie' ich, nie wykorzystałem vector jak wyżej napisał _13th_Dragon. Zdecydowałem się na TList, ponieważ adresy elementów pozostają tutaj niezmienne (np. przy usuwaniu niektórych z nich..jeśli dobrze rozumiem) i będę chciał się potem odnosić do poszczególnych elementów. Mam jednak problem z użyciem. W pliku Unit1.h w sekcji private dopisałem

TList * listapkt;

natomiast w części kodu, którą przedstawiłem powyżej dopisałem listapkt->Add(punkt);

Pop odpaleniu i kliknięciu, żeby utworzyć punkt wyskakuje mi błąd. Błąd wyskakuje przy każdym kliknięciu lewym klawiszem w programie. Gdy nie ma tego listapkt->Add(punkt), to błędu nie ma... Screeny w załącznikach.
Jesteście w stanie mi pomóc?
0

Co byś powiedział człowiekowi który zamiast małych karteczek przytwierdzanych magnesikiem na lodówkę używa wielkich tekturowych płacht przykręcanych śrubami do ściany?
Właśnie coś w tym stylu próbujesz uczynić.
Użyj vector<TPoint> Tb oraz obsłuż zdarzenie OnPaint.
W innym przypadku owszem zaoszczędzisz jakieś 10 wierszy na rysowaniu zaś na każdej z pozostałych operacji - stracisz.
W sumie to podejście co próbujesz zrobić będzie cię kosztowało jakieś 5 razy więcej pracy.

0

OK. Tylko jeszcze drobne pytania: nie rysuję tych shape'ów na żadnym PaintBoxie ani nic tylko na formatce programu, więc zdarzenie OnPaint ma być obsłużone dla mojego TForm1, tak? Poza tym jeśli moje punkty to elemnty typu Shape, to w vector nie powinno być <TShape> zamiast <TPoint>?

0

Twoi punkty mają być elementami vector<TPoint> Tb; a nie kontrolkami TShape. Tak OnPaint dla TForm1.

0

Zrobiłem tak jak mi poleciłeś, ale niestety wywala błędy ;/

edit.
Aaaaaj, zapomniałem biblioteki dodać! Po dodaniu biblioteki wywala tylko błąd przy 'Invalidate'

0

Dzięki _13th_Dragon za pomoc :) Zadziałało...mogę sobie wyrysować linie między tymi punktami odnosząc się do danych zebranych w Vectorze. Moja aplikacja ma tworzyć krzywe Beziera na podstawie utworzonych wcześniej punktów. Jak więc aktualizować podczas przemieszczania punktów oraz podczas usuwania te współrzędne, które zbieram w Vector?

0

http://i.imgur.com/i9wvikj.jpg
Wiem do czego służy i jak działa google. Jak już wspomniałem w pierwszym poście jestem zielony w programowaniu - praktycznie nie miałem z tym styczności, a teraz taką aplikację muszę napisać. Szukałem i przemaglowałem sporo już na temat Vector, ale nadal nie wiem jak sobie poradzić z tą aktualizacją, dlatego pytam o pomoc.

0

Tak, to też studiowałem. Wymyśliłem tak:

  1. Klikam lewym klawiszem w pusty obszar -> Tworzy się shape, do vectora trafia Point(X,Y) i tak kilka razy...
  2. Chcę zmienić położenie jakiegoś punktu, na przykład punktu drugiego, więc przy kliknięciu w shape (mouse down) usuwam daną pozycję z vectora
pkt.erase(pkt.begin()+d);

Następnie przesuwam kursor i puszczam klawisz i wtedy chciałem podmienić elementy w vectorze:

pkt.insert(pkt.begin()+d,Point(X,Y));

ale to nie działa.
Poza tym jak zidentyfikować shape'a? Wpisałem do narzędzia tworzącego shape'y coś takiego punkt->Name=d; to moje d by się powiększało o 1 z każdym utworzonym punktem, ale to też nie działa. Dlatego na początku chciałem zastosować TList, ale to kurcze to też mi nie wyszło.

0

No rzesz przyczepił się do tego Shape !
"Nie potrzebujesz TShape" - proszę, wskaż którego słowa nie rozumiesz.

0

Używam Shape'a, ponieważ chcę widzieć te punkty, które tworzę i Shape świetnie je ilustruje, mogę go też łatwo złapać i przesunąć.

0

W OnPaint - użyj Canvas.Ellipse() czy cokolwiek innego - możesz nawet kulki 3D narysować. Rysowany "ręcznie" (w OnPaint) punkt jeszcze łatwiej złapać i przesunąć.

0

A jesteś w stanie bardziej to rozwinąć albo przykład pokazać? Bo mi już ręce opadają... Na samym początku robiłem to przy pomocy Ellipse(), ale odwiedziono mnie od tego pomysłu.

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