class CheapAngleMeter {

  public double calcAngle( int lon0, int lat0,  int lon1, int lat1, int lon2, int lat2 )
  {
    double[] lonlat2m = CheapRuler.getLonLatToMeterScales( lat1 );
    double lon2m = lonlat2m[0];
    double lat2m = lonlat2m[1];
    double dx10 = (lon1 - lon0) * lon2m;
    double dy10 = (lat1 - lat0) * lat2m;
    double dx21 = (lon2 - lon1) * lon2m;
    double dy21 = (lat2 - lat1) * lat2m;

    double dd = Math.sqrt( (dx10*dx10 + dy10*dy10)*(dx21*dx21 + dy21*dy21) );
    if ( dd == 0. ) { cosangle = 1.; return 0.; }
    double sinp = (dy10*dx21 - dx10*dy21)/dd;
    double cosp = (dy10*dy21 + dx10*dx21)/dd;
    cosangle = cosp;

    double offset = 0.;
    double s2 = sinp*sinp;
    if ( s2 > 0.5 )
    {
      if ( sinp > 0. )
      {
        offset = 90.;
        sinp = -cosp;
      }
      else
      {
        offset = -90.;
        sinp = cosp;
      }
      s2 = cosp*cosp;
    }
    else if ( cosp < 0. )
    {
      sinp = -sinp;
      offset = sinp > 0. ? -180. : 180.;
    }
    return offset + sinp * ( 57.4539 + s2 * ( 9.57565 + s2 * ( 4.30904 + s2 * 2.56491 ) ) );
  }

}