麻辣GIS微信平台

更多 GIS 干货

微信关注不错过

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;
}

相关阅读

麻辣GIS-Sailor

作者:

GIS爱好者,学GIS,更爱玩GIS。

声明

1.本文所分享的所有需要用户下载使用的内容(包括但不限于软件、数据、图片)来自于网络或者麻辣GIS粉丝自行分享,版权归该下载资源的合法拥有者所有,如有侵权请第一时间联系本站删除。

2.下载内容仅限个人学习使用,请切勿用作商用等其他用途,否则后果自负。

手机阅读
公众号关注
知识星球
手机阅读
麻辣GIS微信公众号关注
最新GIS干货
关注麻辣GIS知识星球
私享圈子

留言板(小编看到第一时间回复)