private static Boolean isInsidePolygon(final GeoPoint point,final List<GeoPoint> polyPoints){
  final double latitude=point.getLatitude();
  final double longitude=point.getLongitude();
  final double sinLatitude=Math.sin(latitude);
  final double cosLatitude=Math.cos(latitude);
  final double sinLongitude=Math.sin(longitude);
  final double cosLongitude=Math.cos(longitude);
  double arcDistance=0.0;
  Double prevAngle=null;
  for (  final GeoPoint polyPoint : polyPoints) {
    final Double angle=computeAngle(polyPoint,sinLatitude,cosLatitude,sinLongitude,cosLongitude);
    if (angle == null) {
      return null;
    }
    if (prevAngle != null) {
      double angleDelta=angle - prevAngle;
      if (angleDelta < -Math.PI) {
        angleDelta+=Math.PI * 2.0;
      }
      if (angleDelta > Math.PI) {
        angleDelta-=Math.PI * 2.0;
      }
      if (Math.abs(angleDelta - Math.PI) < Vector.MINIMUM_RESOLUTION) {
        return null;
      }
      arcDistance+=angleDelta;
    }
    prevAngle=angle;
  }
  if (prevAngle != null) {
    final Double lastAngle=computeAngle(polyPoints.get(0),sinLatitude,cosLatitude,sinLongitude,cosLongitude);
    if (lastAngle == null) {
      return null;
    }
    double angleDelta=lastAngle - prevAngle;
    if (angleDelta < -Math.PI) {
      angleDelta+=Math.PI * 2.0;
    }
    if (angleDelta > Math.PI) {
      angleDelta-=Math.PI * 2.0;
    }
    if (Math.abs(angleDelta - Math.PI) < Vector.MINIMUM_RESOLUTION) {
      return null;
    }
    arcDistance+=angleDelta;
  }
  if (Math.abs(arcDistance) < Vector.MINIMUM_RESOLUTION) {
    return null;
  }
  return arcDistance > 0.0;
}

private static Boolean isInsidePolygon ( final GeoPoint point , final List < GeoPoint > polyPoints ) { final double latitude = point . getLatitude ( ) ; final double longitude = point . getLongitude ( ) ; final double sinLatitude = Math . sin ( latitude ) ; final double cosLatitude = Math . cos ( latitude ) ; final double sinLongitude = Math . sin ( longitude ) ; final double cosLongitude = Math . cos ( longitude ) ; double arcDistance = 0.0 ; Double prevAngle = null ; for ( final GeoPoint polyPoint : polyPoints ) { final Double angle = computeAngle ( polyPoint , sinLatitude , cosLatitude , sinLongitude , cosLongitude ) ; if ( angle == null ) { return null ; } if ( prevAngle != null ) { double angleDelta = angle - prevAngle ; if ( angleDelta < - Math . PI ) { angleDelta += Math . PI * 2.0 ; } if ( angleDelta > Math . PI ) { angleDelta -= Math . PI * 2.0 ; } if ( Math . abs ( angleDelta - Math . PI ) < Vector . MINIMUM_RESOLUTION ) { return null ; } arcDistance += angleDelta ; } prevAngle = angle ; } if ( prevAngle != null ) { final Double lastAngle = computeAngle ( polyPoints . get ( 0 ) , sinLatitude , cosLatitude , sinLongitude , cosLongitude ) ; if ( lastAngle == null ) { return null ; } double angleDelta = lastAngle - prevAngle ; if ( angleDelta < - Math . PI ) { angleDelta += Math . PI * 2.0 ; } if ( angleDelta > Math . PI ) { angleDelta -= Math . PI * 2.0 ; } if ( Math . abs ( angleDelta - Math . PI ) < Vector . MINIMUM_RESOLUTION ) { return null ; } arcDistance += angleDelta ; } if ( Math . abs ( arcDistance ) < Vector . MINIMUM_RESOLUTION ) { return null ; } return arcDistance > 0.0 ; }
for a specified point and a list of poly points , determine based on point order whether the point should be considered in or out of the polygon .
