当前位置:C++技术网 > 资讯 > 我想把逻辑坐标范围设置成20*20CM设备坐标也设置成20*20CM在中心位置画一个2CM半径的圆

我想把逻辑坐标范围设置成20*20CM设备坐标也设置成20*20CM在中心位置画一个2CM半径的圆

更新时间:2016-08-22 22:13:33浏览次数:1+次

我想把逻辑坐标范围设置成20*20CM设备坐标也设置成20*20CM在中心位置画一个2CM半径的圆

C++技术网解答:

这是会员回答,因为问题在于概念不理解,所以就不直接回答这个问题,而是针对性讲解这整个知识点。下面是聊天记录,也就是讲解的过程。原谅我偷一下懒,不整理保持原始的聊天记录:

会员 21:05:27
您帮我讲讲他们之间的关系好吗?
++远方++ 21:06:13
可以
++远方++ 21:06:27
你看了Windows程序设计这本书没有
会员 21:07:06
就第五章看不明白,
会员 21:07:32
关键是不好理解
++远方++ 21:07:56
这一部分的内容,确实非常难理解
会员 21:08:00
也可能我人笨
++远方++ 21:08:02
这也是绘图最麻烦的地方
++远方++ 21:08:24
之前我学习理解了一遍,很久都没有做相关的编程,又忘的差不多了。
++远方++ 21:08:35
所以,才不能仓促回答你
++远方++ 21:08:52
今天又翻了一下书
会员 21:09:05
理解,
++远方++ 21:09:08
应该是书的问题
++远方++ 21:09:17
我觉得没有讲明白。
会员 21:10:08
我没有找到能讲明白的文章
++远方++ 21:10:11
窗口和视口,逻辑坐标和设备坐标,映射模式,
++远方++ 21:10:23
这几个是关键概念
会员 21:11:30
大多说窗口是逻辑坐标,视口是设备坐标,给点代码就完了。无语
++远方++ 21:12:31
视口是我们看见的一个界面,也就是屏幕
++远方++ 21:12:41
所以,视口就是指物理上的东西
++远方++ 21:13:03
物理上的东西叫做设备
++远方++ 21:13:17
所以视口坐标对应的就是屏幕这个物理设备坐标
会员 21:13:44
嗯,所以必须明白,要不打印机程序没法写
++远方++ 21:14:12
而设备坐标的单位就是像素
++远方++ 21:14:37
所以,视口、设备坐标,像素是一套的,都是物理设备。
++远方++ 21:14:51
最终显示画面的坐标就是设备坐标。
++远方++ 21:15:23
在MM_TEXT时,逻辑坐标和设备坐标一一对应,所以就好像直接用像素来衡量。非常直接。
会员 21:16:39
WindowClientRect 返回的应该是逻辑坐标吧
++远方++ 21:16:49
而这里的窗口,是一个逻辑概念,事实上,我们看不到门窗这种东西,这是一个虚拟化的概念
++远方++ 21:16:57
错,是设备坐标
++远方++ 21:17:07
逻辑坐标是给人准备的。
++远方++ 21:17:16
返回的肯定是基于设备的坐标。
++远方++ 21:18:16
窗口,逻辑坐标,逻辑单位就是概念性的。
++远方++ 21:18:46
所以,毫米,英寸之类的单位,只要不是像素,全部属于逻辑单位。、
会员 21:19:12
arc 等画图函数全是逻辑坐标吧
++远方++ 21:19:40
和你映射关系有关
++远方++ 21:19:56
一般画图函数都是用逻辑坐标去映射。
++远方++ 21:20:05
只有在实际绘画的时候用设备坐标
++远方++ 21:20:19
毕竟逻辑坐标适合人类的思维。
++远方++ 21:20:55
那么毫米之类的单位如何直接画在屏幕这个设备上呢?那就是通过坐标映射。
++远方++ 21:21:27
函数中传入的逻辑坐标是没有单位的,而单位则有映射方式决定。
++远方++ 21:21:39
所以不同的映射方式决定了不同的单位
会员 21:21:56
比如一个方块 2CM*2CM  在屏幕上显示  和在纸是也显示2CM
++远方++ 21:22:02
而且,映射方式有xy轴方向之分
++远方++ 21:22:13

++远方++ 21:23:04
计算机内部会根据映射模式以及你给的数值,如2CM*2CM对应为相应的像素数,然后你在屏幕上看到的长度就和纸上的是一样的。
++远方++ 21:23:14
如果不一样,那还有什么意义
++远方++ 21:23:24
屏幕尺就是这个原理
会员 21:23:35
您能帮我写一段代码解释一下吗?我卡到这点好几年了。
++远方++ 21:23:56
这个重在理解,不在代码
++远方++ 21:24:10
还没有说完
会员 21:24:17
好的。
++远方++ 21:24:31
设备坐标点的原点是左上角,即0,0
++远方++ 21:24:44
这个肯定是固定的。屏幕是硬件
++远方++ 21:25:16
视口虽然是对应物理坐标,但是是绘画最后阶段对应到屏幕上的。
++远方++ 21:25:42
所以,视口还可以做一个基本的位置设置来对应到屏幕的具体位置。
++远方++ 21:25:50
这个位置就参考设备原点
++远方++ 21:26:21
所以视口坐标相对于设备原点来方式
++远方++ 21:26:53
视口的范围就指视口坐标xy范围取值
++远方++ 21:27:04
宽度和高度
++远方++ 21:27:26
视口原点就是相对于设备坐标的位置
++远方++ 21:27:40
设备坐标的原点就是左上角,永远不变
++远方++ 21:28:27
有这个参考点后,视口的原点可以随意变动,设置要视口原点,那么这个视口原点就和设备的原点进行映射。
++远方++ 21:28:46
如果视口原点为0,0,那么就和设备原点重合。
++远方++ 21:28:55
映射就是1:1
++远方++ 21:29:47
如果视口原点设置为屏幕中央,就要取屏幕宽度和高度的一半
++远方++ 21:30:32
这样,想要画在屏幕的原点,也就落在了屏幕中心。
++远方++ 21:30:52
视口点是最终落地的点
++远方++ 21:31:27
这个点参照视口坐标来定。视口坐标最终落在屏幕,就和视口原点和设备原点的关系来定
++远方++ 21:32:03
这样,如果视口坐标和设备坐标的值就是平行关系。
++远方++ 21:32:41
视口坐标左移一点,对应的设备坐标也左移一点
++远方++ 21:32:49
平行关系,始终记住
++远方++ 21:33:33
这是映射的方式。视口原点和设备原点映射好后,所有视口点的坐标都参照这个映射比例来平行移动。
++远方++ 21:34:08
而窗口坐标,就是逻辑坐标,
++远方++ 21:35:10
窗口坐标往往也是要和视口坐标进行映射的。窗口原点相对于视口原点来设置,和视口与设备映射一个道理。
++远方++ 21:35:41
如果设置好视口点后,不再设置窗口原点,那么窗口原点默认和视口原点1:1映射。
++远方++ 21:36:55
如果你再设置一个窗口原点,那么这个原点参考点是视口原点,这样你就会相对于视口原点产生偏移,所有的逻辑点也就根据窗口原点-视口原点这个映射比例做平行偏移。
++远方++ 21:37:16
实际上,这有两级映射,书中么有讲清楚。
++远方++ 21:37:23
一般人看的都是稀里糊涂的。
++远方++ 21:37:44
这是原点映射后决定的起点位置。
++远方++ 21:38:08
映射的另外一个含义还有方向,也就是xy方向
++远方++ 21:38:12
这个好理解
++远方++ 21:39:03
屏幕设备坐标的方向是x向右为正,y向下为正,基于这个参考,映射模式的正负方向就知道。
++远方++ 21:39:21
这里不存在窗口方向和视口方向。统一的。
++远方++ 21:39:38
然后最后一个映射就是单位映射。
++远方++ 21:40:37
逻辑上的单位是不确定的,根据映射的方式得到最终的逻辑单位,传入数值后,函数在内部会将逻辑值转为对应的像素值,最终按照映射的方向,从视口原点开始画。
++远方++ 21:40:45
整个映射方式就这些。
++远方++ 21:41:13
总结一下,原点的两级映射,书中没有讲清楚。
++远方++ 21:41:41
单位的表示的映射,这个就是跟传入的数值相关。
++远方++ 21:41:51
方向的映射,直接与设备的方向有关。
++远方++ 21:41:57
总的来说就是这些。
++远方++ 21:42:51
然后你再去对照着书看,感觉书里还是有点绕,但是你将书中讲的东西往我说的这些上一套,就明白了。
++远方++ 21:42:59
所以是书没有讲清楚。
++远方++ 21:43:18
明白了没有
会员 21:43:47
非常感谢。你不说。我还以为设备 就是视口   窗口就是逻辑呢。呵呵。
++远方++ 21:43:57

++远方++ 21:44:12
这些都是我在看书反复的推敲领悟出来的。
++远方++ 21:44:32
我都感觉这里特别麻烦,有点心理阴影
++远方++ 21:44:39
哈哈哈
会员 21:45:11
对了。会员再给我续半年吧。
会员 21:45:59
我给你发红包了。收下。
++远方++ 21:46:07
6个月,买一送一,那就是3个月的会员哦。
会员 21:47:19
你讲我东西我再消化消化。好几年没搞明白的东西了。我要慢慢消化。呵呵
++远方++ 21:47:32
恩。希望这一次,会明白的。
++远方++ 21:47:46
把这个对应关系搞清楚,就咩有大问题了。
++远方++ 21:48:22
你可以再消化一下,自己画图连一下,用不了多久就OK了
++远方++ 21:48:27
这个我都没有写文章
会员 21:49:05
我几年来就没看到过像样的文章。
会员 21:49:28
你微信收下红包
++远方++ 21:49:31
OK
++远方++ 21:49:59
我写的文章基本都是这样深入分析的。大家都不懂绝对是有原因的。
++远方++ 21:50:12
那就是书的问题
会员 21:51:16
我今天先理解一下,然后写点代码,验证一下,不懂的再请教您。谢谢


问题点总结:没有笨读者,只有没有说清楚的作者。我总是在遇到问题的时候去想,为什么我会被卡住,为什么大家都掉入陷阱。实际上就是很多关键的细节被疏忽,看似理解,其实不然,这让喜欢钻研的人就很不解。而只是使用的人,则会使用就够了,所以看似用的不错,不一定真的懂了。就不再整理成文章了,相信该说的都说了。应该能看明白。