/*
 
* 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;
    
}

}