#pragma once


#ifndef GEOOPERATOR_H
#define GEOOPERATOR_H

#include "BaseConstVariable.h"
#include <Eigen/Core>
#include <Eigen/Dense>
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
#include <iostream>

/// <summary>
/// 三维向量，坐标表达
/// </summary>
struct Landpoint //  点   SAR影像的像素坐标；
{
	/// <summary>
	/// 经度x
	/// </summary>
	double lon; // 经度x lon pixel_col
	/// <summary>
	/// 纬度y
	/// </summary>
	double lat; // 纬度y lat pixel_row
	/// <summary>
	/// 高度z
	/// </summary>
	double ati; // 高程z ati pixel_time
};
struct Point_3d {
	double x;
	double y;
	double z;
};

/// <summary>
/// 将经纬度转换为地固参心坐标系
/// </summary>
/// <param name="XYZP">经纬度点--degree</param>
/// <returns>投影坐标系点</returns>
Landpoint LLA2XYZ(const Landpoint& LLA);
Eigen::MatrixXd LLA2XYZ(Eigen::MatrixXd landpoint);

/// <summary>
/// 将地固参心坐标系转换为经纬度
/// </summary>
/// <param name="XYZ">固参心坐标系</param>
/// <returns>经纬度--degree</returns>
Landpoint XYZ2LLA(const Landpoint& XYZ);


Landpoint operator +(const Landpoint& p1, const Landpoint& p2);

Landpoint operator -(const Landpoint& p1, const Landpoint& p2);

bool operator ==(const Landpoint& p1, const Landpoint& p2);

Landpoint operator *(const Landpoint& p, double scale);

double getAngle(const Landpoint& a, const Landpoint& b);

double dot(const Landpoint& p1, const Landpoint& p2);

double getlength(const Landpoint& p1);

Landpoint crossProduct(const Landpoint& a, const Landpoint& b);


Landpoint getSlopeVector(const Landpoint& p0, const Landpoint& p1, const Landpoint& p2, const Landpoint& p3, const Landpoint& p4);



float cross2d(Point_3d a, Point_3d b);

Point_3d operator -(Point_3d a, Point_3d b);

Point_3d operator +(Point_3d a, Point_3d b);

double operator /(Point_3d a, Point_3d b);



// 矢量计算 
struct Vector3D {
	double x, y, z;
};

// 计算两点之间的距离
double distance(const Vector3D& p1, const Vector3D& p2);
// 计算点到直线的最短距离
double pointToLineDistance(const Vector3D& point, const Vector3D& linePoint, const Vector3D& lineDirection);


struct CartesianCoordinates {
	double x, y, z;
};

struct SphericalCoordinates {
	double r, theta, phi;
};

SphericalCoordinates cartesianToSpherical(const CartesianCoordinates& cartesian);

CartesianCoordinates sphericalToCartesian(const SphericalCoordinates& spherical); 


#endif