// © Copyright 1995, Joseph Bergin.  All rights reserved. 

#include "Display.h"

static double minX;
static double minY;
static double maxX;
static double maxY;

// ******************** DisplayCell ***************************
DisplayCell::DisplayCell(double x, double y, char what)
:	_x(x),
	_y(y),
	_what(what)
{
}

void DisplayCell::scale(int cols, int rows)
{	double x = _x;
	double y = _y;
//cout<< *this;
	_x = (x - minX)/(maxX-minX)*(cols-1);
	_y = (y - minY)/(maxY-minY)*(rows-1);
//cout<< *this;
}

ostream & operator<<(ostream & os, const DisplayCell d)
{	os << d._x<<' '<<d._y<<' '<<d._what<<endl;
	return os;
}

// ******************** DisplayCell ***************************
Display::Display(int cols, int rows)
:	_display(cols, rows),
	_displayCols(cols),
	_displayRows(rows)
{	clear();
}

void Display::draw( List<DisplayCell> & L)
{	clear();
	List<DisplayCell> temp = L;
	if(! temp.empty())// set up for scale
	{	DisplayCell D = temp.head();
		maxX = D._x;
		minX = D._x;
		maxY = D._y;
		minY = D._y;
		temp = temp.tail();
//cout << D<<endl;
	}
	while(!temp.empty())
	{	DisplayCell D = temp.head();
		if(D._x < minX) minX = D._x;
		if(D._x > maxX) maxX = D._x;
		if(D._y < minY) minY = D._y;
		if(D._y > maxY) maxY = D._y;
		temp = temp.tail();
//cout << D<<endl;
	}
	if(maxX==minX)maxX++;
	if(maxY==minY)maxY++;
//	cout<<"Params "<<minX<<' '<<maxX<<' '<<minY<<' '<<maxY<<endl;
	while(!L.empty())
	{	DisplayCell D = L.head();
		D.scale(_displayCols, _displayRows);
		_display(D._x, D._y) = D._what;
		L = L.tail();
	}
	int i, j;
//	for(i=0; i<_displayCols-15; i++)cout<<' '; 
//	cout << "("<<maxX<<','<<maxY<<')'<<endl;
	cout <<"Vertical scale:   "<<minY<<':'<<maxY<<endl;
	cout <<"Horizontal scale: "<<minX<<':'<<maxX<<endl;
	for(j = _displayRows-1; j>=0; --j)
	{	for(i = 0; i< _displayCols; ++i)
			cout<<_display(i,j);
		cout << endl;
	}
//	cout << "("<<minX<<','<<minY<<')'<<endl;
}

void Display::clear()
{	for(int j = 0; j< _displayRows; ++j)
	for(int i = 0; i< _displayCols; ++i)
		_display(i,j) = ' ';
}


