构造Delaunay三⾓形⽹格(代码整理)package;
import Color;
import Font;
import Graphics2D;
import Point;
import Point2D;
public abstract class  Coordinate  {
//投影⽅式
public static int    LAMBERT    =1;
public static int    MERCATOR    =2;
public static int    BBQ        =3;
public static int    NBQ        =4;
public static int    LINEAR      =5;
public static int    POLAR      =6;
//静态常量,地球半径,来源:《⼤⽓科学常⽤公式》,P601,附录
public static double  RADIUS        =6371.004;//地球平均半径,单位:公⾥(Km)。
public static double  RADIUS_POLAR  =6356.755;//地球两极半径,单位:公⾥(Km)。
public static double  RADIUS_EQUATOR =6373.140;//地球⾚道半径,单位:公⾥(Km)。
//标准经纬度(0.0<=longitude<=360, -90.0<=latitude<=90.0)
protected  Point2D.Double    standard;//兰勃特、极射⾚⾯投影⽤到
//中⼼经纬度(0.0<=longitude<=360, -90.0<=latitude<=90.0),⽤于定位,不⼀定是中⼼
protected  Point2D.Double    center;
/
/中⼼经纬度对应的屏幕坐标
protected  Point            place;
//偏移
protected  Point            offset;
//缩放⽐例(⾮0正值,经向纬向可以不同)
protected  Point2D.Double    scaleXY;
//缩放系数
protected double              scale;
protected double              scaleOriginal;
public int  type    =-1;
/**
* 功能:
*      获得标准经纬度
* 参数:
*      ⽆
* 返回值:
*      标准经纬度
*/
public  Point2D.Double getStandard (){
return( standard );
}
/**
* 功能:
*      获得中⼼经纬度
* 参数:
*      ⽆
* 返回值:
*      中⼼经纬度
*/
public  Point2D.Double getCenter (){
return( center );
return( center );
}
/
**
* 功能:
*      获得中⼼经纬度对应的屏幕坐标
* 参数:
*      ⽆
* 返回值:
*      中⼼经纬度对应的屏幕坐标
*/
public  Point getPlace (){
return( place );
}
/
**
* 功能:
*      获得缩放系数
* 参数:
*      ⽆
* 返回值:
*      缩放系数
*/
public double  getScale (){
return( scale );
}
/
**
* 功能:
*      获得缩放⽐例
* 参数:我的心似海洋
*      ⽆
* 返回值:
*      缩放⽐例
*/
public  Point2D.Double getScaleXY (){
return( scaleXY );
}
/
**
失恋标签* 功能:
*      放⼤
* 参数:
*      ⽆
* 返回值:
*      ⽆
*/
public void  zoomIn (){
scale  = scale *  2.0;
}
/
**
* 功能:
*      缩⼩
* 参数:
*      ⽆
* 返回值:
*      ⽆
*/
public void  zoomOut (){
scale  = scale /  2.0;
}
/
**
* 功能:
*      复原
* 参数:
*      ⽆
* 返回值:
*      ⽆
*/
public void  revert (){
scale  = scaleOriginal;
}
/
*
//======================================================================
//  以下为抽象⽅法定义,具体实现由继承类来完成。
//======================================================================
*/
/**
* 功能:
*      获得屏幕坐标
* 参数:
*      lon    - 经度
*      lat    - 纬度
* 返回值:
*      屏幕坐标
*/
public abstract  Point getPosition (double  lon,double  lat );
/**
* 功能:
*      获得屏幕坐标对应的经纬度
* 参数:
*      x      - 屏幕⽔平坐标
*      y      - 屏幕垂直坐标
* 返回值:
*      对应的经纬度
*/
public abstract  Point2D.Double getCoordinate (int  x,int  y );
/**
* 功能:
*      获得⾓度(不同投影含义不同)
* 参数:
*      lon - ⽔平坐标
*      lat - 垂直坐标
* 返回值:
*      ⾓度值
*/
//Lambert、Stereogram、Polar类需要重载此⽅法,Linear、Mercator类直接返回0。
public double  getAngle (double  lon,double  lat ){
return(0.0);
}
/**
* 功能:
*      画经线、纬线
* 参数:
*      g      - 图形设备
*      f      - 字体
*      c      - 画线颜⾊
*      inc_lon - 经线间隔
*      inc_lat - 纬线间隔
* 返回值:
*      ⽆
*/
public abstract void  drawGridLine ( Graphics2D g, Font f, Color c,int  inc_lon,int  inc_lat ); }
/**
*
*/
package;
import Color;
import Font;
import FontMetrics;
import Graphics2D;
import Point;
import Point2D;
import Point2D;
import DecimalFormat;
public class Linear extends  Coordinate{
/**
* 功能:
*      重置参数
* 参数:
*      lon,lat    - 中⼼经纬度,
*      px,py      - 中⼼经纬度对应的屏幕坐标
*      sx,sy      - 缩放系数
* 返回值:
*      ⽆
*/
public void  reset (double  lon,double  lat,int  px,int  py,double  sc,double  sx,double  sy ){
type            = Coordinate.LINEAR;
center          =new  Point2D.Double (
lon <0.0?0.0: lon >360.0?360.0: lon,
lat <-90.0?-90.0: lat >90.0?90.0: lat
);
place          =new  Point ( px, py );
scaleXY        =new  Point2D.Double ( sx==0.0?1.0:Math.abs ( sx ), sy==0.0?1.0:Math.abs ( sy ));        scale          = Math.abs ( sc );
scaleOriginal  = scale;
offset          =new  Point (0,0);//未⽤
}
/**
* 功能:
*      构造函数
* 参数:
*      ⽆(使⽤缺省值)
* 返回值:
*      ⽆
*/
public  Linear (){
reset (109.40,24.35,640,480,1.0,10.0,10.0);
}
/**
* 功能:
*      构造函数爱的太沉醉
* 参数:
*      lon,lat    - 中⼼经纬度,
*      px,py      - 中⼼经纬度对应的屏幕坐标
*      sc          - 缩放系数
* 返回值:
*      ⽆王子 张栋梁
*/
public  Linear (double  lon,double  lat,int  px,int  py,double  sc ){
reset ( lon, lat, px, py, sc,10.0*sc,10.0*sc );
}
/**
雪的梦幻* 功能:
*      构造函数
* 参数:
*      lon,lat    - 中⼼经纬度,
*      px,py      - 中⼼经纬度对应的屏幕坐标
*      sx,sy      - 缩放⽐例
* 返回值:
*      ⽆
*/
public  Linear (double  lon,double  lat,int  px,int  py,double  sx,double  sy ){
reset ( lon, lat, px, py,1.0, sx, sy );
}
/**
* 功能:
*      重置参数
* 参数:
*      lon,lat    - 中⼼经纬度,
*      lon,lat    - 中⼼经纬度,
*      px,py      - 中⼼经纬度对应的屏幕坐标
*      sx,sy      - 缩放系数
* 返回值:
*      ⽆
*/
public void  reset (double  lon,double  lat,int  px,int  py,double  sx,double  sy ){        reset ( lon, lat, px, py,1.0, sx, sy );
}
/**
* 功能:
*      获得屏幕坐标
* 参数:
*      lon    - 经度
*      lat    - 纬度
* 返回值:
袁咏仪公审张智霖*      屏幕坐标
*/
public  Point getPosition (double  lon,double  lat ){
return(
new  Point (
place.x +(int)(0.5+( lon - center.x )* scale * scaleXY.x ),
place.y +(int)(0.5+( center.y - lat )* scale * scaleXY.y )
)
);
}
/**
* 功能:
*      获得屏幕坐标对应的经纬度
* 参数:
*      x      - 屏幕⽔平坐标
*      y      - 屏幕垂直坐标
* 返回值:
*      对应的经纬度
*/
public  Point2D.Double getCoordinate (int  x,int  y ){
return(
new  Point2D.Double (
center.x +( x - place.x )/ scale / scaleXY.x,
center.y +( place.y - y )/ scale / scaleXY.y
)
);
}
/**
* 功能:
*      画经线、纬线
* 参数:
*      g      - 图形设备
*      f      - 字体
*      c      - 画线颜⾊
*      inc_lon - 经线间隔
*      inc_lat - 纬线间隔
* 返回值:
*      ⽆
*/
public void  drawGridLine ( Graphics2D g, Font f, Color c,int  inc_lon,int  inc_lat ){
DecimalFormat  df  =new  DecimalFormat ("0.#");
Color  saveColor  = g.getColor ();
Font    saveFont    = g.getFont ();
g.setColor ( c );
g.setFont (null==f?f:new  Font ("Times New Roman", Font.PLAIN,12));
FontMetrics fm  = g.getFontMetrics ();
String      text;
byte        tmpByte [];
int          bytesWidth, bytesHeight = fm.getHeight ();;
Point      pos1, pos2;
if(  inc_lon >0){