All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ext.plantuml.com.ctreber.acearth.util.Coordinate Maven / Gradle / Ivy

There is a newer version: 1.2024.8
Show newest version
// THIS FILE HAS BEEN GENERATED BY A PREPROCESSOR.
/* +=======================================================================
 * |
 * |      PlantUML : a free UML diagram generator
 * |
 * +=======================================================================
 *
 * (C) Copyright 2009-2024, Arnaud Roques
 *
 * Project Info:  https://plantuml.com
 *
 * If you like this project or if you find it useful, you can support us at:
 *
 * https://plantuml.com/patreon (only 1$ per month!)
 * https://plantuml.com/liberapay (only 1€ per month!)
 * https://plantuml.com/paypal
 *
 *
 * PlantUML is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License V2.
 *
 * THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC
 * LICENSE ("AGREEMENT"). [GNU General Public License V2]
 *
 * ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES
 * RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
 *
 * You may obtain a copy of the License at
 *
 * https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * PlantUML can occasionally display sponsored or advertising messages. Those
 * messages are usually generated on welcome or error images and never on
 * functional diagrams.
 * See https://plantuml.com/professional if you want to remove them
 *
 * Images (whatever their format : PNG, SVG, EPS...) generated by running PlantUML
 * are owned by the author of their corresponding sources code (that is, their
 * textual description in PlantUML language). Those images are not covered by
 * this GPL v2 license.
 *
 * The generated images can then be used without any reference to the GPL v2 license.
 * It is not even necessary to stipulate that they have been generated with PlantUML,
 * although this will be appreciated by the PlantUML team.
 *
 * There is an exception : if the textual description in PlantUML language is also covered
 * by any license, then the generated images are logically covered
 * by the very same license.
 *
 * This is the IGY distribution (Install GraphViz by Yourself).
 * You have to install GraphViz and to setup the GRAPHVIZ_DOT environment variable
 * (see https://plantuml.com/graphviz-dot )
 *
 * Icons provided by OpenIconic :  https://useiconic.com/open
 * Archimate sprites provided by Archi :  http://www.archimatetool.com
 * Stdlib AWS provided by https://github.com/milo-minderbinder/AWS-PlantUML
 * Stdlib Icons provided https://github.com/tupadr3/plantuml-icon-font-sprites
 * ASCIIMathML (c) Peter Jipsen http://www.chapman.edu/~jipsen
 * ASCIIMathML (c) David Lippman http://www.pierce.ctc.edu/dlippman
 * CafeUndZopfli ported by Eugene Klyuchnikov https://github.com/eustas/CafeUndZopfli
 * Brotli (c) by the Brotli Authors https://github.com/google/brotli
 * Themes (c) by Brett Schwarz https://github.com/bschwarz/puml-themes
 * Twemoji (c) by Twitter at https://twemoji.twitter.com/
 *
 */
package ext.plantuml.com.ctreber.acearth.util;

import java.io.IOException;
import java.io.Writer;

/**
 * 

* Latitude and longitude coordinate. Can be used as declination and right * ascension as well. * *

* © 2002 Christian Treber, [email protected] * * @author Christian Treber, [email protected] * */ public class Coordinate { /* * MeanObliquity gives the mean obliquity of the earth's axis at epoch * 1990.0 (computed as 23.440592 degrees according to the method given in * duffett-smith, section 27) */ private static final double MEAN_OBLIQUITY = 23.440592 * Toolkit.TWOPI / 360; // Or DE private double fLat; // Or RA private double fLong; public Coordinate() { } /** *

* Construct a location specfied by two angles. Your choice if in degrees or * rads, but keep track! * * @param pLong * Longitude or RA * @param pLat * Latitude or DE */ public Coordinate(double pLat, double pLong) { fLat = pLat; fLong = pLong; } public void renderAsXML(Writer writer) throws IOException { writer.write("\n"); writer.write(" " + fLat + "\n"); writer.write(" " + fLong + "\n"); writer.write("\n"); } public Point3D getPoint3D() { final double lLatRad = Toolkit.degsToRads(fLat); final double lLongRad = Toolkit.degsToRads(fLong); final double lX = Math.cos(lLatRad) * Math.sin(lLongRad); final double lY = Math.sin(lLatRad); final double lZ = Math.cos(lLatRad) * Math.cos(lLongRad); return new Point3D(lX, lY, lZ); } /** *

* Assumes coordinate is not in degrees but rads. * * @return */ public Point3D getPoint3DRads() { final double lX = Math.cos(fLat) * Math.sin(fLong); final double lY = Math.sin(fLat); final double lZ = Math.cos(fLat) * Math.cos(fLong); return new Point3D(lX, lY, lZ); } /** *

* Convert from ecliptic to equatorial coordinates (after duffett-smith, * section 27) */ public Coordinate eclipticToEquatorial() { final double sin_e = Math.sin(MEAN_OBLIQUITY); final double cos_e = Math.cos(MEAN_OBLIQUITY); final double lRA = Math.atan2(Math.sin(fLong) * cos_e - Math.tan(fLat) * sin_e, Math.cos(fLong)); final double lDE = Math.asin(Math.sin(fLat) * cos_e + Math.cos(fLat) * sin_e * Math.sin(fLong)); return new Coordinate(lDE, lRA); } /** *

* Add position to this position, make sure coordinates are valid. */ public void add(Coordinate lOther) { fLat += lOther.fLat; fLong += lOther.fLong; wrap(); } /** *

* Warp coordinates exceeding valid values. Happens when latitudes and * longitudes are added or substracted. */ public void wrap() { if (fLat > 90) { fLat = 180 - fLat; fLong += 180; } else if (fLat < -90) { fLat = -180 - fLat; fLong += 180; } if (fLong > 180) { do { fLong -= 360; } while (fLong > 180); } else if (fLong < -180) { do { fLong += 360; } while (fLong < -180); } } public double getLat() { return fLat; } public double getDE() { return fLat; } public double getLong() { return fLong; } public double getRA() { return fLong; } public boolean check() { return (-90 <= fLat) && (fLat <= 90) && (-180 <= fLong) && (fLong <= 180); } public String toString() { return "lat: " + fLat + ", long: " + fLong; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy