Skocz do zawartości

Visual C++ 2008 Express Edition - Wykresy


Pomocna odpowiedź

Napisano

Witam,
Mam spory problem z utworzeniem jakiegokolwiek wykresu.

Dane dostaje co 100ms, X Y Z. Chce je przedstawić na wykresie, tak by mi je rysowało "na żywo". (lub co jakiś czas)

Przeszukiwałem Google wiele godzin, ale nie znalazłem informacji jak to zrobić.

Zedgraph, DevExpress próbowałem ale za nic nie mogę wstawić danych "na żywo".

Proszę o konkrety, jak to wykonać, jakiś porządny tutorial.

I piszę w C++ nie C# CB czy innym.

Co rozumiesz przez pojęcie na żywo? Po za tym jak ten wykres ma wyglądać? Większość bibliotek GUI umożliwia rysowania linii, krzywych itp i bez problemu można z tego wykres stworzyć.

Gdybym to umiał, to bym tu pisał o pomoc?

Mam okno Form1 i w nim chce mieć pole w którym będzie się rysował wykres na podstawie danych otrzymywanych na bieżąco.

Np. otrzymuje dane i zapisuje do X Y Z w czasie 0 i rysuje początek linii. Następnie otrzymuje kolejne dane w czasie 1,2,... i zapisuje je do tego X Y Z i rysuje kolejne punkty linii. Ewentualnie na koniec zapisuje wykres jako obrazek.

Czy rzeczywiście to jest tak skomplikowane w Visual C++? Zwykły prosty wykres.

A dlaczego nie skorzystałeś ze standardowej kontrolki chart? Przykładowy wykres z mojego projektu poniżej:

O tym jak używać chart'a jest masa tutoriali.

Problem polega na tym właśnie, że nie mam właśnie tej kontrolki chart.

Skleiłem coś takiego i działa (prawie dobrze).

       zedGraphControl1->GraphPane->Title->Text="Wykres przyspieszeń";
zedGraphControl1->GraphPane->Title->FontSpec->Size=25;
zedGraphControl1->GraphPane->XAxis->Title->Text="Time";
zedGraphControl1->GraphPane->XAxis->Title->FontSpec->Size=20;
zedGraphControl1->GraphPane->YAxis->Title->Text="Acceleration [g]";
zedGraphControl1->GraphPane->YAxis->Title->FontSpec->Size=20;
zedGraphControl1->GraphPane->XAxis->Scale->Max=t+5;
zedGraphControl1->GraphPane->XAxis->Scale->Min=t-50;

PointPairList ^list = gcnew PointPairList();
PointPairList ^list2 = gcnew PointPairList();
PointPairList ^list3 = gcnew PointPairList();

//list->Add(0, 0);
//list2->Add(0, 0);
//list3->Add(0, 0);

list->Add(t,AcX);
list2->Add(t,AcY);
list3->Add(t,AcZ);
t++;

zedGraphControl1->GraphPane->Legend->Fill->Color::set(Color::AliceBlue);
zedGraphControl1->GraphPane->Fill->Color::set(Color::LightGoldenrodYellow);

zedGraphControl1->GraphPane->AddCurve("", list, Color::Red, SymbolType::Star);
zedGraphControl1->GraphPane->AddCurve("", list2, Color::Green, SymbolType::Star);
zedGraphControl1->GraphPane->AddCurve("", list3, Color::Blue, SymbolType::Star);

zedGraphControl1->AxisChange();
zedGraphControl1->Refresh();

Umieściłem to w timerze tak samo jak odczyt danych z USB. Aktualnie problem polega na tym, że nie rysuje linii tylko same pkt. Gdy od komentuję:

	//list->Add(0, 0);
//list2->Add(0, 0);
//list3->Add(0, 0);

Rysuje się linia, ale z tym problemem, że co przejście wstawia się pkt 0,0 co daje efekt, że linia idzie od 0 potem do pkt i do 0 i znów do pkt itd.

Podobnym problem ma legenda, gdyż co przejście wstawia się kolejna ta sama i rośnie aż zniknie całość.

Kolejnym problemem który napotkałem jest to, że po kilkunastu sekundach program zaczyna się strasznie "mulić". Nie usuwa z listy starych danych.

__________

Poprawione

__________

Komentarz dodany przez: Treker

Kody programu proszę umieszczać w tagach !




     
            
   

			
		

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...