原创文章,转载请注明出处!
计算机中有很多坐标系,对象坐标系、世界坐标系、裁剪坐标系、屏幕坐标系!OpenGL流水线很容易实现上述顺序的转换。从网上查的信息:
1. 设备坐标系与屏幕坐标系
设备坐标(Device Coordinate)又称为物理坐标(Physical Coordinate),是指输出设备上的坐标。通常将屏幕上的设备坐标称为屏幕坐标。设备坐标用对象距离窗口左上角的水平距离和垂直距离来指定对象的位置,是以像素为单位来表示的,设备坐标的X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。
2.逻辑坐标(Logical Coordinate)
是系统用作记录的坐标。在缺省的模式(MM_TEXT)下,逻辑坐标的方向和单位与设备坐标的方向和单位相同,也是以像素为单位来表示的,X轴向右为正,Y轴向下为正,坐标原点位于窗口的左上角。逻辑坐标和设备坐标即使在缺省模式下其数值也未必一致,除了在以下两种情况下:
1. 窗口为非滚动窗口
2. 窗口为滚动窗口,但垂直滚动条位于滚动边框的最上端,水平滚动条位于最左端,但如果移动了滚动条这两种坐标就不一致了。
在VC中鼠标坐标的坐标位置用设备坐标表示,但所有GDI绘图都用逻坐标表示,所以用鼠标绘图时,那么必须将设备坐标转换为逻辑坐标,可以使用CDC函数DptoLP()将设备坐标转化为逻辑坐标,同样可以用LptoDP()将逻辑坐标转化为设备坐标。
3. 道的是如何从屏幕坐标系转换到地理坐标系!似乎有难度。
吴立新老师的GIS原理与算法162页介绍了相关的原理。
如图:A0为地图对应的WCS真实世界坐标系(地理坐标系),B0为设备坐标系中显示的地图(屏幕坐标或者更常见的为视图区的坐标)。地图在从世界坐标转换到屏幕坐标的时候通常需要进行变换。设A0的左下角坐标WL(WXL,WYL),右上角坐标WB(WXB,WYB),对于每个设备左上点VL(VXL,VYL),右上角点VB(VXB,VYB),地图中任意一点A坐标(XW,YW),对应设备坐标(VX,VY)。地图的中心点O对应于屏幕上的O’点,O点坐标容易计算。这样实际确定了一个比例尺δ(地图在放入设备显示的时候纵横比例不变,即横向比例和纵向比例相同):该比例尺的值等于B0屏幕尺寸与A0实际地图尺寸的比值。记A0---->B0地图映射为f1。
由A点计算A’点坐标:首先计算A点到WL点的WCS坐标差,再用坐标差除以每个像素代表的实际WCS宽度(δ的倒数),即得到像素坐标。
由A’点计算A点坐标:以WL点的WCS坐标+A’点屏幕坐标*每个像素代表的实际WCS宽度(δ的倒数)。
因为要考虑地图的无级缩放,吴老师书中的公式只是介绍了地图绘制全部过程的一部分,或者说是说明的不够详细。地图的缩放也就是依据比例尺进行显示的问题。在屏幕上以O点为中心放大地图,屏幕中显示的地图从B0变为B1在红色框中显示的部分,此时在计算机看来存在一个地图B1,应该与A0的放大地图A1对应。这个放大过程实际上改变了像素代表的WCS宽度。SharpMap中以O点坐标为基础,按照新的像素宽度重新计算落B1对应的屏幕坐标。即在计算屏幕坐标对应的WCS坐标时首先通过中心点O’对应的O坐标来计算WL坐标,当然SharpMap这样处理也导致了他只能实现中心放大,这是个问题。再看看SharpMap项目的方法:首先Map对象有一个Zoom属性,表示Map对应于WCS世界坐标系中的宽度。PixelSize属性等于zoom/显示视图的尺寸。
图A1和B1都是抽象出来的地图,并不能与现实世界对应起来。
仔细考虑一下觉得这些问题似乎用矩阵来解释更加合理简单。比如地图放大缩小;屏幕窗体显示部分地图,窗体可否视为一个标架,固定一点(SharpMap中是O点)+每个像素代表的实际WCS宽度(δ的倒数)?后续的学习中要补充这部分内容的矩阵解释!
一个问题:线性系统及满足齐次性和叠加性的系统。线性代数研究的是线性系统?矩阵能用于非线性系统吗?计算机图形学的流水线都用到矩阵是否是线性系统?