#include <cassert>
#include <cmath>
using namespace std;

#include <gobj.h>
#include <graphmisc.h>
#include <point.h>
#include <print.h>
#include <protractor.h>
#include <ruler.h>

//#define PI 3.14159265359

void protractor::addAngleRuler
(
  doublec ticklenmajor,
  doublec ticklenmiddle,
  doublec ticklenminor
)
{
  ruler * r = new ruler();
  r->addAngleRuler
  (
    radius,
    0.0,
    360.0,
    ticklenmajor,
    ticklenmiddle,
    ticklenminor    
  );

  push(r);    
}


void protractor::addRadiusRuler
(
  doublec ticklenmajor,
  doublec ticklenmiddle,
  doublec ticklenminor
)
{
  ruler * r = new ruler();
  
  r->addStraightRuler
  (
    radius,
    point2<double>(0.0,0.0),
    point2<double>(radius,0.0),
    ticklenmajor,
    ticklenmiddle,
    ticklenminor    
  );

  push(r);
}


void protractor::converttocartesian
(
  point2<double> & p,
  point2<double> const & p2
)
{
  p.x = p2.x*cos(p2.y);
  p.y = p2.x*sin(p2.y);
}

protractor::protractor(doublec _radius)
  : gobjContainer(true), radius(_radius)
{
}

void protractor::addCirclesText
(
  vector<string> const & v
)
{
  uintc n = v.size();

  gobjContainer * c = new gobjContainer();

  double dt = PI * 2.0 / n;

  point2<double> x0;

  c->push( new gobjglPushAttrib(GL_CURRENT_BIT) );
  c->push( new gobjglPushAttrib(GL_LIGHTING_BIT) );
  c->push( new gobjglDisable(GL_LIGHTING) );

  c->push( new gobjglColor3ub(0,192,130) );

  for (uint i=0; i<n; ++i)
  {
    point2<double> x1(radius,dt*i);
    converttocartesian(x0,x1);

    c->push( new gobjMyBitmapCharacter(v[i], point3<float>(x0.x,x0.y,0.0)) );
  }

  c->push( new gobjglPopAttrib() );
  c->push( new gobjglPopAttrib() );

  push(c);
}



void protractor::addCircles(uintc n)
{
  gobjContainer * c = new gobjContainer();

  gobjMyCircle * cir = new gobjMyCircle();
  c->push(cir);

  c->push( new gobjglPushAttrib(GL_CURRENT_BIT) );
  c->push( new gobjglPushAttrib(GL_LIGHTING_BIT) );
  c->push( new gobjglDisable(GL_LIGHTING) );

  c->push( new gobjglColor3ub(192,192,192) );


  double dr = radius / n;

  gobjMyCircleDraw * cird;

  for (uint i=0; i<n; ++i)
  {
    cird = new gobjMyCircleDraw( dr * (i+1), point3<float>(), *cir );
    c->push(cird);
  }

  c->push( new gobjglPopAttrib() );
  c->push( new gobjglPopAttrib() );

  push(c);
}

void protractor::addAxes(uintc n)
{
  double dt = PI * 2.0 / n;

  gobjContainer * c = new gobjContainer();

  point2<double> x0;

  c->push( new gobjglPushAttrib(GL_CURRENT_BIT) );
  c->push( new gobjglPushAttrib(GL_LIGHTING_BIT) );
  c->push( new gobjglDisable(GL_LIGHTING) );

  c->push( new gobjglColor3ub(155,0,0) );

  c->push( new gobjglBegin(GL_LINES) );
  for (uint i=0; i<n; ++i)
  {
    point2<double> x1(radius,dt*i);
    converttocartesian(x0,x1);
    c->push( new gobjglVertex2f(x0) );
    c->push( new gobjglVertex2f(0.0,0.0) );
  }
  c->push(new gobjglEnd());

  c->push( new gobjglPopAttrib() );
  c->push( new gobjglPopAttrib() );

  push(c);
}









