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

#include "character2d.h"
#include <stdio.h>
#include <assert.h>

// private function for constructor setup
void character2d::makech2d(Real xa, Real ya, Real sz){
  anchor[Xpt] = xa;
  anchor[Ypt] = ya;
  anchor[2] = 1.0;
  size = sz;

  assert(size>0);
  assert(size<500);

  // initialize positions of lines
  line[0][0][Xpt] = anchor[Xpt];
  line[0][0][Ypt] = anchor[Ypt];
  line[0][1][Xpt] = anchor[Xpt];
  line[0][1][Ypt] = anchor[Ypt] + (size*0.5);

  line[1][0][Xpt] = anchor[Xpt] + (size*0.5);
  line[1][0][Ypt] = anchor[Ypt];
  line[1][1][Xpt] = anchor[Xpt] + (size*0.5);
  line[1][1][Ypt] = anchor[Ypt] + (size*0.5);

  line[2][0][Xpt] = anchor[Xpt];
  line[2][0][Ypt] = anchor[Ypt] + (size*0.5);
  line[2][1][Xpt] = anchor[Xpt];
  line[2][1][Ypt] = anchor[Ypt] + size;

  line[3][0][Xpt] = anchor[Xpt] + (size*0.5);
  line[3][0][Ypt] = anchor[Ypt] + (size*0.5);
  line[3][1][Xpt] = anchor[Xpt] + (size*0.5);
  line[3][1][Ypt] = anchor[Ypt] + size;

  line[4][0][Xpt] = anchor[Xpt];
  line[4][0][Ypt] = anchor[Ypt];
  line[4][1][Xpt] = anchor[Xpt] + (size*0.5);
  line[4][1][Ypt] = anchor[Ypt];

  line[5][0][Xpt] = anchor[Xpt];
  line[5][0][Ypt] = anchor[Ypt] + (size*0.5);
  line[5][1][Xpt] = anchor[Xpt] + (size*0.5);
  line[5][1][Ypt] = anchor[Ypt] + (size*0.5);

  line[6][0][Xpt] = anchor[Xpt];
  line[6][0][Ypt] = anchor[Ypt] + size;
  line[6][1][Xpt] = anchor[Xpt] + (size*0.5);
  line[6][1][Ypt] = anchor[Ypt] + size;

  // set all Zpts to 1
  for(int i=0;i<7;i++)
    for(int j=0;j<2;j++)
      line[i][j][Zpt] = 1;
}

// function to setup the internal int array given a digit from 0-9
void character2d::map_num(unsigned digit){
  assert(0<= digit <=9);

  // all segments initialized to off in constructor
  // only turn on the desired segments
  switch(digit){
  case 0:
    segment[0] = 1;
    segment[1] = 1;
    segment[2] = 1;
    segment[3] = 1;
    segment[4] = 1;
    segment[6] = 1;
    break;
  case 1:
    segment[1] = 1;
    segment[3] = 1;
    break;
  case 2:
    segment[0] = 1;
    segment[3] = 1;
    segment[4] = 1;
    segment[5] = 1;
    segment[6] = 1;
    break;
  case 3:
    segment[1] = 1;
    segment[3] = 1;
    segment[4] = 1;
    segment[5] = 1;
    segment[6] = 1;
    break;
  case 4:
    segment[1] = 1;
    segment[2] = 1;
    segment[3] = 1;
    segment[5] = 1;
    break;
  case 5:
    segment[1] = 1;
    segment[2] = 1;
    segment[4] = 1;
    segment[5] = 1;
    segment[6] = 1;
    break;
  case 6:
    segment[0] = 1;
    segment[1] = 1;
    segment[2] = 1;
    segment[4] = 1;
    segment[5] = 1;
    segment[6] = 1;
    break;
  case 7:
    segment[1] = 1;
    segment[3] = 1;
    segment[6] = 1;
    break;
  case 8:
    segment[0] = 1;
    segment[1] = 1;
    segment[2] = 1;
    segment[3] = 1;
    segment[4] = 1;
    segment[5] = 1;
    segment[6] = 1;
    break;
  case 9:
    segment[1] = 1;
    segment[2] = 1;
    segment[3] = 1;
    segment[5] = 1;
    segment[6] = 1;
    break;
  }
}

// constructors
character2d::character2d(){
  makech2d(0, 0, DEFAULT_SIZE);
  // all segments off
  for(int i=0;i<7;i++) segment[i] = 0;
}

character2d::character2d(Real xa, Real ya, Real sz){
  makech2d(xa, ya, sz);
  // all segments off
  for(int i=0;i<7;i++) segment[i] = 0;
}

character2d::character2d(vector3d anch, Real sz){
  makech2d(anch[Xpt], anch[Ypt], sz);
  anchor[2] = anch[2];
  // all segments off
  for(int i=0;i<7;i++) segment[i] = 0;
}

character2d::character2d(Real xa, Real ya, Real sz, int *segs){
  makech2d(xa, ya, sz);
  for(int i=0;i<7;i++)
    segment[i]=segs[i];
}

character2d::character2d(vector3d anch, Real sz, int *segs){
  makech2d(anch[Xpt], anch[Ypt], sz);
  anchor[2] = anch[2];
  for(int i=0;i<7;i++)
    segment[i]=segs[i];
}

character2d::character2d(Real xa, Real ya, Real sz, unsigned digit){
  makech2d(xa, ya, sz);
  // all segments off
  for(int i=0;i<7;i++) segment[i] = 0;

  map_num(digit);
}

//
// end constructors
//

//
// setters
//
void character2d::setdigit(unsigned num){
  map_num(num);
}

void character2d::setanchor(Real xc, Real yc){
  anchor[Xpt] = xc;
  anchor[Ypt] = yc;
  makech2d(xc, yc, size);

  if(VERBOSITY > 1){
    printf("character2d.setanchor()\n");
    print();
  }
}

void character2d::setsize(Real sz){
  size = sz;
  makech2d(anchor[Xpt], anchor[Ypt], sz);
}

void character2d::print(){
  printf("\ncharacter2d.print() anchor(%e,%e) size=%e\n",
	anchor[Xpt],anchor[Ypt],size);

  printf("\ncharacter2d is \n");
  if(segment[6]) printf(" - \n");
  else printf("\n");
  if(segment[2]) printf("| ");
  else printf("  ");
  if(segment[3]) printf("|\n");
  else printf("\n");
  if(segment[5]) printf(" - \n");
  else printf("\n");
  if(segment[0]) printf("| ");
  else printf("  ");
  if(segment[1]) printf("|\n");
  else printf("\n");
  if(segment[4]) printf(" - \n");
  else printf("\n");
}

void character2d::draw(SimpleDraw& SD, matrix3d& m){
  for(int i=0;i<7;i++)
    if(segment[i]) line[i].draw(SD,m);
}


