// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.data.projection.proj;
import static java.lang.Math.abs;
import static java.lang.Math.cos;
import static java.lang.Math.sin;
import static java.lang.Math.sqrt;
import static org.openstreetmap.josm.tools.I18n.tr;
import org.openstreetmap.josm.data.Bounds;
/**
* Sinusoidal projection (aka. Sanson–Flamsteed, Mercator equal-area projection)
* <p>
* This class has been derived from the implementation of the <a href="https://github.com/geotools/geotools">Geotools</a> project;
* git 577dd2d, org.geotools.referencing.operation.projection.Sinusoidal at the time of migration.
*/
public class Sinusoidal extends AbstractProj {
@Override
public String getName() {
return tr("Sinusoidal");
}
@Override
public String getProj4Id() {
return "sinu";
}
@Override
public double[] project(final double phi, final double lambda) {
if (spherical) {
return new double[]{lambda * cos(phi), phi};
} else {
final double s = sin(phi);
return new double[]{lambda * cos(phi) / sqrt(1. - e2 * s * s), mlfn(phi, s, cos(phi))};
}
}
@Override
public double[] invproject(final double east, final double north) {
if (spherical) {
return new double[]{north, east / cos(north)};
} else {
final double phi = invMlfn(north);
double s = abs(phi);
final double lambda;
if (abs(s - Math.PI / 2) < 1e-10) {
lambda = 0.;
} else if (s < Math.PI / 2) {
s = sin(phi);
lambda = (east * sqrt(1. - e2 * s * s) / cos(phi)) % Math.PI;
} else {
return new double[]{0., 0.}; // this is an error and should be handled somehow
}
return new double[]{phi, lambda};
}
}
@Override
public Bounds getAlgorithmBounds() {
return new Bounds(-90, -180, 90, 180, false);
}
}