SIMOrthoProgram-Orth_GF3-Strip/PSTM_simulation_windows2021.../PSTM_simulation_windows/ParameterInFile.h

576 lines
18 KiB
C
Raw Normal View History

#pragma once
#include <iostream>
#include <memory>
#include <vector>
#include <future>
#include <complex>
#include "gdalwarper.h"
#define PI_180 180/3.141592653589793238462643383279;
#define T180_PI 3.141592653589793238462643383279/180;
#define Radians2Degrees(Radians) Radians*PI_180
#define Degrees2Radians(Degrees) Degrees*T180_PI
const long double PI=3.141592653589793238462643383279;
const long double epsilon = 0.000000000000001;
const long double pi = 3.14159265358979323846;
const long double d2r = pi / 180;
const long double r2d = 180 / pi;
const long double a = 6378137.0; //<2F><><EFBFBD>򳤰<EFBFBD><F2B3A4B0><EFBFBD>
const long double f_inverse = 298.257223563; //<2F><><EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>
const long double b = a - a / f_inverse;
const long double e = sqrt(a * a - b * b) / a;
const long double eSquare = e*e;
int testPP();
using namespace std;
///
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
///
struct point // <20><> SARӰ<52><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
long double x; // γ<><CEB3> lat pixel_row
long double y; // <20><><EFBFBD><EFBFBD> lon pixel_col
long double z; // <20>߳<EFBFBD> ati pixel_time
};
struct VectorPoint {
long double x;
long double y;
long double z;
};
/// <summary>
/// <20><><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ع̲<D8B9><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ
/// </summary>
/// <param name="XYZP"><3E><>γ<EFBFBD>ȵ<EFBFBD>--degree</param>
/// <returns>ͶӰ<CDB6><D3B0><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5></returns>
inline point LLA2XYZ(point& LLA) {
long double L = LLA.x * d2r;
long double B = LLA.y * d2r;
long double H = LLA.z;
long double sinB = sin(B);
long double cosB = cos(B);
//long double N = a / sqrt(1 - e * e * sin(B) * sin(B));
long double N = a / sqrt(1 - eSquare * sinB * sinB);
point result = { 0,0,0 };
result.x = (N + H) * cosB * cos(L);
result.y = (N + H) * cosB * sin(L);
//result.z = (N * (1 - e * e) + H) * sin(B);
result.z = (N * (1 - eSquare) + H) * sinB;
return result;
}
/// <summary>
/// <20><><EFBFBD>ع̲<D8B9><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵת<CFB5><D7AA>Ϊ<EFBFBD><CEAA>γ<EFBFBD><CEB3>
/// </summary>
/// <param name="XYZ"><3E>̲<EFBFBD><CCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ</param>
/// <returns><3E><>γ<EFBFBD><CEB3>--degree</returns>
point XYZ2LLA(point& XYZ);
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>XYƽ<59><C6BD>ŷʽ<C5B7><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>
/// </summary>
/// <param name="p1"></param>
/// <param name="p2"></param>
/// <returns></returns>
inline long double caldistanceXY(point& p1, point& p2) {
//return pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2);
return (p1.x - p2.x)* (p1.x - p2.x) + (p1.y - p2.y)* (p1.y - p2.y);
}
/// <summary>
/// ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> p1-->p2
/// </summary>
/// <param name="p1">p1</param>
/// <param name="p2">p2</param>
/// <returns><3E><><EFBFBD><EFBFBD></returns>
inline VectorPoint getVector(point& p1, point& p2) {
VectorPoint result = { 0,0,0 };
result.x = p2.x - p1.x;
result.y = p2.y - p1.y;
result.z = p2.z - p1.z;
return result;
}
/// <summary>
/// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ
/// </summary>
/// <param name="vector1"><3E><><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD>ģ</returns>
inline long double getModule(VectorPoint& vector1) {
//return sqrt(pow(vector1.x, 2) + pow(vector1.y, 2) + pow(vector1.z, 2));
return sqrt(vector1.x* vector1.x + vector1.y* vector1.y + vector1.z* vector1.z);
}
inline long double getModuleV1V2(VectorPoint& v1, VectorPoint& v2)
{
return sqrt((v1.x * v1.x + v1.y * v1.y + v1.z * v1.z) * (v2.x * v2.x + v2.y * v2.y + v2.z * v2.z));
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>нǵĽǶ<C4BD>( <20>Ƕȣ<C7B6>
/// </summary>
/// <param name="vector1"><3E><><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD>нǵĽǶ<C4BD></returns>
inline long double getVectorAngle(VectorPoint& vector1,VectorPoint& vector2) {
//return Radians2Degrees( acos((vector1.x * vector2.x + vector1.y * vector2.y + vector1.z * vector2.z) / (getModule(vector1) * getModule(vector2))));
return Radians2Degrees(acos((vector1.x * vector2.x + vector1.y * vector2.y + vector1.z * vector2.z) / (getModuleV1V2(vector1, vector2))));
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD>ļн<C4BC>ֵ
/// </summary>
/// <param name="vector1"><3E><><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD>нǵĽǶ<C4BD></returns>
inline long double getVectorAngleValue(VectorPoint& vector1, VectorPoint& vector2) {
//return (vector1.x * vector2.x + vector1.y * vector2.y + vector1.z * vector2.z) / (getModule(vector1) * getModule(vector2));
return (vector1.x * vector2.x + vector1.y * vector2.y + vector1.z * vector2.z) / (getModuleV1V2(vector1, vector2));
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="V1"><3E><><EFBFBD><EFBFBD>1</param>
/// <param name="v2"><3E><><EFBFBD><EFBFBD>2</param>
/// <returns><3E><><EFBFBD><EFBFBD>ֵ</returns>
inline long double Vectordot(VectorPoint& V1, VectorPoint& v2) {
return V1.x * v2.x + V1.y * v2.y + V1.z * v2.z;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="V1"><3E><><EFBFBD><EFBFBD>1</param>
/// <param name="lamda">ϵ<><CFB5>ֵ</param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>IJ<EFBFBD>ֵ</returns>
inline VectorPoint VectordotNumber(VectorPoint& V1, long double lamda) {
V1.x = V1.x * lamda;
V1.y = V1.y * lamda;
V1.z = V1.z * lamda;
return V1;
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// <20><>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v1->v2
/// </summary>
/// <param name="v1">v1</param>
/// <param name="v2">v2</param>
/// <returns><3E><><EFBFBD>˵Ľ<CBB5><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
inline VectorPoint VectorFork(VectorPoint &v1, VectorPoint& v2) {
VectorPoint result{ 0,0,0 };
result.x = v1.y * v2.z - v1.z * v2.y;
result.y =v1.z*v2.x -v1.x * v2.z;
result.z = v1.x * v2.y - v1.y * v2.x;
return result;
}
//
// <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>
//
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>׼<EFBFBD><D7BC>ʽ
// <20>ļ<EFBFBD>ֵ <20><><EFBFBD><EFBFBD> <20><>Ӧ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
// DEM<45>ļ<EFBFBD><C4BC><EFBFBD>·<EFBFBD><C2B7> str dem_path
// ģ<><C4A3>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7> str sar_sim_path
// ģ<><C4A3>Ӱ<EFBFBD><D3B0><EFBFBD>Ŀ<EFBFBD> int
// ģ<><C4A3>Ӱ<EFBFBD><D3B0><EFBFBD>ĸ<EFBFBD> int
// ģ<><C4A3>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><C2B7> str sar_sim_match_point_x_path
// ģ<><C4A3>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD>·<EFBFBD><C2B7> str sar_sim_match_point_x_path
// ģ<><C4A3>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Y<EFBFBD><59><EFBFBD><EFBFBD>·<EFBFBD><C2B7> str sar_sim_match_point_y_path
// ģ<><C4A3>Ӱ<EFBFBD><D3B0><EFBFBD><EFBFBD>ƥ<EFBFBD><C6A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD><5A><EFBFBD><EFBFBD>·<EFBFBD><C2B7> str sar_sim_match_point_z_path
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> long double sample_f
// <20><>б<EFBFBD><D0B1> long double R0
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1> long double starttime ---UTC ʱ<><CAB1>
// <20><><EFBFBD><EFBFBD> long double
// <20><><EFBFBD><EFBFBD> long double
// <20><><EFBFBD><EFBFBD><EFBFBD>ղο<D5B2>ʱ<EFBFBD><CAB1> long double TO ---UTC ʱ<><CAB1>
// <20><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>Ƶ<EFBFBD><C6B5> long double PRF
// б<><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> long double delta_R
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>1 long double
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>2 long double
// ....
// <20><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ʽģ<CABD><C4A3> int 1 <20>ǡ<EFBFBD>0 <20><><EFBFBD><EFBFBD>
// <20><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD>Ͷ<EFBFBD><CDB6><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD> int 4 5
// <20><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1> long double
// <20><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3>Xֵϵ<D6B5><CFB5>1 long double
// ....
// <20><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3>Yֵϵ<D6B5><CFB5>1 long double
// ...
// <20><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3>Zֵϵ<D6B5><CFB5>1 long double
// ...
// <20><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3>Vxֵϵ<D6B5><CFB5>1 long double
// ...
// <20><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3>Vyֵϵ<D6B5><CFB5>1 long double
// ...
// <20><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3>Vzֵϵ<D6B5><CFB5>1 long double
// ...
//
//
class ParameterInFile
{
public:
ParameterInFile(std::string infile_path);
ParameterInFile(const ParameterInFile& paras);
~ParameterInFile();
public:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
std::string dem_path; //dem ·<><C2B7>
std::string out_sar_sim_path; // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>sar
std::string out_sar_sim_dem_path; // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>sar
std::string out_sar_sim_resampling_path; // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>sar
std::string out_sar_sim_resampling_rc;
int sim_height; // ģ<><C4A3>Ӱ<EFBFBD><D3B0><EFBFBD>ĸ<EFBFBD>
int sim_width;
long double widthspace;// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>
std::string sar_sim_match_point_path; //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ӱ<EFBFBD><D3B0><EFBFBD>ĵص<C4B5>x
std::string sar_sim_match_point_xyz_path; //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ӱ<EFBFBD><D3B0><EFBFBD>ĵص<C4B5>x
int sample_f; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
long double R0; //<2F><>б<EFBFBD><D0B1>
long double LightSpeed;//<2F><><EFBFBD><EFBFBD>
long double lamda;//<2F><><EFBFBD><EFBFBD>
long double refrange;// <20>ο<EFBFBD>б<EFBFBD><D0B1>
long double delta_R; // б<><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
long double imgStartTime; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1>
long double PRF;// <20><><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
long double delta_t;// ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int doppler_paramenter_number;// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
long double* doppler_para;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD><CFB5>
//<2F><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3>
int polySatelliteModel;// <20>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
int polynum;// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
long double SatelliteModelStartTime;
long double* polySatellitePara;
};
// <20><><EFBFBD>ݹ<EFBFBD><DDB9><EFBFBD>ģ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿռ<C7BF>λ<EFBFBD><CEBB>
struct SatelliteSpacePoint {
long double x=0;
long double y=0;
long double z=0;
long double vx=0;
long double vy=0;
long double vz=0;
};
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="satelliteTime"><3E><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1></param>
/// <param name="SatelliteModelStartTime"><3E><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼʱ<CABC><CAB1></param>
/// <param name="polySatellitePara"><3E><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD></param>
/// <param name="polynum"><3E><><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD></param>
/// <returns></returns>
inline SatelliteSpacePoint getSatellitePostion(long double satelliteTime,long double SatelliteModelStartTime,long double* polySatellitePara,int polynum);
/// <summary>
/// <20><>ֵģ<D6B5><EFBFBD><E2B7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>ֵ
/// </summary>
/// <param name="R">б<><D0B1></param>
/// <param name="LightSpeed"><3E><><EFBFBD><EFBFBD></param>
/// <param name="T0"><3E><><EFBFBD><EFBFBD><EFBFBD>ղο<D5B2>ʱ<EFBFBD><CAB1></param>
/// <param name="doppler_para"><3E><><EFBFBD><EFBFBD><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>ֵ</returns>
inline long double calNumericalDopplerValue(long double R,long double LightSpeed,long double T0, long double* doppler_para,int doppler_paramenter_number);
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>ֵ
/// </summary>
/// <param name="R">б<><D0B1></param>
/// <param name="lamda"><3E><><EFBFBD><EFBFBD></param>
/// <param name="R_sl"><3E><><EFBFBD><EFBFBD>-><3E><><EFBFBD>ǵĿռ<C4BF><D5BC><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="V_sl"><3E><><EFBFBD><EFBFBD>-><3E><><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>ֵ</returns>
inline long double calTheoryDopplerValue(long double R, long double lamda, VectorPoint R_sl, VectorPoint V_sl);
/// <summary>
/// <20><><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>sarӰ<72><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="landpoint"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>--<2D>ع<EFBFBD><D8B9><EFBFBD><EFBFBD><EFBFBD>ϵ</param>
/// <param name="Starttime">ӰƬ<D3B0><C6AC>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1></param>
/// <param name="lamda"><3E><><EFBFBD><EFBFBD></param>
/// <param name="T0"><3E><><EFBFBD><EFBFBD><EFBFBD>ղο<D5B2>ʱ<EFBFBD><CAB1></param>
/// <param name="LightSpeed"><3E><><EFBFBD><EFBFBD></param>
/// <param name="delta_t">ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="R0"><3E><>б<EFBFBD><D0B1></param>
/// <param name="delta_R">б<><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="SatelliteModelStartTime"><3E><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3>ʱ<EFBFBD><CAB1></param>
/// <param name="polySatellitePara"><3E><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD>Ͳ<EFBFBD><CDB2><EFBFBD></param>
/// <param name="polynum"><3E><><EFBFBD>ǹ<EFBFBD><C7B9><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="doppler_paramenter_number"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD></param>
/// <returns>Ӱ<><D3B0><EFBFBD><EFBFBD><EFBFBD>꣨x:<3A>кţ<D0BA>y:<3A>кţ<D0BA>z<EFBFBD><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>̣<EFBFBD></returns>
inline point PSTN(point& landpoint, long double Starttime, long double lamda, long double T0, long double* doppler_para, long double LightSpeed, long double delta_t, long double R0, long double delta_R, long double SatelliteModelStartTime, long double* polySatellitePara, int polynum = 4, int doppler_paramenter_number = 5);
struct translateArray {
long double a0, a1, a2;
long double b0, b1, b2;
};
/// <summary>
/// ת<><D7AA>Ӱ<EFBFBD><D3B0>
/// </summary>
/// <param name="row_ids"></param>
/// <param name="col_ids"></param>
/// <param name="value"></param>
/// <param name="gt"></param>
/// <returns></returns>
inline point Translation(long double row_ids,long double col_ids,long double value,translateArray& gt) {
point result{ 0,0,0 };
result.x = gt.a0 + gt.a1 * col_ids + gt.a2 * row_ids;
result.y = gt.b0 + gt.b1 * col_ids + gt.b2 * row_ids;
result.z = value;
return result;
}
inline int Translation(long double& x, long double& y, long double& r, long double& c, translateArray& gt) {
c = gt.a0 + gt.a1 * x + gt.a2 * y;
r = gt.b0 + gt.b1 * x + gt.b2 * y;
return 0;
}
/// <summary>
/// dem<65><6D>
/// </summary>
class dem_block {
public:
dem_block(int all_start_row,int all_start_col,int start_row, int end_row, int start_col, int end_col, int height, int width,int sample_f);
dem_block(const dem_block& demblocks);
~dem_block();
dem_block resample_dem();
//dem_block resample_dem_cudic();
int rowcol2blockids(int row_ids, int col_ids);
point getpointblock(int row_ids, int col_ids);
int setpointblock(int row_ids, int col_ids, point& value);
point getpointblock(int ids);
int setpointblock(int ids, point& value);
int UpdatePointCoodinarary();
VectorPoint getslopeVector(int row_ids, int col_ids);
public:
int all_start_row;
int all_start_col;
int start_row; // Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>к<EFBFBD>
int end_row; //
int start_col; // Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD>к<EFBFBD>
int end_col;
int height;
int width;
int size;
int sample_f;
point* pointblock; // ԭʼ<D4AD><CABC>
};
inline point bilineadInterpolation(point& p,point& p11,point& p12,point& p21,point& p22);
inline point cubicInterpolation(point& p, point& p11, point& p12,point& p13,point& p14, point& p21, point& p22,point& p23,point& p24,point& p31,point& p32,point& p33,point& p34,point& p41,point& p42,point& p43,point& p44);
/// <summary>
/// ˫<><CBAB><EFBFBD>Բ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
/// </summary>
/// <param name="p"></param>
/// <param name="p11"></param>
/// <param name="p12"></param>
/// <param name="p21"></param>
/// <param name="p22"></param>
/// <returns></returns>
inline point SARbilineadInterpolation(point& p, point& p11, point& p12, point& p21, point& p22) {
}
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
struct IncidenceAngle
{
long double incidenceAngle; // <20>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
long double localincidenceAngle; // <20>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
};
struct matchPoint {
long double r, c, ti;
long double land_x, land_y, land_z;
long double distance;
long double incidenceAngle, localincidenceAngle;
};
/// <summary>
/// ģ<><C4A3>sar <20>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD>ۼ<EFBFBD>ģ<EFBFBD><C4A3>Ĭ<EFBFBD><C4AC>ʹ<EFBFBD><CAB9>short <20><><EFBFBD><EFBFBD>(<28>ۼ<EFBFBD><DBBC><EFBFBD><EFBFBD>ޣ<EFBFBD>
/// </summary>
class sim_block {
public:
sim_block(int start_row,int end_row,int start_col,int end_col,int height,int width);
sim_block(const sim_block& sim_blocks);
~sim_block();
int rowcol2blockids(int row_ids, int col_ids);
short getsimblock(int row_ids, int col_ids);
int setsimblock(int row_ids,int col_ids, short value);
int addsimblock(int row_ids, int col_ids,short value);
matchPoint getpointblock(int row_ids,int col_ids);
int setpointblock(int row_ids, int col_ids, matchPoint value);
//
long double getdistanceblock(int row_ids, int col_ids);
int setdistanceblock(int row_ids, int col_ids, long double value);
public:
int start_row;
int end_row;
int start_col;
int end_col;
int height;
int width;
int size;
short* block;
long double* distanceblock;
matchPoint* pointblock;
};
/// <summary>
/// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAA3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EAA3AC><EFBFBD><EFBFBD><E6B7A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>״<EFBFBD><D7B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǻ;ֵ<CDBE><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/// </summary>
/// <param name="satellitepoint"><3E><><EFBFBD>ǿռ<C7BF><D5BC><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="landpoint"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <param name="slopvector"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD></param>
/// <returns><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD></returns>
inline IncidenceAngle calIncidence(point satellitepoint,point landpoint,VectorPoint slopvector) {
IncidenceAngle result;
VectorPoint R_ls = getVector(landpoint, satellitepoint);
result.localincidenceAngle = getVectorAngleValue(R_ls, slopvector);
VectorPoint R_s{ satellitepoint.x,satellitepoint.y,satellitepoint.z };
result.incidenceAngle = getVectorAngleValue(R_s, R_ls);
return result;
}
int SimProcessBlock(dem_block demblock, ParameterInFile paras, matchPoint* result_shared, int* Pcount);
int ResamplingSim(ParameterInFile paras);
int ResampleGDAL(const char* pszSrcFile, const char* pszOutFile, float fResX, float fResY, GDALResampleAlg eResample);
/// <summary>
/// ģ<><C4A3>sar<61>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>㷨ģ<E3B7A8>
/// Ϊ<>˿<EFBFBD><CBBF><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD>ȡ<EFBFBD><C8A1>
/// <20>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>8 --<2D>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>й<EFBFBD><D0B9><EFBFBD>--ʹ<>ö<EFBFBD><C3B6>еķ<D0B5><C4B7><EFBFBD>
/// <20>߳<EFBFBD><DFB3>ڴ棺dem_block_size*sample_f*sample_f< 1 G
/// </summary>
/// <param name="paras"><3E><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD></param>
/// <param name="thread_num"><3E>߳<EFBFBD><DFB3><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ8</param>
/// <returns>ִ<><D6B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
int SimProcess(ParameterInFile paras, int thread_num);
int SimProcess_LVY(ParameterInFile paras, int thread_num);
int WriteMatchPoint(string path, std::vector<matchPoint>* matchps);
// <20><><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD>ӿ<EFBFBD>
int testPTSN(ParameterInFile paras);
///
///
/// <20><><EFBFBD><EFBFBD>Ӱ<EFBFBD><D3B0><EFBFBD>IJ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
///
///
class ConvertResampleParameter {
public:
ConvertResampleParameter(string path);
ConvertResampleParameter(const ConvertResampleParameter& para);
~ConvertResampleParameter();
public:
string in_ori_dem_path;
string ori_sim;
string out_sar_xyz_path;
string out_sar_xyz_incidence_path;
string out_orth_sar_incidence_path;
string out_orth_sar_local_incidence_path;
string outFolder_path;
int file_count;
std::vector<string> inputFile_paths;
std::vector<string> outFile_paths;
std::vector<string> outFile_pow_paths;
int ori2sim_num;
long double* ori2sim_paras;
int sim2ori_num;
long double* sim2ori_paras;
};
inline int ori2sim(long double ori_x,long double ori_y,long double& sim_x,long double& sim_y,long double* conver_paras) {
long double xy = ori_x * ori_y;
long double x2 = ori_x * ori_x;
long double y2 = ori_y * ori_y;
sim_x = conver_paras[0] + ori_x * conver_paras[1] + ori_y * conver_paras[2] + x2 * conver_paras[3] + y2 * conver_paras[4] + xy * conver_paras[5];
sim_y = conver_paras[6] + ori_x * conver_paras[7] + ori_y * conver_paras[8] + x2 * conver_paras[9] + y2 * conver_paras[10] + xy * conver_paras[11];
return 1;
}
/// <summary>
/// <20><>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD>ת<EFBFBD><D7AA>ΪĿ<CEAA><C4BF><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD>
/// </summary>
/// <param name="sim_r">ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD></param>
/// <param name="sim_c">ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD></param>
/// <param name="ori_r"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>к<EFBFBD></param>
/// <param name="ori_c"><3E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF><EFBFBD>к<EFBFBD></param>
/// <param name="conver_paras"><3E><EFBFBD><E4BBBB><EFBFBD><EFBFBD></param>
/// <returns>Ĭ<>ϣ<EFBFBD>0 <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD></returns>
inline int sim2ori(long double sim_r,long double sim_c,long double& ori_r,long double& ori_c, long double* conver_paras) {
long double xy = sim_r * sim_c;
long double x2 = sim_r * sim_r;
long double y2 = sim_c * sim_c;
ori_r = conver_paras[0] + sim_r * conver_paras[1] + sim_c * conver_paras[2] + x2 * conver_paras[3] + y2 * conver_paras[4] + xy * conver_paras[5];
ori_c = conver_paras[6] + sim_r * conver_paras[7] + sim_c * conver_paras[8] + x2 * conver_paras[9] + y2 * conver_paras[10] + xy * conver_paras[11];
return 0;
}
// <20><>ѯ<EFBFBD><D1AF>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD>
point GetOriRC(point& landp, ParameterInFile& paras, ConvertResampleParameter& convparas);
int SimProcessBlock_CalXYZ(dem_block demblock, ParameterInFile paras, ConvertResampleParameter converParas, matchPoint* result_shared, int* Pcount);
int SimProcess_CalXYZ(ParameterInFile paras, ConvertResampleParameter conveparas, int thread_num);
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>˼·
dem->sim->ori(r,c) <-<EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD>-> ori
step1: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>dem <EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD> ori <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-> ori_sim.tif (r,c,incidence,localincidence)
step2: <EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD>a,b
*/
int SimProcess_Calsim2ori(ParameterInFile paras, ConvertResampleParameter conveparas, int thread_num); // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
/*
<EFBFBD>ز<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
step1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡĿ<EFBFBD><EFBFBD>դ<EFBFBD>񣬲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><EFBFBD>դ<EFBFBD>񴴽<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
step2:
*/
int SimProcess_ResamplingOri2Orth(ParameterInFile paras, ConvertResampleParameter conveparas, int thread_num);
/*
<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǿ<EFBFBD><EFBFBD>ͼ
*/
int SimProcess_Calspow(ParameterInFile paras, ConvertResampleParameter conveparas, int thread_num); // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>