void ConvertElevationRotationDegToXYZAngleRad( const sal_Int16 nElevationDeg, const sal_uInt16 nRotationDeg, double& rfXAngleRad, double& rfYAngleRad, double& rfZAngleRad) { // issue 72994, description of algorithm see there // The function expects -90<=nElevationDeg<=90 and 0<=nRotationDeg<=360 // The function delivers -F_PI<=rfXAngleRad<=F_PI, -F_PI<=frZAngleRad<=F_PI and // -F_PI/2<=rfZAngleRad<=F_PI/2 double fElevationRad = F_PI*nElevationDeg/180; //elev in description double fRotationRad = F_PI*nRotationDeg/180; //azi in description double ftanRotationMultSinElevation = 0.0; //initial value is dummy double fCosYAngle = 0.0; // initial value is dummy if (nRotationDeg == 90 || nRotationDeg == 270) { //case tan(fRotationRad) not defined rfZAngleRad = F_PI/2; rfXAngleRad = F_PI - fRotationRad; rfYAngleRad = rfXAngleRad - fElevationRad; } else { // Do I need ::rtl::math::? ftanRotationMultSinElevation = ::rtl::math::tan(fRotationRad) * ::rtl::math::sin(fElevationRad); rfZAngleRad = atan(ftanRotationMultSinElevation); fCosYAngle = ::rtl::math::cos(fRotationRad)/::rtl::math::cos(rfZAngleRad); // Should be in [-1.0; 1.0]. Might it be outside because of rounding // errors? Set default values, for security reason. if (fCosYAngle < -1.0) { fCosYAngle = -1.0; } else if (fCosYAngle > 1.0) { fCosYAngle = 1.0; }; rfYAngleRad = (nRotationDeg<=180)? acos(fCosYAngle) : -acos(fCosYAngle); if (::rtl::math::sin(rfYAngleRad)!=0.0) { rfXAngleRad = atan( ftanRotationMultSinElevation/::rtl::math::sin(rfYAngleRad)); } else // several special cases, see description in issue 72994 { if ((nRotationDeg == 0) || (nRotationDeg == 360)) { rfXAngleRad=fElevationRad; //rfYAngleRad=0.0 and rfZAngleRad=0.0 done above } else { if (nRotationDeg==180) { rfXAngleRad=-fElevationRad; //rfYAngleRad=F_PI and rfZAngleRad=0.0 done above } else { if ((nElevationDeg==90) || (nElevationDeg==-90)) { if ((0<=nRotationDeg) && (nRotationDeg<=90)) { rfXAngleRad = fElevationRad; rfYAngleRad = 0.0; rfZAngleRad = (nElevationDeg==90)? fRotationRad : -fRotationRad; } else if ((90