VC++开发GIS系统(49)屏幕坐标转换编码

在前一篇文章《VC++开发GIS系统(48)屏幕坐标转换原理》中我介绍了关于MFC中的默认坐标和GIS系统中平面坐标的关系,并且推导了转换公式,如下:

MFC坐标转换自定义笛卡尔坐标

a1 = lbx + a*s
b1 = lby + (h - b)*s

自定义笛卡尔坐标转换MFC坐标

a = (a1 - lbx)/s
b = h - (b1 - lby)/s

本文中将在系统中编码实现这个转换。

新建malaScreen的结构体

在文章《VC++开发GIS系统(33)基本GIS系统中点单元的结构体》中我创建了点的结构体,同样这里需要新增一个记录屏幕的结构体,用于记录在文章《VC++开发GIS系统(48)屏幕坐标转换原理》中介绍的关于屏幕转换的参数。代码如下:

//屏幕坐标系
typedef struct
{
    double scale;   //比例尺
    double lbx; //屏幕左下角的横坐标
    double lby; //屏幕左下角的纵坐标
    int wScreen;    //屏幕宽
    int hScreen;    //屏幕高
}malaScreen;

坐标转换函数实现

坐标转换属于基础的操作,所以将代码写在了malaBase这个模块中。代码如下:

_malaBase.h
/*
* 屏幕坐标转换函数
*/

void malabasedll ScreenToCoord(long inX,long inY,malaScreen pScreen,double *outX,double *outY);//屏幕坐标系转换为平面坐标系
void malabasedll CoordToScreen(double inX, double inY, malaScreen pScreen, long *outX, long *outY);//平面坐标系转换为屏幕坐标系

_malaBase.cpp

//屏幕坐标系转换为平面坐标系
void malabasedll ScreenToCoord(long inX, long inY, malaScreen pScreen, double *outX, double *outY)
{
    *outX = pScreen.lbx + inX*pScreen.scale;
    *outY = pScreen.lby + (pScreen.hScreen - inY)*pScreen.scale;
}

//平面坐标系转换为屏幕坐标系
void malabasedll CoordToScreen(double inX, double inY, malaScreen pScreen, long *outX, long *outY)
{
    *outX = (long)(inX - pScreen.lbx) / pScreen.scale;
    *outY = pScreen.hScreen - (long)(inY - pScreen.lby) / pScreen.scale;
}
VC++开发GIS系统(48)屏幕坐标转换原理 VC++开发GIS系统(50)使用自定义平面坐标系

作者:,GIS爱好者。
分享本文,请您带上本文链接
分享到:

发表评论