#pragma once

#ifndef __RELFING_H__
#define __RELFING_H__

#include "RelDot.h"
#include "AbsDot.h"
#include "AbsFing.h"
#include <list>

#define _USE_MATH_DEFINES
#include <cmath>


using namespace std;

//класс для хранения _относительных_ параметров точки
typedef list<CRelDot> listCRelDot;

//Шаблон для хранения пары значений {first, second}
template <class data_t1, class data_t2> struct CPair
{
	data_t1 first;
	data_t2 second;

	CPair(data_t1 _f, data_t2 _s)
	{
		first = _f; 
		second = _s;
	}
};

typedef CPair<CAbsDot, CAbsDot> CPairAbsDot;
typedef CPair<listCRelDot*, listCRelDot*> CPairSur;

//результат сравнения отпечатков
struct CCompareFing
{
	double val;			//уровень схожести отпечатков
	short cDot;			//количество совпавших точек
	short nfng;			//номер отпечатка
	CString name;		//файл отпечатка
	list<CPairAbsDot> dots;		//first - совпавшие точки на отпечатке в базе
	//second - совпавшие точки на открытом отпечатке
	list<CPairSur> surdots;
	//окружения на одинаковых отпечатках должны быть одинаковыми,
	//на этом основано сравнение "роз"
};

//Описание отпечатка в _относительных_ параметрах
class CRelFing: public list<listCRelDot>
{
private:
	inline double GetS(const CPoint A, const CPoint B);		//растояние между точками
	double GetAlpha(const CPoint A, const CPoint B);		//Направлени из точки А в В [-pi,pi)
public:
	CRelFing(){};
	~CRelFing(){};
	CRelFing *Convert(CAbsFing &fng);		//конвертировать абсолютные параметры к относительным
	CCompareFing Compare(CRelFing &fng);	//сравнить отпечатки
};

#endif