Il semble qu'il n'y ait pas de processus simple pour ce faire. La meilleure méthode que j'ai trouvée est de convertir des coordonnées RAE en coordonnées SEZ, puis des coordonnées SEZ aux coordonnées ECR. Voici un code C# I modifié à C++ pour y parvenir:
void main() {
// NOTE: distances are in meters, while angles are in degrees
double siteECR[] = { -763997.48, -5458565.87, 3196706.0 };
double objRAE[] = { 30000.0, 310.0, 18.0 };
double objECR[] = { 0.0, 0.0, 0.0 };
// Should return ~[-764142.7629, -5458517.683, 3217218.18] in objECR
RAEtoECR(siteECR, objRAE, objECR);
}
/************************************************************************************************************************/
/* Converts a Range, Azimuth, Elevation location to a Latitude, Longitude, Altitude location */
/* siteLLA - array holding the Latitude, Longitude, and Altitude of the site location in degrees and meters */
/* rae - array holding the Range, Azimuth, and Elevation, in degrees, of the object viewed from the site location */
/* objECR - destination array to hold the ECR X, Y, Z location in meters */
/************************************************************************************************************************/
void RAEtoECR(double siteECR[], double rae[], double objECR[]) {
double tempSEZ[] = { 0.0, 0.0, 0.0 };
double siteLLA[] = { 0.0, 0.0, 0.0 };
ECRtoLLA(siteECR, siteLLA);
RAEtoSEZ(siteLLA, objRAE, tempSEZ);
SEZtoECR(siteLLA, tempSEZ, objECR);
}
/************************************************************************************************************************/
/* Converts a Range, Azimuth, Elevation location to a South, East, Zenith location */
/* siteLLA - array holding the Latitude, Longitude, and Altitude of the site location in degrees and meters */
/* rae - array holding the Range, Azimuth, and Elevation, in degrees, of the object viewed from the site location */
/* sez - destination array to hold the South, East, and Zenith coordinates of the object being viewed in meters */
/************************************************************************************************************************/
void RAEtoSEZ(double siteLLA[], double rae[], double sez[]) {
double range, azimuth, elevation;
range = rae[0];
azimuth = rae[1];
elevation = rae[2];
// Compute needed math
double slat = sin(Deg2Rad(siteLLA[0]));
double slon = sin(Deg2Rad(siteLLA[1]));
double clat = cos(Deg2Rad(siteLLA[0]));
double clon = cos(Deg2Rad(siteLLA[1]));
// Convert to radians
azimuth = DEG2RAD(azimuth);
elevation = DEG2RAD(elevation);
// Convert
sez[0] = -range * cos(elevation) * cos(azimuth);
sez[1] = range * cos(elevation) * sin(azimuth);
sez[2] = range * sin(elevation);
}
/************************************************************************************************************************/
/* Converts a South, East, Zenith location to an ECR X, Y, Z location */
/* siteLLA - array holding the Latitude, Longitude, and Altitude of the site location in degrees and meters */
/* sez - array holding the South, East, and Zenith coordinates of the object being viewed in meters */
/* ecr - destination array to hold the ECR X, Y, Z location in meters */
/************************************************************************************************************************/
void SEZtoECR(double siteLLA[], double sez[], double ecr[]) {
// Convert siteLLA to XYZ
double[] siteXYZ = { 0.0, 0.0, 0.0 };
LLAtoECR(siteLLA, siteXYZ);
double south, east, zenith;
south = sez[0];
east = sez[1];
zenith = sez[2];
// Compute needed math
double slat = sin(Deg2Rad(siteLLA[0]));
double slon = sin(Deg2Rad(siteLLA[1]));
double clat = cos(Deg2Rad(siteLLA[0]));
double clon = cos(Deg2Rad(siteLLA[1]));
// Convert
ecr[0] = (slat * clon * south) + (-slon * east) + (clat * clon * zenith) + siteXYZ[0];
ecr[1] = (slat * slon * south) + (clon * east) + (clat * slon * zenith) + siteXYZ[1];
ecr[2] = (-clat * south) + (slat * zenith) + siteXYZ[2];
}