/************************************************************************
  			micro.h - Copyright micha
*************************************************************************/

#ifndef MICRO_H
#define MICRO_H

#include "opencvext.h"
#include <ostream>

namespace seemicro
{

extern int DEBUGLEVEL;

/**
  * class Micro
  * Abstrakte Basisklasse für MicroAdam und MicroEva
  */
class Micro
{

public:

     /**
       * Zeichnet ein Bild des Rades mit Hilfe der Highlevel-Beschreibung durch
       * die gegebenen Parameter
       */
    virtual void draw(IplImage* where,
	const bool filled=0,
	const double useColor=0,
       	const bool setzero=1,
        const bool arm_auch=1);
    /**
      * Gibt Kopie dieses Objektes zurück. Knackpunkt: ist eine Methode.
      * Siehe B. Stroustrup, "The C++ Programming Language", 15.6.2, S. 424.
      * Abgeleitete Klassen sollten diese Methode überschreiben und Objekte
      * ihres eigenen Typs konstruieren.
      */
    virtual Micro* clone()
    {
      return new Micro(*this);
    }

/** Attributes: */
public:
     /**
      * Koordinaten des angenommenen/erkannten Mittelpunktes dieses Objektes
      */
  mypoint mitte;
  bool mitteValid;
     /**
      * Angenommener/erkannter Radius dieses Objektes
      */
  float radius;
  bool radiusValid;
     /**
      * Winkel zwischen (einem bestimmten) Armansatzpunkt und
      * Nullstellung des Rades (0 == rechts), von [0..2PI[
      */
  float alpha;
  bool alphaValid;
};

   /**
     * Ausgabe der Parameter dieses Objektes in einen Stream
     */
  std::ostream& operator<<(std::ostream& s, const Micro& m);

} // namespace seemicro

#endif // MICRO_H
