[C++/wxPlotCtrl] - Plot laten scrollen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik ben nu een tijdje met programma bezig die (double)data uit een queue haalt, in arrays van 5 stopt en die arrays weer in een vector opslaat.

Daarna wordten alle arrays uit de vector geplot.
C++:
1
   // Deze code is intussen weggehaald 

dat is de beeld die ik dan krijg:
een

Afbeeldingslocatie: http://i60.servimg.com/u/f60/13/80/27/95/deel110.jpg

twee

Afbeeldingslocatie: http://i60.servimg.com/u/f60/13/80/27/95/deel211.jpg

drie

Afbeeldingslocatie: http://i60.servimg.com/u/f60/13/80/27/95/deel410.jpg

en nu komt eigenlijk de vraag zelf:
De wxPlotCtrl bepaalt zelf automatisch de horizontale schaal van de grafiek, zo dat de hele grafiek in een beeld past.
Hoe kan ik dat uitzetten? Zo dat de plot scrollt/verplaats steeds verder in de horizontale richting.

Om dat uit te vinden heb ik de hele forum van de wxWidgetds onderste boven gezocht, maar er zijn steeds dingen niet net anders zijn. Ook heb ik daar geprobeerd te vragen, maar de forum daar lijkt wel dood. Verder heb ik de documentatie van de wxPlotCtrl die ik kon vinden ook allemaal nagezocht, maar weer niets waarvan ik denk dat het nuttig is gevonden.

Kan iemand me helpen aub?
Alvast bedankt.

[ Voor 43% gewijzigd door Verwijderd op 14-05-2009 11:14 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ga eens kijken welke methoden ene wxPlotCtrl allemaal heeft. Volgens mij moet je met SetPlotViewRect wel kunnen doen wat je wilt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nee, dat heeft ie niet. Enige wat er enigzins lijkt te passen is
bool SetViewRect(const wxRect2DDouble &view, bool send_event=false)

dat heb ik dan ook geprobeert toe te passen:
C++:
1
2
3
4
5
6
7
wxRect2DDouble bound;
    bound.m_x=10;
    bound.m_y=0.05;
    bound.m_width=500;
    bound.m_height=1;
 .......... 
Custom1->SetViewRect(bound, true);


maar dat heeft niet het gewenste effect,
grafiek gaat raar verspringen, ipv "langer worden". Dat wil zeggen dat ie soms bijvoorbeeld met 50(of ander groete getal) op de a-as begint.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het is me nog niet helemaal duidelijk wat je precies wilt. Maar met de SetZoom functie kun je aangeven op welk stuk ( Origin ) hij inzoomt. Je X-Zoom hoeft daarbij niet hetzelfde te zijn als je Y-Zoom.

Verder kun je bij de meeste Charting controls gewoon de ranges van de Axes instellen. Ik zie niet zo snel hoe dat bij wxPlotCtrl moet, maar dat zou je in de documentatie op moeten zoeken

[ Voor 32% gewijzigd door Woy op 28-04-2009 15:41 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik bedoel het volgende:

Ik wil dat de x-as altijd bepaalde lengte is. Dus als de grafiek van 0 tot 120 loopt, dan zie ik als gebruiker het volgende:
Afbeeldingslocatie: http://i60.servimg.com/u/f60/13/80/27/95/voorbe10.jpg

en als de grafiek van 0 tot 500 loopt (of een andere grote x-waarde) dan zie ik als de gebruiker het volgende:
Afbeeldingslocatie: http://i60.servimg.com/u/f60/13/80/27/95/voorbe12.jpg

Hoop dat dat het een beetje duidelijker gemaakt heeft ...

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dus je wilt gewoon de range van je X-As instellen. ( MinX = MaxX - 120 ) in dit geval?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
C++:
1
2
3
4
5
6
7
wxRect2DDouble bound;
    bound.m_x=10;
    bound.m_y=1;
    bound.m_width=500;
    bound.m_height=1;
 .......... 
Custom1->SetViewRect(bound, true);

Nu, na dat ik dat heb ingesteld, krijg ik het volgende tre zien:

Afbeeldingslocatie: http://i60.servimg.com/u/f60/13/80/27/95/watgeb11.jpg

Let op dat de punten die er links staan helemaal niet kloppen met dat wat ie rechts laat zien!
Woy schreef op dinsdag 28 april 2009 @ 16:33:
Dus je wilt gewoon de range van je X-As instellen. ( MinX = MaxX - 120 ) in dit geval?
Ja, inderdaad!

[ Voor 20% gewijzigd door Verwijderd op 29-04-2009 10:43 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
De punten die hij links weergeeft kan hij ook helemaal niet weergeven op het control aangezien die bij een y-waarde van 1.0 begint, en alle y waarden aan de linkerkant onder de 1 zitten.

Doe eens

C++:
1
2
3
4
5
6
7
wxRect2DDouble bound;
bound.m_x=0;
bound.m_y=0;
bound.m_width=50;
bound.m_height=1;

Custom1->SetViewRect(bound, true);

Dat lijkt me beter bij de waardes die je hebt passen.

aangezien je blijkbaar een sinus wilt plotten zul je denk de volgende bounds moeten zetten
C++:
1
2
3
4
5
6
7
wxRect2DDouble bound;
bound.m_x= maxXValue - desiredWidth;
bound.m_y=-1;
bound.m_width= desiredWidth;
bound.m_height=2;

Custom1->SetViewRect(bound, true);

[ Voor 67% gewijzigd door Woy op 28-04-2009 16:48 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Woy schreef op dinsdag 28 april 2009 @ 16:41:

aangezien je blijkbaar een sinus wilt plotten zul je denk de volgende bounds moeten zetten
Ik plot nu een sinus omdat ik weet hoe die eruit moet zien, en het is lekker makkelijk. Wat daarna komt weet ik niet (nog onbekend, gezien het niet mijn deel van de opdracht is), ik krijg haal gewoon data uit de queue.

PS.stage ...

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ok maar die waardes kun je natuurlijk gewoon in bepalen
code:
1
2
3
4
5
6
7
minYValue, maxYValue
minXValue, maxXValue

foreach( Point )
    updateMinMaxValues( Point )

SetBounds( maxXValue - 120, maxXValue, minYValue, maxYValue )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
C++:
1
2
3
4
5
6
7
8
    double desiredWidth = 50;
    double maxXValue = points[0][4];

    wxRect2DDouble bound;
    bound.m_x = maxXValue - desiredWidth;
    bound.m_y = -1;
    bound.m_width = desiredWidth;
    bound.m_height = 2;

Dankje wel voor je advies!
Zo heb ik het nu gedaan, en inderdaad, het lijkt te helpen, wanneer ik de thread een beetje langzamer laat lopen. Hij laat steeds een gedeelte van de grafiek van de maxXValue - desiredWidth zien, maar soms springt ie in de oorsprong terug naar nul. Als de thread snel is, lijk het alsof hij steeds weer verspringt.

Wat ook mijn vragen oproept is dat er wel beneden een scrollbar staat, maar die heeft geen enige nut, namelijk wanneer groefiek van bv. 450 tot 500 loot, kan ik niet terug scrollen om voor 450 te kijken, omdat de scrollbar altijd laat zien dat er voor niets is. (ben ik weer vaag?) Misschien helpt dit:
Afbeeldingslocatie: http://i60.servimg.com/u/f60/13/80/27/95/goed10.jpg

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op dinsdag 28 april 2009 @ 17:21:
Dankje wel voor je advies!
Zo heb ik het nu gedaan, en inderdaad, het lijkt te helpen, wanneer ik de thread een beetje langzamer laat lopen. Hij laat steeds een gedeelte van de grafiek van de maxXValue - desiredWidth zien, maar soms springt ie in de oorsprong terug naar nul. Als de thread snel is, lijk het alsof hij steeds weer verspringt.
Dan zou je eens moeten debuggen. Kan het bijvoorbeeld voorkomen dat er vreemde waardes in maxXValue komen ( Zet eens een conditioneel break-point bijvoorbeeld ).
Wat ook mijn vragen oproept is dat er wel beneden een scrollbar staat, maar die heeft geen enige nut, namelijk wanneer groefiek van bv. 450 tot 500 loot, kan ik niet terug scrollen om voor 450 te kijken, omdat de scrollbar altijd laat zien dat er voor niets is. (ben ik weer vaag?) Misschien helpt dit:
[afbeelding]
Het is een beetje afhankelijk van welk control de scroll-bars tekent. Misschien is het wel het container control waar je wxPlotCtrl inzit, dan heb je waarschijnlijk te weinig ruimte voor het control gereserveerd.
offtopic:
Met [code=c++] [/code] kun je code als C++ plaatsen ( Hoe post je code? / Hoe gebruik je de code tag? )

[ Voor 5% gewijzigd door Woy op 28-04-2009 17:54 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Het is opgelost!
Bedankt voor je hulp Woy. Mijn fout was dat ik in de methode plot eerst een view instelde, daarna curve toevoegde, en die curve veranderde de view, tot dat ik de volgende keer in deze methode kwam, waarbij de view net weer goed gezet was, en gelijk daarna weer verpest door het toevoegen van weer een nieuwe curve.
C++:
1
2
    Custom1->SetViewRect(bound, true);
    Custom1->AddCurve(*myPlot);


in plaats van dit: Nu voeg ik eerst de curve toe, en dan gelijk daarna set ik de view zo als het moet zijn, en dan verlaat ik de methode.
C++:
1
2
    Custom1->AddCurve(*myPlot, true, true);
    Custom1->SetViewRect(bound, true);


Nu scrollt ie gewoon normaal zo als het moet :D

[ Voor 33% gewijzigd door Verwijderd op 29-04-2009 16:55 ]

Pagina: 1