/*
 * Jeffrey Ladino - jnl22@ccs.neu.edu
 *
 * File: circle2d.h
 *
 * Change Log
 ************
 ** August 7, 1999 - Jeff Ladino
 * Created.
 *
 */

#include "circle2d.h"
#include <stdio.h>

// constructors
circle2d::circle2d(){ 
  center[Xpt] = 0;
  center[Ypt] = 0;
  center[2] = 1;
  radius = 20; 
}

circle2d::circle2d(vector3d v, Real r){ 
  center[Xpt] = v[Xpt];
  center[Ypt] = v[Ypt];
  center[2] = v[2];
  radius = r; 
}

circle2d::circle2d(Real xc, Real yc, Real r){
  center[Xpt] = xc; 
  center[Ypt] = yc; 
  center[2] = 1.0; 
  radius = r; 
}

// functions
void circle2d::setradius(Real r){ radius = r; }
void circle2d::setcenter(Real xc, Real yc){ 
  center[Xpt] = xc; 
  center[Ypt] = yc; 
  center[2] = 1.0; 
}

void circle2d::print(){
  printf("\ncircle2d center(%e,%e) radius = %e\n",center[0],center[1],radius);
}


/*
 * CircleMidpoint
 *
 * Midpoint Circle drawing algorithm - adapted from 
 * Hearn, Baker "Computer Graphics C Version" 1997
 * p. 102
 */
void CirclePlotPoints(SimpleDraw& SD, int xcenter, int ycenter, int x, int y){
  SD.DrawPoint(xcenter + x, ycenter + y);
  SD.DrawPoint(xcenter + x, ycenter - y);
  SD.DrawPoint(xcenter - x, ycenter + y);
  SD.DrawPoint(xcenter - x, ycenter - y);
  SD.DrawPoint(xcenter + y, ycenter + x);
  SD.DrawPoint(xcenter + y, ycenter - x);
  SD.DrawPoint(xcenter - y, ycenter + x);
  SD.DrawPoint(xcenter - y, ycenter - x);
}
void CircleMidpoint(SimpleDraw& SD, int xcenter, int ycenter, int radius){
  int x =0;
  int y = radius;
  int p = 1-radius;

  while(x<y){
    x++;
    if(p<0)
      p += 2*x+1;
    else{
      y--;
      p += 2*(x-y)+1;
    }
    CirclePlotPoints(SD, xcenter, ycenter, x, y);
  }
}


void circle2d::draw(SimpleDraw& SD, matrix3d m){
  vector3d plot;
  plot = m * center;

  // draw using midpoint circle drawing algorithm
  CircleMidpoint(SD,(int)plot[Xpt], (int)plot[Ypt], (int)radius);
}

