#pragma once

#include "cvcls.h"



 


class CVCLS_API CRobotSpaceMapE1
{
public:
	CRobotSpaceMapE1(void);
	virtual ~CRobotSpaceMapE1(void);

	//如果bReverseLearn为TRUE,将同时进行反向学习。
	//数组的第一个点作为参考点
	BOOL Learn(RvPoint_f64* pCtcpImage, RvPoint_f64* pCtcpMach,int count, BOOL bReverseLearn =FALSE);

	//
	BOOL CopyFromArray(const double* pParaArr, int paraCount, BOOL bReverse=FALSE);
	BOOL CopyFrom(CRobotSpaceMapE1* pRsm);


	//是否已经学习
	BOOL IsValid();
	void Reset();//重设，恢复没有学习状态

	//输入图像坐标，获得机械坐标
	RvPoint_f64 GetCoord(double x, double y, BOOL bAbsolute );
	RvPoint_f64 GetCoord(int x, int y, BOOL bAbsolute  );
	RvPoint_f64 GetCoord(float x, float y, BOOL bAbsolute  );

	RvPoint_f64 GetCoord(RvPoint_f64 pos, BOOL bAbsolute  );
	RvPoint_f64 GetCoord(RvPoint_f  pos , BOOL bAbsolute );
	RvPoint_f64 GetCoord(RvPoint  pos , BOOL bAbsolute );
	
	//输入机械坐标，获得图像坐标
	RvPoint_f64 ReverseGet(double x, double y, BOOL bAbsolute );
	RvPoint_f64 ReverseGet(int x, int y, BOOL bAbsolute  );
	RvPoint_f64 ReverseGet(float x, float y, BOOL bAbsolute  );
	RvPoint_f64 ReverseGet(RvPoint_f64 pos, BOOL bAbsolute  );
	RvPoint_f64 ReverseGet(RvPoint_f  pos , BOOL bAbsolute );
	RvPoint_f64 ReverseGet(RvPoint  pos , BOOL bAbsolute );


	BOOL Serialze(HANDLE hFile, BOOL bIn);
	 
	//获得参考机械坐标
	RvPoint_f64 GetRefPos(BOOL bImagePos);
	
	//设置像素坐标,
	void SetRefPos(RvPoint_f64 refPos, BOOL bImagePos);
	 
	int GetCtrlCount(){  return m_nCtcpCount; };
	double GetMatrixElem(int index, BOOL bReverse=FALSE) ;
	const double* GetMatrix(BOOL bReverse=FALSE) 	;

	//比例可以学习后生成，或直接设置。
	//不保证比例有效。
	//计算公式：像素/机械
	double GetScale();
	void   SetScale(double scale);

	BOOL IsReverseLearned() { return m_bReverseLearned; };

protected:
  
	//参考机械坐标
	RvPoint_f64 m_refMachPos;
	RvPoint_f64 m_refImagePos;
	

	BOOL        m_bReverseLearned;
private:
	double      m_mtx[RSM_COEF_COUNT];
	double      m_rmtx[RSM_COEF_COUNT]; //反向矩阵

	double      m_nScale;   //比例, 像素/机械
//	RvPoint_f64 m_ctcpSrc[SM_CTCP_SZE];
//	RvPoint_f64 m_ctcpDst[SM_CTCP_SZE];
	int         m_nCtcpCount;

};

