Jak najprościej stworzyć wykres z przeciągalnymi punktami?

0

Witam.
Potrzebuję w programie możliwości stworzenia wykresu do którego mogę graficznie dodawać punkty i je ustawiać, a potem z kodu zczytać ich położenie.
Jak to najprościej osiągnąć?

0

Obawiam się, że nie ma „najprościej”, że trzeba „normalnie”.

Chyba że znajdziesz jakiś gotowy komponent tego typu, ale tego typu rzeczy są zwykle płatne...

0

Więc jak to zrobić "normalnie"?

0

Na przykład na panelu o nazwie bodajże Canvas narysować osie, gdzieś obok dać przycisk do dodawania punktu, po naciśnięciu przycisku na panel dodawać kontrolkę reprezentującą punkt (kwadracik czy coś) i dla tej kontrolki obsługiwać zdarzenie przesuwania.

0

No przecież jest kontrolka Chart. Popatrz na jej właściwości, metody i zdarzenia.

0

Polecam zapoznać się z biblioteką ZedGraph do wykresów tutaj tutorial - http://www.codeproject.com/Articles/5431/A-flexible-charting-library-for-NET

0

Najprościej to będzie zrobić na bitmapie, albo tylko tak zapisać, zbudować wykres na mapie pixeli i potem to zrenderować.
Zapis typowo binarny w pliku graficznym nawet z podstawową wiedzą na temat matematyki + trochę wyobraźni daje pożądane efekty.

Programista powinien sięgać najprostszych rzeczy gdy czegoś nie wie, bo te zawsze można wymyśleć.

1

Metod jest kilka. Najlepiej trzymać się wzorca MVC

  1. potrzebna ci klasa, model danych opisujący dane, które będziesz reprezentował na wykresie. Taka klasa powinna mieć metody do modyfikowanie twoich punktów kontrolnych i za pomocą delegatów informować o ważnych zmianach w tych danych.
  2. klasa widoku, która będzie wyświetlać dane z powyższej klasy, ma ona rejestrować się na delegaty klasy modelu i powodować odrysowanie, gdy wykryje że dane zmieniły się w istotny sposobów (zwykle wywołuje się metodę update). W zdarzeniu OnPaint (lub coś w ten deseń) masz odczesywać wykres na podstawie danych z klasy modelu. Widok może się składać z kilku widoków, ja bym dał widok główny zawierający tło i wszystkie pozostałe podwidoki, podwidok z samym wykresem i podwidoki z osiami współrzędnych.
  3. W klasie okienka (kontrolera), które zawiera widok z poprzedniego punktu, obserwujesz zachowanie myszki. Zależnie od stanu myszki aktualizujesz stan modelu (klasy z punktu 1).

Interakcję z myszką można zrobić na kilka sposobów. Można np do widoku wykresu dodawać podowidoki z ikonami "uchwytu" i przesuwać te widoki myszką. Obserwując zmiany pozycję zmiany tych widoków można aktualizować model danych.

Przykładowego kodu w C# nie podam, bo to nie moja działa. Robiłem takie rzeczy na Qt (Linux) i Obj-C (iOS) i dokładnie tak to wyglądało. Na Windows na sto procent ma być tak samo.
Ingerowanie w to bitmapy to tylko marnowanie zasobów.

0

http://speedy.sh/xXfw8/Generator-grafow.zip masz gotowca ale ten kod jest brzydki be i fuj:P i robi trochę cos innego, ctr + lewy sie łaczy kołka liniami. Jak patrze teraz na ten kod to nie polecam:P.
Najprościej Tak:
Masz posortowana po x liste punktów, piszesz metodę która rysuje linie miedzy kolejnymi sąsiednimi punktami, w wpf'ie masz obiekt Lini podajesz x1,x2,y1,y2 i usuwasz stare linie, a to co zrobiłeś dodajesz do canvas.
Dalej.Dla każdego ptk dodajesz elipse, piszesz na mouse down dopisujesz metode na przesuwanie w canvas(dużo pisania mało robo ty sam dasz rade:P), i ta metoda ma aktualizowac przy okazji pozycje punktu odpowiadającego elipsie(napisz klase dziedziczącą po elipsie lub własna kontroleke(lepsze) z polem point żeby to zgrać). Przy każdym jej wywołaniu odświeżasz widok.
Na MouseUp dla canvas (nie elipsy) piszesz metode przerywającą ruch.
Potem dodajesz dwa texboxy i buttom "dodaj punkt" w tb'ach podajesz x, y, i wstawiasz do listy tak by x sie zgadzał. Odświeżasz widok po wstawieniu.
Tak jest najprościej.

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