为什么软件通常使用反坐标系而不是普通数学坐标系?

5

如您所知,C#中平面的原点(0,0)是左上角。向右和/或向下移动被视为+,而向左和/或向上移动则为-。与此相对的是常规数学坐标系统:

(0,0)=平面中央,向上/向右= +,向下/向左= -。

这有点违反直觉,有时可能很烦人,因为我们已经习惯了使用常规数学坐标,而且您还需要重新计算坐标。

这是基本的设计缺陷吗?习惯后是否容易操作?哪些其他语言使用与C#不同的坐标系统?


所有的计算机图形坐标系统都将左上角作为(0, 0)点,除非有我不知道的奇怪系统。 - phuclv
在OpenGL中,原点位于左下角。 - samgak
@samgak:你确定它不是在中间吗? - Ben Voigt
1
@samgak 这就是我告诉它的(和轴),太棒了,空间变换。 - user2864740
@user2864740:你可以定义一个从自定义坐标系到OpenGL坐标系的映射(使用视图矩阵),但OpenGL坐标不会改变。 - Ben Voigt
@BenVoigt 在 glReadPixels 中,0,0 表示左下角。对于 NDC,你说得对,它是中心。 - samgak
3个回答

9

这不是C#的问题,而是显示器使用了一个反向坐标系统。这是由于早期CRT显示器上绘制图像时是自上而下,自左向右的,因此操作系统使用这种坐标系统。

C#等编程语言只是包装底层操作系统的API,所以它们也使用相同的坐标系统。


我几乎用同样的话回答了相同的问题,但你比我先发了 :) - DavidG
CRTs 可以轻松地从底部向上扫描 -- 顶部到底部的编号系统的起源是文本页面上的行号。 - Ben Voigt
我认为这个概念甚至比CRT还要早,可以追溯到线打印机,本质上是自动打字机。它们按页面阅读顺序打印,从左到右,然后从上到下。 CRT继承了它们的坐标系统,从而许多应用程序也沿用了这个系统。 - Edward Doolittle
@EdwardDoolittle:没错。 - Ben Voigt
1
早期的显示输出(CGA,VGA等)实际上只是位图映射到某个预定的内存区域。当将这些区域视为简单的2D数组时,以左上角为原点和升序的x/y与像素/单元索引相关联是有意义的。 - user2864740
显示剩余3条评论

1
数学图形平面是一个虚拟的东西,可以无限地朝各个方向扩展。
屏幕是一个真实的东西,无法真正地扩展。
相反,我们使用滚动的概念,并且我们习惯于从起始点向下滚动。
因此,从概念上讲,所有图形系统都使用与书中的文本块或页面相同的系统(从左到右和从上到下)。它关于我们如何滚动来扩展/推进显示区域。
但它可以以任何其他方式定义;毕竟,例如负坐标确实有意义,而负行号则不然。

0

如果您不喜欢屏幕上的坐标系,可以创建包装器方法以任何您喜欢的方式重新映射坐标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接