#pragma once
#include "Resource.h"

#include "deque"
#include <string>
using namespace std;

//已知地球上两点经纬高,计算两点间的斜率(假定地球是圆的,考虑地球曲率)
double CalSlopeBetweenTwoPoint(const double fromPtLon, const double fromPtLat, const float fromPtAlt, const double endPtLon, const double endPtLat, const float endPtAlt);

//已知地球A点经纬度高,以及B点和A点连线相对于水平方向的斜率,求B点的高度
double CalAltFromSlope(const double fromPtLon, const double fromPtLat, const float fromPtAlt, const double endPtLon, const double endPtLat,const double slope);

/*-------------------------------------------------------------------------------------------------------------
说明:可视域分析
-------------------------------------------------------------------------------------------------------------*/

//线程函数,处理可视域分析
void ThreadFuncLightRegion();

//给定飞行高度,进行可视域分析
bool AnalysisLightRegion(int iAngle, int iRadius);

/*-------------------------------------------------------------------------------------------------------------
说明:实时通视检测
-------------------------------------------------------------------------------------------------------------*/

//线程函数,处理实时通视检测
void ThreadFuncRealTimeDetection();

//给定无人机高度,角度和距离范围,进行通视分析
bool AnalysisVisiArea(double uavAlt, double dAngle, double dDistanceMin, double dDistanceMax, double lonGCS, double latGCS);

/*-------------------------------------------------------------------------------------------------------------
说明:实时碰撞检测
-------------------------------------------------------------------------------------------------------------*/

//线程函数,处理实时碰撞检测
void ThreadFuncRealTimeCrash();

/*-------------------------------------------------------------------------------------------------------------
说明:航线通视分析
-------------------------------------------------------------------------------------------------------------*/

//线程函数,处理航线通视分析
void ThreadFuncAnalysisRoute();

//给定某点的经度、纬度,计算该点相对于地面站的通视高度
float CalculateVisibleAlt(const double& lon, const double& lat);

/*-------------------------------------------------------------------------------------------------------------
说明:实时视线通视分析
-------------------------------------------------------------------------------------------------------------*/
//线程函数,处理实时视线通视分析
void ThreadFuncAnalysisLOS();

/*-------------------------------------------------------------------------------------------------------------
说明:通视等高线分析
-------------------------------------------------------------------------------------------------------------*/
//线程函数,处理通视等高线分析
void ThreadFuncAnalysisContour();

//通视等高线分析并在地图上标绘等高线,iAngle 角度
bool AnalysisContourLine(int iAngle);

//添加点到通视等高线图层
void InsertPtToContourLine(float _fLightAlt, double _dPtLon, double _dPtLat);

// CDlgLightRegion 对话框

class CDlgLightRegion : public CBCGPDialog
{
	DECLARE_DYNAMIC(CDlgLightRegion)

public:
	CDlgLightRegion(CWnd* pParent = NULL);   // 标准构造函数
	virtual ~CDlgLightRegion();

// 对话框数据
	enum { IDD = IDD_DIALOG_LIGHTREGION };

	CBCGPChartCtrl	m_wndChart;
	CBCGPChartVisualObject* pChart;

	CBCGPChartAxis* pXAxis;
	CBCGPChartAxis* pYAxis;

	CBCGPChartSeries* pSeries1;
	CBCGPChartSeries* pSeries2;
	CBCGPChartSeries* pSeries3;

	CBCGPChartLineObject* m_pLine1;
	CBCGPStrokeStyle m_strokeStyle;
	CBCGPChartTextObject* m_pTextTip;

	double m_dGroundLon; //地面站经度
	double m_dGroundLat; //地面站纬度
	float  m_fGroudAlt;  //地面站高程
	double m_dCabinHgt;  //方舱本身高度

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	virtual BOOL OnInitDialog();

	//标绘地面站位置
	afx_msg void OnBnClickedButtonDrawPoint();

	//接收其他线程来的消息,更新对话框内容
	afx_msg LRESULT OnSendUpdateDialog(WPARAM wParam, LPARAM lParam);

/*-------------------------------------------------------------------------------------------------------------
说明:可视域分析绘制相关变量和函数
-------------------------------------------------------------------------------------------------------------*/
public:
	HANDLE hThreadRegion;
	DWORD ThreadIDRegion;

	int m_iFlightAlt;    //飞行高度
	int m_iRegionRadius; //分析半径

	//提示文字
	CBCGPVisualContainerCtrl    m_RegionTextContainer;
	CBCGPTextGaugeImpl*		    m_pRegionTTextIndicator;

	//初始化可视域分析提示文字显示仪表
	void InitRegionTextContainer();

	//可视域分析
	afx_msg void OnBnClickedButtonRegionAnaylsis();

	//清除可视域分析绘制图层
	afx_msg void OnBnClickedButtonRegionDelete();

/*-------------------------------------------------------------------------------------------------------------
说明:实时通视检测相关变量和函数
-------------------------------------------------------------------------------------------------------------*/
public:
	//是否在实时通视检测
	BOOL m_bRealTime_Visi;

	HANDLE hThreadDetect;
	DWORD ThreadIDDetect;

	//选中实时通视检测
	afx_msg void OnBnClickedCheckRealtime();

	//地图上实时在无人机周边绘制可视域
	void DrawVisiAreaRealTime(double uavAlt, double distanceToGCS, double angleToGCS, double lonGCS, double latGCS);

/*-------------------------------------------------------------------------------------------------------------
说明:实时碰撞检测相关变量和函数
-------------------------------------------------------------------------------------------------------------*/
public:
	//是否在实时碰撞检测
	BOOL m_bRealTime_Crash;

	HANDLE hThreadCrash;
	DWORD ThreadIDCrash;

	//选中实时碰撞检测
	afx_msg void OnBnClickedCheckRtDetection();

	//地图上实时在无人机周边检测高程
	void DrawCrashAreaRealTime(double uavAlt, double uavLon, double uavLat);

/*-------------------------------------------------------------------------------------------------------------
说明:航线通视分析相关变量和函数
-------------------------------------------------------------------------------------------------------------*/
	HANDLE hThreadRoute;
	DWORD ThreadIDRoute;

	CBCGPVisualContainerCtrl    m_LineTextContainer;
	CBCGPTextGaugeImpl*		    m_pLineTextIndicator;

	//初始化航线通视分析提示文字显示仪表
	void InitLineTextContainer();

	//加载航线
	afx_msg void OnBnClickedButtonLoadRoute();

	//保存航线通视分析结果
	afx_msg void OnBnClickedButtonSaveImage();

	//停止分析
	afx_msg void OnBnClickedButtonStopRoute();

	//清除航线通视分析结果
	afx_msg void OnBnClickedButtonClearResult();

	afx_msg LRESULT OnMouseDown(WPARAM wp, LPARAM lp);

/*-------------------------------------------------------------------------------------------------------------
说明:实时视线分析相关变量和函数
-------------------------------------------------------------------------------------------------------------*/
public:
	HANDLE hThreadLight;
	DWORD ThreadIDLight;

	BOOL m_bRTlight; //是否在实时视线分析:地面站-飞机视线方向通视情况
	
	//选中实时视线分析
	afx_msg void OnBnClickedCheckRtLight();

	//实时视线分析:地面站-飞机方向,在图表上完成结果绘制
	void AnalysisRealTime(double uavAlt, double distanceToGCS, double angleToGCS, double lonGCS, double latGCS);

/*-------------------------------------------------------------------------------------------------------------
说明:通视等高线分析
-------------------------------------------------------------------------------------------------------------*/
	HANDLE hThreadContour;
	DWORD ThreadIDContour;

	int m_iMaxLosAlt; //最大通视等高线高度

	CBCGPVisualContainerCtrl    m_ContourTextContainer;
	CBCGPTextGaugeImpl*		    m_pContourTextIndicator;

	//初始化通视等高线分析提示文字显示仪表
	void InitContourTextContainer();

	//通视等高线分析
	afx_msg void OnBnClickedButtonContourline();

	//清除通视等高线分析
	afx_msg void OnBnClickedButtonContourDelete();

/*-------------------------------------------------------------------------------------------------------------
说明:两点间通视分析
-------------------------------------------------------------------------------------------------------------*/
	afx_msg void OnBnClickedButtonSelectPtInMap();
	void ShowPointPosition(double ptLon, double ptLat);
	void LosBetweenTwoPoints();
	afx_msg void OnBnClickedButtonClearLineLayer();
	afx_msg void OnSize(UINT nType, int cx, int cy);
	afx_msg void OnBnClickedButtonGetAltValue();
	afx_msg void OnBnClickedButtonReverse();

	//标绘作战范围
	afx_msg void OnBnClickedButtonDrawFight();

	//清除作战范围
	afx_msg void OnBnClickedButtonDeleteFight();

	//作战半径
	int m_iFightRegion;
	
	//标绘高程数据区域
	afx_msg void OnBnClickedButtonGetDemRegion();
};