//-------------- Define -----------------------------//
#define H1				64				//정규화높이		
#define W1				64				//정규화너비			
#define MAXPTNUM		10000			//입력될수 있는 최대점수
#define MAXSTROKENUM	20				//입력될수 있는 최대획수
#define MAXSAMNUM		200				//최대표본점수
#define	MAXGRUP			20				//한개 자모의 최대필기형태수

#define MAXDIS			100000000.0f	//정합확률의 최대한계
#define DELTA			0.025f			//학습시 자모BN고유값의 최대한계
#define BTWDELTA		0.1f			//학습시 연결획BN고유값의 최대한계
#define RTDELTA			16.0f			//학습시 Bound BN고유값의 최대한계
#define LineFeed		0x0a0d			//

#define NON_CJZ_Flag	0				//초중종성 시작과 끝이 아니고 마우스눌림,해제점이 아닌 점
#define DOWN_Flag		1				//필기시에 마우스가 눌린 상태를 표시하는 플래그 
#define UP_Flag			2				//필기시에 마우스가 해제된 상태를 표시하는 플래그 
#define CJZ_Flag		3				//초중종성 시작과 끝점을 표시하는 플래그

#define WSRS			9				//획모형에 속하는 점모형수(깊이1인 경우 3,2인 경우 5,3인 경우 9)

#define MAXHUBONUM1		2				//초성후보의 최대개수
#define MAXHUBONUM2		40				//초-중 연결획후보의 최대개수
#define MAXHUBONUM3		6				//중성후보의 최대개수
#define MAXHUBONUM4		60				//중-종 연결획후보의 최대개수
#define MAXHUBO			40				//최종인식후보의 최대개수
//------------------------------------------------------//


//---------  입력점의 좌표를 표현하는 구조체 -----------//
typedef struct tagPoint
{	int nX,nY;
}OVR_POINT;
//------------------------------------------------------//

//----- 인식시에 이용되는 점좌표를 표현하는 구조체 -----//
typedef struct tagFPoint
{	float nX,nY;
}REC_POINT;
//------------------------------------------------------//

//------- 입력점 배열의 획속성을 표현하는 구조체 ----------//
typedef struct tagStroke
{
	int		stPtNo;		//획시작점 번호
	int		edPtNo;		//획끝점 번호
	char	strkType;	//획속성(0:실제획,1:가상획)
}STROKE;
//------------------------------------------------------//

//-------------- 점모형을 표현하는 구조체 --------------//
struct PointModel {
	PointModel **parent;	//부모점주소배열
	int countParents;		//부모점개수
	float P[2];				//점모형의 좌표
	float* W[2];			//점모형의 좌표평균을 구하는데 이용되는 선형회귀행렬
	float ramda[2];			//점모형의 공분산행렬의 고유값
	float matrix[2][2];		//점모형의 공분산행렬의 고유벡터
};
//------------------------------------------------------//

//------------- 획모형을 표현하는 구조체 --------------//
struct StrokeModel {
	PointModel* pPoint[WSRS];	//획모형에 소속된 점모형(PointModel)들의 주소배열
	int Prop;					//획속성(0:일반획,1:가상획,2:일반-가상획,3:가상-일반획)
										//0:일반획 :  펜으로 실제 그려지는 획.
										//1: 가상획 : 일반획사이를 연결하는 획으로서 필기자에따라 유무가 결정된다.
										//2:일반-가상획 : 이획은 시작은 반드시 펜으로 그려져야하고 뒷부분은 필기자에따라 그려질수도있고 그려지지않을수도있다.
										//3:가상-일반획 : 이획은 시작은 필기자에따라 그려질수도있고 그려지지않을수도있고 뒷부분은 반드시 펜으로 그려져야 한다.
	float ThDis;				//이 획의 정합확률 임계값
};
//-----------------------------------------------------//

//---------- 자모 모형을 표현하는 구조체 --------------//
typedef struct {
	int		JamoId;			//자모번호
								//초성BN인 경우는 toCkssm[]에서의 번호
								//중성인 경우는 toJkssm[]에서의 번호
								//종성인 경우는 toZkssm[]에서의 번호		
	int		GrpId;			//자모의 필기형태 번호(같은 자모라 하더라도 필기형태에 따라 서로 다른 자모모형으로 되는데 
							// GrpId는 그 필기형태의 번호이다.)
	int		StrokeNum;		//획개수(학습시킬때 주관적으로 정해진다.)
	float	ThDis;			//이 자모모형의 정합확률 임계값
	StrokeModel *pStroke;	//자모모형에 속한 획모형배열
} JAMOBN;
//----------------------------------------------------//

//------- 자모사이 연결획모형을 표현하는 구조체 -------//
struct JamoBTWBN {
	BOOL CJorJZfg;				// 0: 초-중, 1: 중-종
	BOOL bStudied;				// TRUE: 학습됨, FALSE: 학습안됨(2350자중에 연결규칙이 있다/없다를 표현)
	int PreJamoId;				//앞자모번호(CJorJZfg=0인 경우는 초성번호,CJorJZfg=1인 경우는 중성번호)
	int AftJamoId;				//뒤자모번호(CJorJZfg=0인 경우는 중성번호,CJorJZfg=1인 경우는 종성번호)
	float	ThDis;				//정합확률의 최대한계
	PointModel* pPoint[WSRS];	//이모형에 있는 점모형들의 주소배열
};
//--------------------------------------------------//

//----- 자모외접4각형모형을 표현하는 구조체 --------// 
struct RectModel {
	RectModel **parent;			//부모4각형모형의 주소배열
	int countParents;			//부모4각형모형의 개수 
	float P[4];					// 외접4각형의 좌표(left,top,width,height)
	float* W[4];				//4차원 벡터 (left,top,width,height)의 평균을 구하기 위한 선형회귀행렬 
	float ramda[4];				//4차원 벡터 (left,top,width,height)의 공분산행렬의 고유값
	float matrix[4][4];			//4차원 벡터 (left,top,width,height)의 공분산행렬의 고유벡터
	float	ThDis;				//이4각형모형의 정합확률임계값
};
//-------------------------------------------------//

//------------ 자모상호관련BN구조체 ---------------//
struct JamoBoundBN {
	int nType;					//초중종의 배치형태번호
	int nRectNum;				//외접4각형모형개수(nType=0~2인때 모형개수는 2개,nType=3~5인때 모형개수는 3개)
	float	ThDis;				//정합확률의 최대한계
	RectModel* pRect[3];		//4각형모형배열
};
//-------------------------------------------------//

//-------------- 초성후보경로구조체 -------------------// 
typedef struct tagChoPath
{
	int		ChoId;		//초성번호
	int		GrpId;		//이 초성내의 필기형태를 나타내는 그룹번호
	int		PtNo;		//이 초성이 끝나는 점번호
	float	SumDis;		//정합확률
	int		Mistake;	//점 배열이 획속성에 맞지 않는 오류개수 
	RECT	rt;			//초성의 외접4각형좌표
}ChoPath;
//----------------------------------------------------//

//----------- 초성후보경로 배열 구조체 -------------------// 
typedef struct tagChoHubo
{
	int		Num;					//초성후보개수
	ChoPath	Hubo[MAXHUBONUM1];		//초성후보 배열
}ChoHubo;
//-----------------------------------------------------//

//------------- 초성-중성간 연결획후보경로 구조체 ------------//
typedef struct tagC2JPath
{
	ChoPath cho;			//초성후보경로 
	int		PtNo;			//연결획끝점번호
	int		JungId;			//현재의 중성Id
	float	SumDis;			//cho의 정합확률*초성-중성연결획정합확률
	int		Mistake;		//점 배열이 획속성에 맞지 않는 오류개수 
}C2JPath;
//-----------------------------------------------------------//

//------------- 초성-중성간 연결획후보경로 배열 구조체 ------------//
typedef struct tagC2JHubo
{
	int		Num;				//초성-중성간 연결획후보개수
	C2JPath	Hubo[MAXHUBONUM2];	//초성-중성간 연결획후보 배열
}C2JHubo;
//-------------------------------------------------------------//

//------------- 중성후보경로 구조체 -------------------// 
typedef struct tagJungPath
{
	C2JPath c2J;			//초성-중성간 연결획 후보경로
	int		PtNo;			//중성이 끝나는 점 번호
	int		JungId;			//현재의 중성Id
	int		GrpId;			//중성의 그룹번호
	float	SumDis;			//cho의 정합확률*초성-중성연결획정합확률*중성의 정합확률
	int		Mistake;		//점 배열이 획속성에 맞지 않는 오류개수 
	RECT	rt;				//중성의 외접4각형
}JungPath;

//-------------- 중성후보경로 배열 구조체 -------------------// 
typedef struct tagJungHubo
{
	int			Num;					//중성후보개수
	JungPath	Hubo[MAXHUBONUM3];		//중성후보경로 배열
}JungHubo;
//-------------------------------------------------------//

//-------- 중성-종성간 연결획후보경로 구조체 ------------//
typedef struct tagJ2ZPath
{
	JungPath Jung;		//중성후보경로	
	int		PtNo;		//연결획이 끝나는 점 번호
	int		ZongId;		//종성Id
	float	SumDis;		//cho의 정합확률*초성-중성 연결획정합확률*중성의 정합확률*중성-종성 연결획정합확률
	int		Mistake;	//점 배열이 획속성에 맞지 않는 오류개수 
}J2ZPath;
//-------------------------------------------------------//

//------------ 중성-종성간연결획 후보경로 배열 구조체 -------------------// 
typedef struct tagJ2ZHubo
{
	int		Num;				//중성-종성간 연결획 후보경로개수
	J2ZPath	Hubo[MAXHUBONUM4];	//중성-종성간 연결획 후보경로 배열
}J2ZHubo;
//--------------------------------------------------------------------//

//-------------- 초성,중성,종성경로 구조체 -----------------//  
typedef struct tagHuboPath
{
	ChoHubo		Hubo1;	//초성후보 배열
	C2JHubo		Hubo2;	//초성-중성 연결획 후보 배열
	JungHubo	Hubo3;	//중성 후보 배열
	J2ZHubo		Hubo4;	//중성-종성 연결획 후보 배열
}HuboPath;
//-------------------------------------------------------//

//------------- 최종인식후보구조체 ----------------------//
typedef struct tagHUBO
{
	WORD	Code;			//인식코드
	int		CJZid[3];		//이 문자의 초성,중성,종성Id
	int		PtNo[6];		//초성,중성,종성의 시작과 끝점번호배열
	int		PtNum;			//한글인 경우 받침이 없는 경우 4,있는 경우 6,영어 또는 숫자인 경우는 2
	int		Mistake;		//점 배열이 획속성에 맞지 않는 경우의 총오류개수 (초+중+종성 오류개수)
	float	Dis;			//cho의 정합확률*초성-중성 연결획정합확률*중성의 정합확률*중성-종성 연결획정합확률*종성정합확률*초중종상호관련정합확률
}HUBO;
//-------------------------------------------------------//

//----------- 최종인식후보 배열구조체 ----------------------//
typedef struct tagHuboAry
{
	int		Num;			//최종인식후보개수
	HUBO	Hubo[MAXHUBO];	//최종인식후보 배열
}HuboAry;
//-----------------------------------------------------//
