鱼C论坛

 找回密码
 立即注册
查看: 323|回复: 1

[争议讨论] 关于我对逻辑坐标和设备坐标的理解和争议

[复制链接]
发表于 2024-8-5 16:00:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
最近在学win32的时候学到逻辑坐标和设备坐标的时候快崩溃了,咋学都学不明白,折腾了一晚上,查了不少资料,总算是明白了。

先说一下让我最困惑的地方:设备坐标(视口)到底是个什么?

windows其实只认识设备坐标,只能根据设备坐标来画图,不论进行如何操作,设备坐标的原点始终在左上角(0,0)处,永远向下y增大。平时我们使用GDI函数不管怎样,都是使用逻辑坐标进行编程。
windows必须将逻辑坐标转换为设备坐标才可以进行画图操作。

再来说一下SetViewportOrgEx() 函数和SetWindowsOrgEx()函数到底是咋回事:(不想那么复杂,映射模式假设还是MM_TEXT)

SetViewportOrgEx()函数我刚刚开始还以为是改变设备坐标的原点,例如                SetViewportOrgEx(hdc, cxClient/2, cyClient / 2, NULL);是将设备坐标原点直接移动到客户区中央的位置,但其实不是这样
注意:不论如何操作,客户区设备坐标原点始终是在左上角(0,0)处!!

SetViewportOrgEx()函数其实是这样:

例如SetViewportOrgEx(hdc, cxClient/2, cyClient / 2, NULL); 是把逻辑坐标点(0,0)映射到设备坐标点(cxClient/2,cyClient/2)的地方,如果不知道映射是啥意思可以理解为转换。

以此类推:逻辑坐标(-1,-1)会被映射(转换)为设备坐标(cxClient/2 - 1,cyClient/2 - 1)  

注意:设备坐标原点没有变化!!!!,依旧是在(0,0)处!!!!,windows只能依靠设备坐标画图,逻辑坐标要变换为设备坐标windows才可以使用!!!

再使用TextOut函数的时候(注意:我们编程的时候从来都只能使用逻辑坐标,只不过以前我们接触的都是逻辑坐标和设备坐标重合)

TextOut(hdc,0,0,TEXT("HELLO"),5);会打印到逻辑坐标区域(0,0)的位置,但是这里逻辑坐标不和设备坐标重合,所以设备坐标会被映射为(cxClient/2,cyclient/2)的位置

再来说下SetWindowsOrgEx()函数,和上个函数正好相反,这个函数会把逻辑坐标(x,y)的值映射为设备坐标(0,0)的位置

以此类推,使用该函数,逻辑坐标(x-1,y-1)映射(转换)设备坐标的位置(-1,-1)

所以如果使用这个函数,我们想把文字什么的使用逻辑坐标(0,0)的位置就能打印在客户区中间,需要这样设置:SetWindowsOrgEx(hdc, -cxClient/2, -cyClient/2,NULL)

这样的意思是:( -cxClient/2, -cyClient/2)会被映射到设备坐标(0,0)的位置,以此类推,逻辑坐标(0,0)的位置就是设备坐标(cxClient/2, cyClient/2)的位置

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-5 16:01:03 | 显示全部楼层
哎呀,看来你对逻辑坐标和设备坐标的理解真是让人感到“坐标”不已啊!没关系,我来试着轻松幽默地帮你理清这个关系,咱们一起把这个“坐标迷宫”走出来!

首先,想象一下你的电脑屏幕就像一块白板,设备坐标就是那块白板的绝对坐标系——就像一个小朋友在白板上玩涂鸦,涂鸦的起点总是在左上角,也就是(0, 0)这个位置,向下往右走坐标就越来越大。设备坐标如同这块白板的真实属性,Windows系统也只听得懂这一套。

而逻辑坐标就像是一位艺术家设定的美丽画布,它可以根据你的需求,随意改变原点和比例。逻辑坐标的起始点可以是任何地方,你可以把它放在白板的中央,甚至左下角,只要你愿意。在开发过程中,虽然你在编程时用的是逻辑坐标,但是最后显示的内容都要经过转换成设备坐标才能在白板上出现。

接下来,我们说说你提到的这两个函数:`SetViewportOrgEx()` 和 `SetWindowOrgEx()`。想象它们就在这两种坐标之间玩“原点变换”的游戏:

1. **SetViewportOrgEx(hdc, cxClient/2, cyClient/2, NULL)**:
   这就像把你的画布移到白板的中心,但实际上原点(0,0)并没有移动。它会把逻辑坐标(0,0)映射到设备坐标的中心位置,效果就像你把画布移到了中心,所以你画的内容看起来是出现在中心的!

2. **SetWindowOrgEx(hdc, -cxClient/2, -cyClient/2, NULL)**:
   这个函数的作用相当于把逻辑坐标的原点往回移。这样一来,当你在逻辑坐标(0,0)绘图时,图案就会出现在设备坐标的中心。简单来说,这个函数把你定义的逻辑空间和实际显示的设备空间进行了“反向映射”。

所以,最终无论你怎么设置逻辑坐标,Windows 画图的时候总是要转换为设备坐标来进行绘制。而你要做的就是掌握这些转换的“秘密”,这就能跟坐标打交道了!

如果这还不够明白,不妨给我再来一波问题,咱们再继续聊聊这门“坐标艺术”!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 16:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表