CompassMeter.C
00001
00002 #include "GUI/CompassMeter.H"
00003 #include "Image/PixelsTypes.H"
00004
00005 CompassMeter::CompassMeter(int width, int height):
00006 itsWidth(width),
00007 itsHeight(height),
00008 itsCurrentHeading(0),
00009 itsDesiredHeading(0)
00010 {
00011 }
00012
00013 Image<PixRGB<byte> > CompassMeter::render(short h)
00014 {
00015 itsCurrentHeading = h;
00016
00017 itsHeadingHist.push_front(h);
00018 if(itsHeadingHist.size() > 10)
00019 itsHeadingHist.pop_back();
00020
00021 Image<PixRGB<byte> > compassImage(itsWidth,itsHeight,ZEROS);
00022
00023 drawCircle(compassImage,Point2D<int>(itsWidth/2,itsHeight/2), .9*std::min(itsWidth,itsHeight)/2, PixRGB<byte>(255,0,0));
00024
00025 std::list<short>::reverse_iterator it = itsHeadingHist.rbegin();
00026 float opacity=0;
00027 float opacity_step =1/float(itsHeadingHist.size());
00028 for(;it != itsHeadingHist.rend(); ++it)
00029 {
00030
00031 int x = (int)(.9*std::min(itsWidth,itsHeight)/2*cos((*it-90)*(M_PI/180)));
00032 int y = (int)(.9*std::min(itsWidth,itsHeight)/2*sin((*it-90)*(M_PI/180)));
00033 drawArrow(compassImage,
00034 Point2D<int>(itsWidth/2,itsHeight/2),
00035 Point2D<int>(itsWidth/2+x,itsHeight/2+y),
00036 PixRGB<byte>(0,255*opacity*.5,255*opacity*.5));
00037 opacity+=opacity_step;
00038 }
00039
00040 int x = (int)(.9*std::min(itsWidth,itsHeight)/2*cos((*(itsHeadingHist.begin())-90)*(M_PI/180)));
00041 int y = (int)(.9*std::min(itsWidth,itsHeight)/2*sin((*(itsHeadingHist.begin())-90)*(M_PI/180)));
00042 drawArrow(compassImage, Point2D<int>(itsWidth/2,itsHeight/2), Point2D<int>(itsWidth/2+x,itsHeight/2+y), PixRGB<byte>(0,255,0));
00043
00044 return compassImage;
00045 }