#pragma once
#include "stdafx.h"

// 情报数据通用结构
#include "QBStru.h"

#include <opencv2\opencv.hpp>  
using namespace cv;

// 经纬度点坐标 结构体
struct GeoCoordinatePoint
{
	double Latitude;   // 纬度
	double Longitude;  // 经度
};


// 功能:地理信息计算

// 作者:王家星 2014/10/20


// 模块一:计算距离和方位

//功能1:计算图像中两点间的距离和方位
//输入:	1. qbData 通用情报数据结构体
//          2. pt1 起点(像素坐标)
//          3. pt2 终点(像素坐标)
//          4. flags:flags = 0:标识pt1、pt2为几何校正前图像中的点
//                    flags = 1:标识pt1、pt2为几何校正后图像中的点 
//
//输出:	1. distance 距离(单位:米)
//          2. azAngle  方位,起点到终点(单位:度)
//          3. 返回值:计算有效返回true,否则返回false
bool QBStruCalTwoPtsDistanceAzimuth(double &distance, double &azAngle,
								    const QBStru *qbData, cv::Point pt1, cv::Point pt2, int flags = 0);

//功能2:基于复接数据计算几何校正前图像中两点间的距离和方位
//输入:	1. frameData 复接数据结构体
//          2. pt1 起点(像素坐标)
//          3. pt2 终点(像素坐标)
// 
//输出:	1. distance 距离(单位:米)
//          2. azAngle  方位,起点点到终点(单位:度)
//          3. 返回值:计算有效返回true,否则返回false
bool CalTwoPointsDistanceAzimuth(double &distance, double &azAngle,
								 const struQB_FJ *frameData, cv::Point pt1, cv::Point pt2);


//功能3:计算图像(几何校正后)中两点间的距离和方位
//输入:	1. img    图像数据结构体指针
//          2. pt1 起点(像素坐标)
//          3. pt2 终点(像素坐标)

//输出:	1. distance 距离
//          2. azAngle  方位,起点点到终点
//          3. 返回值:计算有效返回true,否则返回false
bool ImgStruCalTwoPtsDistanceAzimuth(double &distance, double &azAngle, 
									 const ImgStru* img, cv::Point pt1, cv::Point pt2);

//功能4:计算图像(几何校正后)中一点的经纬度
//输入:	1. img    图像数据结构体指针
//          2. pt     输入点(像素坐标)

//输出:	1. PtLatLon 输入点的经纬度坐标
//          2. 返回值:计算有效返回true,否则返回false
bool ImgStruCalOnePtLonLat(GeoCoordinatePoint& PtLatLon, const ImgStru* img, cv::Point pt);





// 模块二:计算多边行面积

//功能5:计算图像中多点组成的多边形面积:对凹凸多边形均适用
//输入:	1. qbData 通用情报数据结构体
//          2. pts 指向点坐标的指针
//          3. count: 点数目
//          4. flags:flags = 0:标识points为几何校正前图像中的点
//                    flags = 1:标识points为几何校正后图像中的点 

//输出:	1. area  :多边形面积
//          2. 返回值:计算有效返回true,否则返回false
bool QBStruCalPolygonArea(double& area, 
								 const QBStru *qbData, cv::Point* points, int count, int flags = 0);


//功能6:计算图像中多点组成的多边形面积:对凹凸多边形均适用
//输入:	1. frameData 复接数据
//          2. pts 指向点坐标的指针
//          3. count: 点数目

//输出:	1. area  :多边形面积
//          2. 返回值:计算有效返回true,否则返回false
bool CalPolygonArea(double& area, const struQB_FJ *frameData, cv::Point* pts, int count);


// 功能7:计算由一组经纬度点构成的多边形面积:对凹凸多边形均适用
// 输入:   1. pts 指向多个经纬度坐标组的指针
//          2. count   点数目

//输出:	1. area 面积
//          2. 返回值:计算有效返回true,否则返回false
//说明:    点为顺时针或逆时针均可;
bool CalPolygonArea(double& area, GeoCoordinatePoint* pts, int count);


// 功能8:计算由一组平面坐标点构成的多边形面积:对凹凸多边形均适用
// 输入:   1. pts 指向多个点坐标组的指针
//          2. count   点数目

//输出:	1. area 面积 无单位
//          2. 返回值:计算有效返回true,否则返回false
//说明:    点为顺时针或逆时针均可;
bool CalPolygonArea(double& area, cv::Point2f* pts, int count);