#ifndef HAUSDORFM_H
#define HAUSDORFM_H

#include <math.h>//abs

#include <funkce.h>
#include <my_image.h>
#include <stdlib.h>



class hausdorfm {
public:
    hausdorfm(my_image* image,bool mod=false);
    ~hausdorfm();
    void find(my_image* image);
private:
    my_image * image2voroni(my_image * image);
    float find_distant(int x1,int y1,my_image *img,int x2,int y2);//vypocita vzdalenost mezi body
    void flood(int x,int y,my_image *voro);
    void del_image();//smaze obrazky pri opetovnem nacteni sablony

    float Find_Nearest_Point(BOD stred,my_image * img);
    float find_nearest_point(BOD stred,int l,my_image * img);//najde nejblizsi bod v okoli l pomoci metriky find_distant
    float find_nearest_point(BOD stred, int x, int y,float old_min,my_image *img);


    void H_ab();
    float h_ab(int posun_x,int posun_y,my_image * imageA, my_image * imageB);//zjisti maximalni vzdalenost obrazu a od obrazu B, max min |a-b|
                //pro vsechny body z A, zjisti minimalni vzdalenostB (voroni)
                //a z teto vzdalenosti maximum



    //modifikace hausdorfa:
    float d(int x1,int y1,int x2,int y2,my_image * image1,my_image * image2);
    int d_min(int x,int y,my_image * image);


    ///////////////////////registrace bodu///////////////////////////////////////////////////
    std::vector<BOD> registruj(my_image * image);
    float h_ab_reg(int posun_x,int posun_y,my_image * imageA, my_image * imageB);
    float Find_Nearest_Point_reg(BOD stred,my_image * image);


   /////////////////////// //promenne//////////////////////////////////////////////
public:

    std::vector<BOD> body;

private:
    bool registruj_mod;//mod false-> klasicke prochazeni obrazku, mod true-> vsechny body z obrazku jsou ulozeny ve vektoru, vektor je pak prohledavan
    my_image * img_ref;
    my_image * img;
    float w1,w2;
    BOD location;


    uchar act_img_point_value;//pro modifikaci vypoctu HD zde ukladam uktualni hodnotu maleho obrazku u ktereho z jistuji vzdalenost
    //tyto dve hodnoty pouziji pro urychleni programu
        //pokud hledam minimalni  maximalni minimalni vzdalenost pak zkraceni je:
            //pokud hledam minimalni maximalni vzdalenost a jiz je aktualni maximalni  vzdale nost vetsi nez aktualni minimum, je jasne ze bod nevyberu, takze nemusim se snazit najit jeste vesti maximum...
    int act_min_posun;//aktualni minimum posunu
    int act_max;//aktualni maximum


    ///////////////////////registrace bodu///////////////////////////////////////////////////

    std::vector<BOD> body_img;
    std::vector<BOD> body_img_ref;
};

#endif // HAUSDORFM_H
