diff --git a/examples/Evolution/NN3DWalkers.cpp b/examples/Evolution/NN3DWalkers.cpp index f86f8b92a..467d75ed3 100755 --- a/examples/Evolution/NN3DWalkers.cpp +++ b/examples/Evolution/NN3DWalkers.cpp @@ -49,6 +49,14 @@ class NNWalker; #define EVALUATION_DURATION 10 // s (duration of one single evaluation) #endif +#ifndef TIME_SERIES_MAX_Y +#define TIME_SERIES_MAX_Y 20.0f +#endif + +#ifndef TIME_SERIES_MIN_Y +#define TIME_SERIES_MIN_Y 0.0f +#endif + // Evaluation configurable parameters #ifndef REAP_QTY #define REAP_QTY 0.3f // number of walkers reaped based on their bad performance @@ -889,8 +897,8 @@ void NN3DWalkersExample::initPhysics() // setup data sources for walkers in time series canvas - m_timeSeriesCanvas = new TimeSeriesCanvas(m_guiHelper->getAppInterface()->m_2dCanvasInterface,300,200, "Fitness Performance"); - m_timeSeriesCanvas ->setupTimeSeries(40, POPULATION_SIZE*EVALUATION_DURATION, 0); + m_timeSeriesCanvas = new TimeSeriesCanvas(m_guiHelper->getAppInterface()->m_2dCanvasInterface,400,300, "Fitness Performance"); + m_timeSeriesCanvas->setupTimeSeries(TIME_SERIES_MIN_Y, TIME_SERIES_MAX_Y, 10, 0); for(int i = 0; i < POPULATION_SIZE ; i++){ m_timeSeriesCanvas->addDataSource(" ", 100*i/POPULATION_SIZE,100*(POPULATION_SIZE-i)/POPULATION_SIZE,100*(i)/POPULATION_SIZE); } diff --git a/examples/RenderingExamples/TimeSeriesCanvas.cpp b/examples/RenderingExamples/TimeSeriesCanvas.cpp index bfd2e9dfd..9e560cffb 100644 --- a/examples/RenderingExamples/TimeSeriesCanvas.cpp +++ b/examples/RenderingExamples/TimeSeriesCanvas.cpp @@ -13,7 +13,11 @@ struct DataSource float m_lastValue; bool m_hasLastValue; DataSource() - :m_hasLastValue(false) + :m_red(0), + m_green(0), + m_blue(0), + m_lastValue(0), + m_hasLastValue(false) { } }; @@ -28,10 +32,12 @@ struct TimeSeriesInternalData int m_height; float m_pixelsPerUnit; - float m_zero; + float m_center; int m_timeTicks; int m_ticksPerSecond; - float m_yScale; + float m_yMax; + float m_yMin; + float m_yZero; int m_bar; unsigned char m_backgroundRed; @@ -50,13 +56,17 @@ struct TimeSeriesInternalData } TimeSeriesInternalData(int width, int height) - :m_width(width), + :m_canvasInterface(NULL), + m_canvasIndex(0), + m_width(width), m_height(height), m_pixelsPerUnit(-100), - m_zero(height/2.0), + m_center(height/2.0), m_timeTicks(0), m_ticksPerSecond(100), - m_yScale(1), + m_yMax(1), + m_yMin(0), + m_yZero(0.5f), m_bar(0), m_backgroundRed(255), m_backgroundGreen(255), @@ -105,13 +115,18 @@ void TimeSeriesCanvas::addDataSource(const char* dataSourceLabel, unsigned char } void TimeSeriesCanvas::setupTimeSeries(float yScale, int ticksPerSecond, int startTime, bool clearCanvas) +{ + setupTimeSeries(-yScale, yScale, ticksPerSecond, startTime, clearCanvas); +} +void TimeSeriesCanvas::setupTimeSeries(float yMin, float yMax, int ticksPerSecond, int startTime, bool clearCanvas) { if (0==m_internalData->m_canvasInterface) return; - m_internalData->m_pixelsPerUnit = -(m_internalData->m_height/3.f)/yScale; + m_internalData->m_pixelsPerUnit = -(m_internalData->m_height/3.f)/(0.5f*(yMax-yMin)); m_internalData->m_ticksPerSecond = ticksPerSecond; - m_internalData->m_yScale = yScale; + m_internalData->m_yMin = yMin; + m_internalData->m_yMax = yMax; m_internalData->m_dataSources.clear(); if (clearCanvas) @@ -130,18 +145,22 @@ void TimeSeriesCanvas::setupTimeSeries(float yScale, int ticksPerSecond, int sta } } - float zeroPixelCoord = m_internalData->m_zero; + float centerPixelCoord = m_internalData->m_center; float pixelsPerUnit = m_internalData->m_pixelsPerUnit; - float yPos = zeroPixelCoord+pixelsPerUnit*yScale; - float yNeg = zeroPixelCoord+pixelsPerUnit*-yScale; + m_internalData->m_yZero = centerPixelCoord - pixelsPerUnit*0.5f*(yMax+yMin); + + float yPos = centerPixelCoord+pixelsPerUnit*0.5f*(yMax-yMin); + float yNeg = centerPixelCoord+pixelsPerUnit*-0.5f*(yMax-yMin); - grapicalPrintf("0", sTimeSeriesFontData, 2,zeroPixelCoord,m_internalData->m_textColorRed,m_internalData->m_textColorGreen,m_internalData->m_textColorBlue,m_internalData->m_textColorAlpha); + if(yMin < 0 && yMax > 0){ + grapicalPrintf("0", sTimeSeriesFontData, 2,m_internalData->m_yZero,m_internalData->m_textColorRed,m_internalData->m_textColorGreen,m_internalData->m_textColorBlue,m_internalData->m_textColorAlpha); + } char label[1024]; - sprintf(label,"%2.1f", yScale); + sprintf(label,"%2.1f", yMax); grapicalPrintf(label, sTimeSeriesFontData, 2,yPos,m_internalData->m_textColorRed,m_internalData->m_textColorGreen,m_internalData->m_textColorBlue,m_internalData->m_textColorAlpha); - sprintf(label,"%2.1f", -yScale); + sprintf(label,"%2.1f", yMin); grapicalPrintf(label, sTimeSeriesFontData, 2,yNeg,m_internalData->m_textColorRed,m_internalData->m_textColorGreen,m_internalData->m_textColorBlue,m_internalData->m_textColorAlpha); m_internalData->m_canvasInterface->refreshImageData(m_internalData->m_canvasIndex); @@ -209,7 +228,7 @@ void TimeSeriesCanvas::shift1PixelToLeft() int resetVal = 10; int countdown = resetVal; - //shift pixture one pixel to the left + //shift picture one pixel to the left for (int j=50;jm_height-48;j++) { for (int i=40;im_internalData->m_width;i++) @@ -238,35 +257,34 @@ void TimeSeriesCanvas::shift1PixelToLeft() } } - + { + int resetVal = 2; + static int countdown = resetVal; + if (!countdown--) { - int resetVal = 2; - static int countdown = resetVal; - if (!countdown--) - { - countdown=resetVal; - m_internalData->m_canvasInterface->setPixel(m_internalData->m_canvasIndex,m_internalData->m_width-1,m_internalData->m_zero,0,0,0,255); - } + countdown=resetVal; + m_internalData->m_canvasInterface->setPixel(m_internalData->m_canvasIndex,m_internalData->m_width-1,m_internalData->m_yZero,0,0,0,255); } + } + { + int resetVal = 10; + static int countdown = resetVal; + if (!countdown--) { - int resetVal = 10; - static int countdown = resetVal; - if (!countdown--) - { - countdown=resetVal; - float zeroPixelCoord = m_internalData->m_zero; - float pixelsPerUnit = m_internalData->m_pixelsPerUnit; + countdown=resetVal; + float centerPixelCoord = m_internalData->m_center; + float pixelsPerUnit = m_internalData->m_pixelsPerUnit; - float yPos = zeroPixelCoord+pixelsPerUnit*m_internalData->m_yScale; - float yNeg = zeroPixelCoord+pixelsPerUnit*-m_internalData->m_yScale; + float yPos = centerPixelCoord+pixelsPerUnit*0.5f*(m_internalData->m_yMax-m_internalData->m_yMin); + float yNeg = centerPixelCoord+pixelsPerUnit*-0.5f*(m_internalData->m_yMax-m_internalData->m_yMin); - m_internalData->m_canvasInterface->setPixel(m_internalData->m_canvasIndex,m_internalData->m_width-1, - yPos,0,0,0,255); - m_internalData->m_canvasInterface->setPixel(m_internalData->m_canvasIndex,m_internalData->m_width-1, - yNeg,0,0,0,255); - } + m_internalData->m_canvasInterface->setPixel(m_internalData->m_canvasIndex,m_internalData->m_width-1, + yPos,0,0,0,255); + m_internalData->m_canvasInterface->setPixel(m_internalData->m_canvasIndex,m_internalData->m_width-1, + yNeg,0,0,0,255); } + } @@ -276,7 +294,7 @@ void TimeSeriesCanvas::shift1PixelToLeft() char buf[1024]; float time = m_internalData->getTime(); sprintf(buf,"%2.0f",time); - grapicalPrintf(buf, sTimeSeriesFontData, m_internalData->m_width-25,m_internalData->m_zero+3,0,0,0,255); + grapicalPrintf(buf, sTimeSeriesFontData, m_internalData->m_width-25,m_internalData->m_center+3,0,0,0,255); m_internalData->m_bar=m_internalData->m_ticksPerSecond; @@ -294,7 +312,7 @@ void TimeSeriesCanvas::insertDataAtCurrentTime(float orgV, int dataSourceIndex, btAssert(dataSourceIndex < m_internalData->m_dataSources.size()); - float zero = m_internalData->m_zero; + float zero = m_internalData->m_yZero; float amp = m_internalData->m_pixelsPerUnit; //insert some new value(s) in the right-most column { diff --git a/examples/RenderingExamples/TimeSeriesCanvas.h b/examples/RenderingExamples/TimeSeriesCanvas.h index 41f466279..29901e8da 100644 --- a/examples/RenderingExamples/TimeSeriesCanvas.h +++ b/examples/RenderingExamples/TimeSeriesCanvas.h @@ -13,6 +13,7 @@ public: virtual ~TimeSeriesCanvas(); void setupTimeSeries(float yScale, int ticksPerSecond, int startTime, bool clearCanvas=true); + void setupTimeSeries(float yMin, float yMax, int ticksPerSecond, int startTime, bool clearCanvas=true); void addDataSource(const char* dataSourceLabel, unsigned char red,unsigned char green,unsigned char blue); void insertDataAtCurrentTime(float value, int dataSourceIndex, bool connectToPrevious); float getCurrentTime() const; @@ -22,4 +23,4 @@ public: }; -#endif//TIME_SERIES_CANVAS_H \ No newline at end of file +#endif//TIME_SERIES_CANVAS_H