/*	File: Polyline.cpp
 *
 *	Design and Implementation Description:
 *		For i = 0 .. nbrOfPoints - 2: delta [i] == point [i + 1] - point [i].
 *	History:
 *		Date:		 Author:	 Change:
 *		97-05-12	 KHU		 Creation.
 */

#include "Polyline.h"

#include <assert.h>
#include <graphics.h>
#include <math.h>							// For sqrt ().

#include "Arith.h"						// For Sqr ().

	void Polyline::Draw ()
	{
		moveto (refPoint.x, refPoint.y);
		for (int i = 0; i <= nbrOfPoints - 2; i++)
		{
			linerel (delta [i].x, delta [i].y);
		};
	}; // Draw

	Float Polyline::Extent () const
	{
		Float result = 0.0;
		for (int i = 0; i <= nbrOfPoints - 2; i++)
		{
			result += sqrt (Sqr (delta [i].x) + Sqr (delta [i].y));
		};
		assert(result >= 0.0);
		return result;
	}; // Extent

	CoordinatePair Polyline::Point (int nbr) const
	{
		assert(nbr >= 0);
		assert(nbr < nbrOfPoints);
		CoordinatePair point = refPoint;
		for (int i = 0; i <= nbr - 1; i++)
		{
			point.x += delta [i].x;
			point.y += delta [i].y;
		};
		return point;
	}; // Point

	void Polyline::Stretch (const CoordinatePair & factor)
	{
		FigureState s = state;
		if (s == shown)
		{
			Hide ();
		};
		refPoint.x *= factor.x;
		refPoint.y *= factor.y;
		for (int i = 0; i <= nbrOfPoints - 2; i++)
		{
			delta [i].x *= factor.x;
			delta [i].y *= factor.y;
		};
		if (s == shown)
		{
			Show ();
		};
		CheckInvariant ();
		assert(s == state);
	}; // Stretch

	Polyline::Polyline (const CoordinatePair point [], int nbrOfPoints)
	{
		assert(nbrOfPoints > 1);
		refPoint				= point [0];
		this->nbrOfPoints = nbrOfPoints;
		delta 				= new CoordinatePair [nbrOfPoints - 1];
		for (int i = 0; i <= nbrOfPoints - 2; i++)
		{
			delta [i].x = point [i + 1].x - point [i].x;
			delta [i].y = point [i + 1].y - point [i].y;
		}
		CheckInvariant ();
	}; // Polyline

	Polyline::~Polyline ()
	{
		delete[] delta;
	}; // ~Polyline

	void Polyline::CheckInvariant ()
	{
		StretchableFigure::CheckInvariant ();
		for (int i = 0; i <= nbrOfPoints - 2; i++)
		{
			assert(coordinateMin <= delta [i].x);
			assert(delta [i].x <= coordinateMax);
			assert(coordinateMin <= delta [i].y);
			assert(delta [i].y <= coordinateMax);
		}
	}; // CheckInvariant

// End of Polyline.

