// Camera.h: interface for the CCamera class.
// represents inner and outer parameters of camera (HW)
//
//////////////////////////////////////////////////////////////////////
/** \file Camera.h
	\brief Rozhraní pro třídu CCamera
*/

#if !defined(_CAMERA_)
#define _CAMERA_

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

#include "Structures.h"

/** Třída reprezentující vlastnosti snímacího zařízení (fotoaparát, kamera).
*/
class CCamera : public CObject  
{

	DECLARE_DYNAMIC(CCamera)

private :
	//int m_focus; //fix focus
	int m_xSize;		///< rozlišení v ose x
	int m_ySize;		///< rozlišení v ose y
	// int m_distanceToO;	///< vzdálenost od počátku soustavy
	double CameraConstant; // focus
	double ProjectionCenter[3];
	double Rotation[3];
	CStructures::fPoint m_imageCenter; ///< střed obrazu
	bool m_isReady;		///< příznak určující kompletní nastavení snímacího zařízení
	double pixel_xmm,pixel_ymm; // rozměr pixelu v mm

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

	/** Inicializace snímacího zařízení
		@param[in] xSize - rozlišení v ose x
		@param[in] ySize - rozlišení v ose y
		@param[in] distanceToO - vzdálenost od počátku soustavy
	*/
	CCamera(int xSize, int ySize, double distanceToO);
	~CCamera();	///< Destruktor

	// Y = distance, x - doprava, z nahoru
	void SetProjectionCenter(double X, double Y, double Z){ProjectionCenter[0]=X;ProjectionCenter[1]=Y;ProjectionCenter[2]=Z;}
	void SetCenter(double u, double v) {m_imageCenter.X=u;m_imageCenter.Y=v;}
	void SetRotation(double X, double Y, double Z){Rotation[0]=X /180 * 3.14159265358979323846 ;Rotation[1]=Y /180 * 3.14159265358979323846 ;Rotation[2]=Z /180 * 3.14159265358979323846 ;}
	void GetRotation(double &X, double &Y, double &Z){X=Rotation[0] *180 / 3.14159265358979323846 ;Y=Rotation[1] *180 / 3.14159265358979323846;Z=Rotation[2] *180 / 3.14159265358979323846;}
	void SetSize(int xSize, int ySize);	///< Nastavení rozlišení
	void SetPixel(double xx,double yy) {pixel_xmm=xx;pixel_ymm=yy;}
	CStructures::iPoint GetSize();		///< Vrátí velikost rozlišení
	//MR následující dvě metody asi vymazat - nahradit pomocí set/get projection center
	void SetDistanceO(double distanceO){CameraConstant  = distanceO;} ///< Nastavení vzdálenosti zařízení od počátku
	double GetDistanceToO(){return CameraConstant;}	///< Vrátí vzdálenost snímacího zařízení od počaátku
	void GetProjectionCenter(double &x,double &y,double&z){x=ProjectionCenter[0];y=ProjectionCenter[1];z=ProjectionCenter[2];}
	void SetReady(bool ready) {m_isReady = ready;}	///< Nastaví připravenost snímacího zařízení
	bool IsReady() {return m_isReady;}				///< Zjistí připravenost snímacího zařízení
	double GetXmm(){return  pixel_xmm;}
	double GetYmm(){return  pixel_ymm;}

	CStructures::fPoint GetCenter();	///< Vrátí souřadnice středu obrazové ploch zařízení
	CCamera& operator = (CCamera const & cam);


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

#endif // !defined(_CAMERA_)
