这是简单的线性数学。您将遇到的主要问题是您的游戏坐标系可能会沿一个或多个轴反转。您可能需要沿应用的纬度 (Y) 轴反转方向。除此之外,它只是一个简单的比例转换。既然您说这是真实地点的地图,您应该能够轻松找出地图所覆盖的最小\最大经度\纬度。取这两个值之差的绝对值,然后除以地图在每个方向上的宽度\高度。这将是每个地图单位值的纬度变化。存储这个值,应该很容易在两个单位之间进行双向转换。制作抽象细节的函数,无论哪种方式计算都应该没有问题。
我假设您已经能够检索 GPS 坐标 OK。
编辑:通过简单的线性数学,我的意思是这样的(这是 C++ 风格的伪代码,完全未经测试;在现实世界的例子中,常量都将是成员变量):
define('MAP_WIDTH', 1000);
define('MAP_HEIGHT', 1000);
define('MIN_LON', 25.333);
define('MIN_LAT', 20.333);
define('MAX_LON', 27.25);
define('MAX_LAT', 20.50);
class CoordConversion {
float XScale=abs(MAX_LON-MIN_LON)/MAP_WIDTH;
float YScale=abs(MAX_LAT-MIN_LAT)/MAP_HEIGHT;
int LonDir = MIN_LON<MAX_LON?1:-1;
int LatDir = MIN_LAT<MAX_LAT?1:-1;
public static float GetXFromLon(float lon) {
return (this.LonDir>0?(lon-MIN_LON):(lon-MAX_LON))*this.XScale;
}
public static float GetYFromLat(float lat) {
return (this.LatDir >0?(lat-MIN_LAT):(lat-MAX_LAT))*this.YScale;
}
public static float GetLonFromX(float x) {
return (this.LonDir>0?MIN_LON:MAX_LON)+(x/this.XScale);
}
public static float GetLatFromY(float y) {
return (this.LonDir>0?MIN_LAT:MAX_LAT)+(y/this.YScale);
}
}
EDIT2:在地图旋转的情况下,您需要使用地图上实际显示的最小和最大 lon\lat。您还需要在转换后旋转每个点。我什至不会试图把它从我的脑海中浮出水面,但我可以给你你需要的代码:
POINT rotate_point(float cx,float cy,float angle,POINT p)
{
float s = sin(angle);
float c = cos(angle);
// translate point back to origin:
p.x -= cx;
p.y -= cy;
// rotate point
float xnew = p.x * c - p.y * s;
float ynew = p.x * s + p.y * c;
// translate point back:
p.x = xnew + cx;
p.y = ynew + cy;
}
这将需要在返回游戏点时完成,并且在使用游戏点转换为纬度/经度点之前需要反向完成。
EDIT3:获取地图坐标的更多帮助。首先在谷歌地图上找到城市或任何城市。然后,您可以右键单击地图上的最高点(最北端)并找到最高经度。对所有四个基本方向重复此操作,您应该已设置好。