00001 #ifndef GRAPHOUTPUT_H
00002 #define GRAPHOUTPUT_H
00003
00004 #include <list>
00005 #include <iostream>
00006 #include "output.h"
00007 #include "../micro.h"
00008 #include "../microadam.h"
00009 #include "../microeva.h"
00010 extern"C"
00011 {
00012 #include <opencv/highgui.h>
00013
00014 }
00015
00016 using namespace std;
00017
00018 namespace seemicro
00019 {
00020
00021 extern int DEBUGLEVEL;
00022
00027 struct GraphOutput : public OutputModule
00028 {
00029 static const int BREITE = 300;
00030 static const int HOEHE = 300;
00031 int lastIndex;
00032 Micro& micro;
00033
00037 bool haveAdam, haveEva;
00038
00039 IplImage *img;
00040
00045 int enableX, enableY, enableRadius, enableAlpha, enableBeta;
00046
00050 Micro *microHistory[BREITE];
00051
00052 GraphOutput(Micro& Am) : micro(Am)
00053 {
00054 enableX = 0;
00055 enableY = 0;
00056 enableRadius = 1;
00057 enableAlpha = 1;
00058 haveAdam = dynamic_cast<MicroAdam*>(µ);
00059 haveEva = dynamic_cast<MicroEva*>(µ);
00060 cvNamedWindow("Graph", 1);
00061 img = cvCreateImage(cvSize(BREITE, HOEHE), IPL_DEPTH_8U, 3);
00062 cvCreateTrackbar("mitte.x an?", "Graph", &enableX, 1, NULL);
00063 cvCreateTrackbar("mitte.y an?", "Graph", &enableY, 1, NULL);
00064 cvCreateTrackbar("radius an?", "Graph", &enableRadius, 1, NULL);
00065 cvCreateTrackbar("alpha an?", "Graph", &enableAlpha, 1, NULL);
00066 if(haveAdam || haveEva)
00067 {
00068 enableBeta = true;
00069 cvCreateTrackbar("beta(s) an?", "Graph", &enableBeta, 1, NULL);
00070 }
00071 else enableBeta = false;
00072 lastIndex = 0;
00073 for(int i=0; i<BREITE; i++) microHistory[i] = NULL;
00074 }
00075
00076 ~GraphOutput()
00077 {
00078 for(int i=0; i<BREITE; i++) if(microHistory[i]) delete microHistory[i];
00079 cvReleaseImage(&img);
00080 cvDestroyWindow("Graph");
00081 }
00082
00083 virtual void output(bool keyframe)
00084 {
00085 #ifdef DEBUG
00086 if(DEBUGLEVEL>=3) cerr << "->GraphOutput::output()\n";
00087 #endif
00088
00089
00090 if(microHistory[lastIndex]) delete microHistory[lastIndex];
00091
00092 microHistory[lastIndex] = micro.clone();
00093 lastIndex++;
00094 if(lastIndex>=BREITE) lastIndex = 0;
00095
00096 if(!keyframe) return;
00097
00098
00099
00100 cvSet(img, cvScalar(255,255,255));
00101 mypoint lastX, X(0, 0),
00102 lastY, Y(0, 0),
00103 lastRadius, Radius(0, 0),
00104 lastAlpha, Alpha(0, 0),
00105 lastBeta[5], Beta[5];
00106 for(int i=0; i<5; i++) Beta[i] = mypoint(0, 0);
00107 for(int x=0; x<BREITE; x++)
00108 {
00109 lastX = X;
00110 lastY = Y;
00111 lastRadius = Radius;
00112 lastAlpha = Alpha;
00113 for(int i=0; i<5; i++) lastBeta[i] = Beta[i];
00114
00115 if(!microHistory[x]) continue;
00116
00117 if(enableX)
00118 {
00119 X = mypoint(x, microHistory[x]->mitte.p.x);
00120 double c = microHistory[x]->mitteValid ? CV_RGB(0, 255, 0) : CV_RGB(255, 0, 0);
00121 putPixel8u_3(img, X.p.x, X.p.y, int(c));
00122
00123 }
00124 if(enableY)
00125 {
00126 Y = mypoint(x, microHistory[x]->mitte.p.y);
00127 double c = microHistory[x]->mitteValid ? CV_RGB(0, 155, 0) : CV_RGB(155, 0, 0);
00128 putPixel8u_3(img, Y.p.x, Y.p.y, int(c));
00129
00130 }
00131 if(enableRadius)
00132 {
00133 Radius = mypoint(x, int(microHistory[x]->radius * HOEHE / 100));
00134 double c = microHistory[x]->radiusValid ? CV_RGB(0, 155, 222) : CV_RGB(155, 0, 222);
00135 putPixel8u_3(img, Radius.p.x, Radius.p.y, int(c));
00136
00137 }
00138 if(enableAlpha)
00139 {
00140 Alpha = mypoint(x, int(microHistory[x]->alpha * HOEHE / 2 / M_PI));
00141 double c = microHistory[x]->alphaValid ? CV_RGB(255, 0, 0) : CV_RGB(155, 0, 222);
00142 if(fabs(float(lastAlpha.p.y-Alpha.p.y))>50)
00143 putPixel8u_3(img, Alpha.p.x, Alpha.p.y, int(c));
00144 else cvLineAA(img, lastAlpha, Alpha, c);
00145
00146 }
00147 if(enableBeta)
00148 {
00149 if(haveAdam)
00150 {
00151 MicroAdam *adam = dynamic_cast<MicroAdam*>(microHistory[x]);
00152 assert(adam);
00153 Beta[0] = mypoint(x, int( (adam->beta/M_PI*2+0.5) * HOEHE));
00154 double c = adam->alphaValid ? CV_RGB(222, 155, 0) : CV_RGB(155, 222, 0);
00155
00156 cvLineAA(img, lastBeta[0], Beta[0], c);
00157
00158 }
00159 else if(haveEva)
00160 {
00161 MicroEva *eva = dynamic_cast<MicroEva*>(microHistory[x]);
00162 assert(eva);
00163
00164 for(int i=0; i<5; i++)
00165 {
00166 Beta[i] = mypoint(x, int(eva->beta[i] * HOEHE/6) + i*HOEHE/5);
00167 double c = eva->alphaValid ? CV_RGB(222, 222, 100) : CV_RGB(155, 222, 0);
00168
00169 cvLineAA(img, lastBeta[i], Beta[i], c, 0);
00170 }
00171 }
00172 else cerr << "enableBeta=true, but we have neither adam nor eva?\n";
00173 }
00174 }
00175 cvLine(img, cvPoint(lastIndex,0), cvPoint(lastIndex,HOEHE-1), CV_RGB(55, 55, 255));
00176 cvShowImage("Graph", img);
00177 cvResizeWindow("Graph", BREITE+5, HOEHE+280);
00178 }
00179
00180 };
00181
00182 }
00183
00184 #endif
00185