// Line.h: interface for the CLine class.
//
//////////////////////////////////////////////////////////////////////

/** \file Line.h
	\brief Rozhraní pro třídu CLine
*/
#if !defined(_LINE_H_)
#define _LINE_H_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "PrimitiveBase.h"
#include "Structures.h"

#define XPERIOD 5 ///< Počet pixelů přičtený k periodě opakování při inicializaci objektu
#define YPERIOD 5 ///< Počet pixelů přičtený k periodě opakování při inicializaci objektu

/** Reprezentuje vlastnosti geometrického objektu typu \b přímka
*/
class CLine : public CPrimitiveBase  
{
DECLARE_DYNAMIC(CLine)

private:
	int m_thick;			///<Tloušťka čáry
	double m_angle;			///<Úhel úsečky s osou Y
	double m_a, m_b, m_c;	///<Koeficienty úsečky \f$ ax+by+c=0 \f$
	CStructures::iPoint m_begin;	///< Počáteční bod úsečky
	CStructures::iPoint m_end;	///< Koncový bod úsečky
	bool m_Overflow;			///< Příznak zda požadovaný pixel je za počtem opakování a je tak okolím
	int m_type;					///< ID geometrickéo objektu 

	void CreateLineImage();		///< Vypočítá charakteristické parametry úsečky
	double GetAngleToYAxe();	///< Vrátí úhel úsečky a x-ové osy
	double GetPointDistance(CStructures::iPoint point); ///< Vrátí vzdálenost bodu od úsečky

	/** Vrátí pozici pixelu v základním umístění objektu.
		Přepočítá souřadnici aktuálního pixelu na odpovídající pixel objektu v základním umístění.
		Každý objekt je popsán analytickým popisem a umístěn na rovinu vrstvy. Poté se objekt může 
		v rovině libovolně zopakovat.

		@param[in] VirtualPosition typu CStructures::Point - souřadnice bodu v rovině vrstvy
		@return bod typu CStructures::Point v základním umístění geometrického objektu 
	*/
	CStructures::iPoint GetRealPoint(CStructures::iPoint VirtualPosition);

public:
	CLine(); ///< Defaultní konstruktor

	/** Parametrický konstruktor.
		Vytvoří geometrický objekt \b úsečka se zadanými parametry.
		@param begin - souřadnice počátečního bodu
		@param end - souřadnice konckovího bodu
		@param Thick - tloušťka úsečky
		
		Zbylé parametry jsou předány kostruktoru základní třdíy
		@see CPrimitiveBase parametrický konstruktor

	*/
	CLine(int distance, CStructures::iPoint begin, CStructures::iPoint end, int Thick, CStructures::ARGBPixel Object, CStructures::ARGBPixel Env, const char* title = "Untitled");
	
	virtual ~CLine();	///< Destruktor


	//--------- Přepsáné virtuální funkce ze základní třídy --------------//

	CStructures::ARGBPixel GetPixelValue(CStructures::iPoint position); //vrati hodnotu pixelu na dane pozici
	int GetType(){return m_type;}
	void Translate(int dx, int dy);
	void Rotate(double gama);

/*MR v příkladu se nepoužívá	CStructures::Point PointBegin(){return m_begin;}	///< Vrátí souřadnice počátečního bodu úsečky
/*MR v příkladu se nepoužívá	CStructures::Point PointEnd(){return m_end;}		///< Vrátí souřadnice koncového bodu úsečky
/*MR v příkladu se nepoužívá	int Thickness(){return m_thick;}					///< Vrátí tloušťku úečky v pixelech
*/
	void Resample(CStructures::Supersample supersample);

	//--------------------------------------------------------------------//

	//dumping objektu
	#ifdef _DEBUG
		void Dump(CDumpContext& dc) const;
	#endif //_DEBUG

};

#endif // !defined(_LINE_H_)
