// **********************************************************************
//
// <copyright>
//
// BBN Technologies
// 10 Moulton Street
// Cambridge, MA 02138
// (617) 873-8000
//
// Copyright (C) BBNT Solutions LLC. All rights reserved.
//
// </copyright>
// **********************************************************************
//
// $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/omGraphics/OMCircle.java,v $
// $RCSfile: OMCircle.java,v $
// $Revision: 1.10 $
// $Date: 2009/01/21 01:24:41 $
// $Author: dietrick $
//
// **********************************************************************
package com.bbn.openmap.omGraphics;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.io.Serializable;
import java.util.ArrayList;
import com.bbn.openmap.proj.GeoProj;
import com.bbn.openmap.proj.Length;
import com.bbn.openmap.proj.coords.LatLonPoint;
/**
* Graphic object that represents a circle or an ellipse.
* <p>
* <h3>NOTE:</h3>
* See the <a href="../proj/GeoProj.html#poly_restrictions">
* RESTRICTIONS </a> on Lat/Lon polygons/polylines which apply to circles as
* well. Not following the guidelines listed may result in ambiguous/undefined
* shapes! Similar assumptions apply to the other vector graphics that we
* define: polys, rects, lines.
* <p>
* We currently do not allow LatLon ellipses, only XY.
* <p>
* These assumptions are virtually the same as those on the more generic OMPoly
* graphic type.
* <p>
*
* @see OMPoly
*/
public class OMCircle extends OMArc implements Serializable {
/**
* The simplest constructor for an OMCircle, and it expects that all fields
* will be filled in later. Rendertype is RENDERTYPE_UNKNOWN.
*/
public OMCircle() {
super();
}
/**
* Create a OMCircle, positioned with a lat-lon center and x-y axis.
* Rendertype is RENDERTYPE_OFFSET.
*
* @param latPoint latitude of center point, decimal degrees
* @param lonPoint longitude of center point, decimal degrees
* @param w horizontal diameter of circle/ellipse, pixels
* @param h vertical diameter of circle/ellipse, pixels
*/
public OMCircle(double latPoint, double lonPoint, int w, int h) {
this(latPoint, lonPoint, 0, 0, w, h);
}
/**
* Create a OMCircle, positioned with a x-y center with x-y axis. Rendertype
* is RENDERTYPE_XY.
*
* @param x1 window position of center point from left of window, in pixels
* @param y1 window position of center point from top of window, in pixels
* @param w horizontal diameter of circle/ellipse, pixels
* @param h vertical diameter of circle/ellipse, pixels
*/
public OMCircle(int x1, int y1, int w, int h) {
super(x1, y1, w, h, 0f, 360f);
}
/**
* Create a OMCircle, positioned at a Lat-lon location, x-y offset, x-y
* axis. Rendertype is RENDERTYPE_OFFSET.
*
* @param latPoint latitude of center of circle/ellipse.
* @param lonPoint longitude of center of circle/ellipse.
* @param offset_x1 # pixels to the right the center will be moved from
* lonPoint.
* @param offset_y1 # pixels down that the center will be moved from
* latPoint.
* @param w horizontal diameter of circle/ellipse, pixels.
* @param h vertical diameter of circle/ellipse, pixels.
*/
public OMCircle(double latPoint, double lonPoint, int offset_x1,
int offset_y1, int w, int h) {
super(latPoint, lonPoint, offset_x1, offset_y1, w, h, 0f, 360f);
}
/**
* Creates an OMCircle with a Lat-lon center and a lat-lon axis. Rendertype
* is RENDERTYPE_LATLON.
*
* @param latPoint latitude of center point, decimal degrees
* @param lonPoint longitude of center point, decimal degrees
* @param radius distance in decimal degrees (converted to radians
* internally).
*/
public OMCircle(double latPoint, double lonPoint, double radius) {
this(latPoint, lonPoint, radius, Length.DECIMAL_DEGREE, -1);
}
/**
* Create an OMCircle with a lat/lon center and a physical distance radius.
* Rendertype is RENDERTYPE_LATLON.
*
* @param latPoint latitude of center of circle in decimal degrees
* @param lonPoint longitude of center of circle in decimal degrees
* @param radius distance
* @param units com.bbn.openmap.proj.Length object.
*/
public OMCircle(double latPoint, double lonPoint, double radius,
Length units) {
this(latPoint, lonPoint, radius, units, -1);
}
/**
* Create an OMCircle with a lat/lon center and a physical distance radius.
* Rendertype is RENDERTYPE_LATLON.
*
* @param latPoint latitude of center of circle in decimal degrees
* @param lonPoint longitude of center of circle in decimal degrees
* @param radius distance
* @param units com.bbn.openmap.proj.Length object specifying units.
* @param nverts number of vertices for the poly-circle (if < 3, value is
* generated internally)
*/
public OMCircle(double latPoint, double lonPoint, double radius,
Length units, int nverts) {
this(new LatLonPoint.Double(latPoint, lonPoint), radius, units, nverts);
}
/**
* Create an OMCircle with a lat/lon center and a physical distance radius.
* Rendertype is RENDERTYPE_LATLON.
*
* @param center LatLon center of circle
* @param radius distance
* @param units com.bbn.openmap.proj.Length object specifying units for
* distance.
* @param nverts number of vertices for the poly-circle(if < 3, value is
* generated internally)
*/
public OMCircle(LatLonPoint center, double radius, Length units, int nverts) {
super(center, radius, units, nverts, 0f, 360f);
}
/**
* Helper function that helps the generate method figure out if the center
* point should be in the generate shape - if it's not, the code knows that
* there is a problem with the poles, and the polar correction code needs to
* be run.
*/
protected boolean shouldCenterBeInShape() {
return true;
}
/**
* An internal method designed to fetch the Shape to be used for an XY or
* OFFSET OMCircles. This method is smart enough to take the calculated
* position information and make a call to Ellipse2D.Float.
*/
protected Shape createArcShape(float x, float y, float fwidth, float fheight) {
return new Ellipse2D.Float(x, y, fwidth, fheight);
}
/**
* An internal method designed to fetch the ArrayList for LATLON OMCircles.
* This method is smart enough to take the calculated position information
* and make a call to Projection.forwardCircle.
*/
protected ArrayList<float[]> getCoordLists(GeoProj proj, LatLonPoint center,
float radius, int nverts) {
return proj.forwardCircle(center, /* radians */
true, radius, nverts, !isClear(fillPaint));
}
public boolean hasLineTypeChoice() {
return false;
}
}