构造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;
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){
发布评论