/*
* Copyright (c) 2016 Metron, Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of Metron, Inc. nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL METRON, INC. BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.metsci.glimpse.charts.shoreline;
import com.metsci.glimpse.util.geo.datum.DatumWgs84;
import com.metsci.glimpse.util.units.Angle;
/**
* LandVertex is a bare-bones lat/lon class, lacking most nice features
* of LatLon. It is necessary because LatLons normalize themselves, which
* causes land polygons to wrap poorly around the 180 degree longitude line.
*
* Lat and lon are stored in unnormalized degrees.
*
* @author hogye
*/
public class LandVertex
{
private static final double distancePerDegree_SU = Math.PI * DatumWgs84.Constants.meanRadius / 180.0;
public final double lat;
public final double lon;
public LandVertex( double lat_DEG, double lon_DEG )
{
lat = lat_DEG;
lon = lon_DEG;
}
/**
* Returns signed east-west distance from this vertex to the given
* longitude.
*
* The latitude of this vertex is used in converting longitudinal
* degrees to distance.
*/
public double getDistanceX_SU( double longitude )
{
return ( longitude - lon ) * Math.cos( Angle.degreesToRadians( lat ) ) * distancePerDegree_SU;
}
public double getDistanceX_SU( LandVertex vertex )
{
return getDistanceX_SU( vertex.lon );
}
/**
* Returns signed north-south distance from this vertex to the given
* latitude.
*/
public double getDistanceY_SU( double latitude )
{
return ( latitude - lat ) * distancePerDegree_SU;
}
public double getDistanceY_SU( LandVertex vertex )
{
return getDistanceY_SU( vertex.lat );
}
@Override
public boolean equals( Object o )
{
if ( o == this ) return true;
if ( ! ( o instanceof LandVertex ) ) return false;
LandVertex v = ( LandVertex ) o;
return v.lat == lat && v.lon == lon;
}
@Override
public int hashCode( )
{
long a = Double.doubleToLongBits( lat );
int a1 = ( int ) ( a & 0xffffff );
int a2 = ( int ) ( ( a >> 32 ) & 0xffffff );
long b = Double.doubleToLongBits( lon );
int b1 = ( int ) ( b & 0xffffff );
int b2 = ( int ) ( ( b >> 32 ) & 0xffffff );
int hash = getClass( ).getName( ).hashCode( );
hash = 31 * hash + a1;
hash = 31 * hash + a2;
hash = 31 * hash + b1;
hash = 31 * hash + b2;
return hash;
}
}