cdm/src/main/java/ucar/unidata/geoloc/projection/RotatedPole.java
public LatLonPoint projToLatLon(ProjectionPoint ppt, LatLonPointImpl destPoint) {
    //	"x" and "y" input for rotated pole coords are actually a lon-lat pair
    final double lonR = LatLonPointImpl.range180( ppt.getX()); // LOOK guessing
    final double latR = ppt.getY();

    //	Lon-lat pair to xyz coordinates on sphere with radius 1
    double[] p0 = new double[]
            {Math.cos(latR * RAD_PER_DEG) * Math.cos(lonR * RAD_PER_DEG),
                    Math.cos(latR * RAD_PER_DEG) * Math.sin(lonR * RAD_PER_DEG),
                    Math.sin(latR * RAD_PER_DEG)};

    //	Inverse rotate around Y-axis (using transpose of Y matrix)
    double[] p1 = new double[]
            {rotY[0][0] * p0[0] + rotY[1][0] * p0[1] + rotY[2][0] * p0[2],
                    rotY[0][1] * p0[0] + rotY[1][1] * p0[1] + rotY[2][1] * p0[2],
                    rotY[0][2] * p0[0] + rotY[1][2] * p0[1] + rotY[2][2] * p0[2]};

    //	Inverse rotate around Z-axis (using transpose of Z matrix)
    double[] p2 = new double[]
            {rotZ[0][0] * p1[0] + rotZ[1][0] * p1[1] + rotZ[2][0] * p1[2],
                    rotZ[0][1] * p1[0] + rotZ[1][1] * p1[1] + rotZ[2][1] * p1[2],
                    rotZ[0][2] * p1[0] + rotZ[1][2] * p1[1] + rotZ[2][2] * p1[2]};

    final double lon = Math.atan2(p2[1], p2[0]) * DEG_PER_RAD;
    final double lat = Math.asin(p2[2]) * DEG_PER_RAD;

    if (destPoint == null)
      destPoint = new LatLonPointImpl(lat, lon);
    else
      destPoint.set(lat, lon);

    if (show)
       System.out.println("Proj= " + ppt+" latlon= " + destPoint);

    return destPoint;
  }
public LatLonPoint projToLatLon(ProjectionPoint ppt, LatLonPointImpl destPoint) {
    //	"x" and "y" input for rotated pole coords are actually a lon-lat pair
    final double lonR = LatLonPointImpl.range180( ppt.getX()); // LOOK guessing
    final double latR = ppt.getY();

    //	Lon-lat pair to xyz coordinates on sphere with radius 1
    double[] p0 = new double[]
            {Math.cos(latR * RAD_PER_DEG) * Math.cos(lonR * RAD_PER_DEG),
                    Math.cos(latR * RAD_PER_DEG) * Math.sin(lonR * RAD_PER_DEG),
                    Math.sin(latR * RAD_PER_DEG)};

    //	Inverse rotate around Y-axis (using transpose of Y matrix)
    double[] p1 = new double[]
            {rotY[0][0] * p0[0] + rotY[1][0] * p0[1] + rotY[2][0] * p0[2],
                    rotY[0][1] * p0[0] + rotY[1][1] * p0[1] + rotY[2][1] * p0[2],
                    rotY[0][2] * p0[0] + rotY[1][2] * p0[1] + rotY[2][2] * p0[2]};

    //	Inverse rotate around Z-axis (using transpose of Z matrix)
    double[] p2 = new double[]
            {rotZ[0][0] * p1[0] + rotZ[1][0] * p1[1] + rotZ[2][0] * p1[2],
                    rotZ[0][1] * p1[0] + rotZ[1][1] * p1[1] + rotZ[2][1] * p1[2],
                    rotZ[0][2] * p1[0] + rotZ[1][2] * p1[1] + rotZ[2][2] * p1[2]};

    final double lon = Math.atan2(p2[1], p2[0]) * DEG_PER_RAD;
    final double lat = Math.asin(p2[2]) * DEG_PER_RAD;

    if (destPoint == null)
      destPoint = new LatLonPointImpl(lat, lon);
    else
      destPoint.set(lat, lon);

    if (show)
       System.out.println("Proj= " + ppt+" latlon= " + destPoint);

    return destPoint;
  }
public LatLonPoint projToLatLon ( ProjectionPoint ppt , LatLonPointImpl destPoint ) { //	"x" and "y" input for rotated pole coords are actually a lon-lat pair
 final double lonR = LatLonPointImpl . range180 ( ppt . getX ( ) ) ; // LOOK guessing
 final double latR = ppt . getY ( ) ; //	Lon-lat pair to xyz coordinates on sphere with radius 1
 double [ ] p0 = new double [ ] { Math . cos ( latR * RAD_PER_DEG ) * Math . cos ( lonR * RAD_PER_DEG ) , Math . cos ( latR * RAD_PER_DEG ) * Math . sin ( lonR * RAD_PER_DEG ) , Math . sin ( latR * RAD_PER_DEG ) } ; //	Inverse rotate around Y-axis (using transpose of Y matrix)
 double [ ] p1 = new double [ ] { rotY [ 0 ] [ 0 ] * p0 [ 0 ] + rotY [ 1 ] [ 0 ] * p0 [ 1 ] + rotY [ 2 ] [ 0 ] * p0 [ 2 ] , rotY [ 0 ] [ 1 ] * p0 [ 0 ] + rotY [ 1 ] [ 1 ] * p0 [ 1 ] + rotY [ 2 ] [ 1 ] * p0 [ 2 ] , rotY [ 0 ] [ 2 ] * p0 [ 0 ] + rotY [ 1 ] [ 2 ] * p0 [ 1 ] + rotY [ 2 ] [ 2 ] * p0 [ 2 ] } ; //	Inverse rotate around Z-axis (using transpose of Z matrix)
 double [ ] p2 = new double [ ] { rotZ [ 0 ] [ 0 ] * p1 [ 0 ] + rotZ [ 1 ] [ 0 ] * p1 [ 1 ] + rotZ [ 2 ] [ 0 ] * p1 [ 2 ] , rotZ [ 0 ] [ 1 ] * p1 [ 0 ] + rotZ [ 1 ] [ 1 ] * p1 [ 1 ] + rotZ [ 2 ] [ 1 ] * p1 [ 2 ] , rotZ [ 0 ] [ 2 ] * p1 [ 0 ] + rotZ [ 1 ] [ 2 ] * p1 [ 1 ] + rotZ [ 2 ] [ 2 ] * p1 [ 2 ] } ; final double lon = Math . atan2 ( p2 [ 1 ] , p2 [ 0 ] ) * DEG_PER_RAD ; final double lat = Math . asin ( p2 [ 2 ] ) * DEG_PER_RAD ; if ( destPoint == null ) destPoint = new LatLonPointImpl ( lat , lon ) ; else destPoint . set ( lat , lon ) ; if ( show ) System . out . println ( "Proj= " + ppt + " latlon= " + destPoint ) ; return destPoint ; }
Transform a rotated longitude (X) and rotated latitude (Y) into a "real"
longitude-latitude pair.
Transform a rotated longitude ( X ) and rotated latitude ( Y ) into a real longitude - latitude pair .