class Sinusoidal extends AbstractProjection {

  @Override
  public LatLonRect projToLatLonBB(ProjectionRect projBB) {
    List<ProjectionPoint> pointsOfInterest = new LinkedList<>();

    ProjectionPoint northPole = latLonToProj(LatLonPoint.create(90, 0));
    if (projBB.contains(northPole)) {
      pointsOfInterest.add(northPole);
    }

    ProjectionPoint southPole = latLonToProj(LatLonPoint.create(-90, 0));
    if (projBB.contains(southPole)) {
      pointsOfInterest.add(southPole);
    }

    if (pointsOfInterest.size() == 2) { // projBB contains both north and south poles, and thus, the entire map.
      return new LatLonRect();
    }

    List<ProjectionPoint> corners = Arrays.asList(projBB.getLowerLeftPoint(), projBB.getLowerRightPoint(),
        projBB.getUpperLeftPoint(), projBB.getUpperRightPoint());

    for (ProjectionPoint corner : corners) {
      if (projToLatLon(corner) != INVALID) {
        pointsOfInterest.add(corner);
      }
    }

    pointsOfInterest.addAll(getMapEdgeIntercepts(projBB));

    return makeLatLonRect(pointsOfInterest);
  }

  public  Sinusoidal();
  public  Sinusoidal(double centMeridian, double false_easting, double false_northing, double radius);

}