Hauptseite | Liste aller Namensbereiche | Klassenhierarchie | Alphabetische Liste | Übersicht | Auflistung der Dateien | Elemente eines Namensbereiches | Datenstruktur-Elemente | Datei-Elemente

graph.h

gehe zur Dokumentation dieser Datei
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 //  #include <stdlib.h>
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*>(&micro);
00059     haveEva = dynamic_cast<MicroEva*>(&micro);
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     // aktuelles micro-Objekt in Array kopieren
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     // Graph neu zeichnen
00099     //cvZero(img);// schwarzer Hintergrund
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         //cvLine(img, lastX, X, c);
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         //cvLine(img, lastY, Y, c);
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         //cvLine(img, lastRadius, Radius, c);
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         //cerr << "Alpha: " << Alpha.p.y << " " << microHistory[x]->alpha << endl;
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           //putPixel8u_3(img, Beta[0].p.x, Beta[0].p.y, int(c));
00156           cvLineAA(img, lastBeta[0], Beta[0], c);
00157           //cerr << "y:" << Beta[0].p.y << " beta: " << adam->beta << " ";
00158         }
00159         else if(haveEva)
00160         {
00161           MicroEva *eva = dynamic_cast<MicroEva*>(microHistory[x]);
00162           assert(eva);
00163           // fünf Graphen untereinander für die 5 Betas
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             //putPixel8u_3(img, Beta[i].p.x, Beta[i].p.y, int(c));
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     } // for()
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   } // output()
00179 
00180 }; // GraphOutput
00181 
00182 } // seemicro
00183 
00184 #endif
00185 

Erzeugt am Sun Oct 3 12:52:47 2004 für seemicro von doxygen 1.3.2