#pragma once

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;


class LFRPoint
{
private:
    /* data */
public:
    double x, y;
    LFRPoint(/* args */);
    LFRPoint(double x, double y);
    ~LFRPoint();

    LFRPoint operator-(const LFRPoint& pt){return LFRPoint(x-pt.x, y-pt.y);}
    LFRPoint operator+(const LFRPoint& pt){return LFRPoint(x+pt.x, y+pt.y);}
};

class LFRVector : public LFRPoint
{
private:
    /* data */
public:
    LFRVector(/* args */);
    LFRVector(double x, double y);
    LFRVector(const LFRPoint& pt);
    ~LFRVector();

};

class LFRLine
{
private:
    /* data */

public:
    LFRPoint start;
    LFRVector dir;

    LFRLine(/* args */);
    LFRLine(LFRPoint start, LFRVector dir);
    LFRLine(LFRPoint start, LFRPoint end);
    ~LFRLine();
};

class VectorOfLines{
    private:
    public:
    Point startPoint;
    float gradient;
    float zeroPoint;
    VectorOfLines();
    ~VectorOfLines();
    static double calcGradient(Point x, Point y);
    float calcZeroPoint(cv::Point x, float m);
    static double calcDistance(Point p0, Point p1);
    vector<Vec4i> findMiddleLine(vector<Vec4i> &lines);

};

class FrameData
{
public:
    std::vector<std::vector<cv::Point>> contours;
    std::vector<cv::Rect> boundingBoxes;
    std::vector<cv::Point> leftEdges;
    std::vector<cv::Point> middlePoints;

    FrameData(): contours(), boundingBoxes(), leftEdges(), middlePoints() {}
};