为什么计算机图形坐标的原点在左上方?


36

从我所看到的几乎所有东西都使用坐标,其中(0,0)在左上角,并且Y轴的正向在屏幕的下方。

为什么会这样呢?为什么传统的正Y轴不像简单数学课程中的图形所示那样向上移动?


7
我会辩称,从顶部开始并随着距离的增加而增加,比数学惯例更有意义,因为它与印度和欧洲语言的读写方式更紧密相关。
2014年

3
我认为绘制物理对象时Y +向上是有意义的,因为地面是您的起源,而您的大部分世界都在地面之上。但是,对于显示,我假设它与模仿印欧语言的书写方式有关。
熊猫睡衣2014年


4
OpenGL的规范化设备坐标不具有向上的Y轴吗?

1
因此,您实质上是在问“原产地是什么?”?
肯(Ken)

Answers:


42

这是历史造成的。早期的计算机具有阴极射线管(CRT),该阴极射线管利用阴极射线从左上角向右下“绘制”图像。

为了简化图形卡内存和CRT之间的接口,从头开始读取内存,并从左上角(内存地址最低)到右下角(内存地址最高)绘制图像。

扩展名(基于评论)

CRT基于当时可用的模拟电视机。

电视机首先从左到右然后从上到下逐行创建图像。只能将其原因假定为基于西方国家的写作风格。


7
可以,但是为什么CRT从左上方绘制(从观众的角度看)?为什么不垂直?为什么不从右向左?为什么不从下到上?
熊猫睡衣2014年

1
您可以在此处找到CRT的图像创建。基本上,这是用于模拟电视的,但是用于计算机的CRT具有相同的技术。
Uwe Plonus 2014年

12
@PandaPajama计算机CRT之所以这样做,是因为这是模拟电视标准的方式,最初用于家用计算机时,通常使用电视来代替专用显示器。为什么第一台电视通过在扫描线中分割信息并从左到右绘制扫描线来传输信息-我不确定,但这与我们的写作方式是一致的,因此这可能是在任意选项之间进行选择的充分理由。
Peteris 2014年

2
@Peteris:一路欧洲人
鸣叫鸭

1
从技术上讲,CRT从舞台右上角到舞台左下角。
ps2goat 2014年

3

我已经想过很多次了。对“为什么”的简单回答是因为电视格式也从左到右再从上到下划出了界线。原始的计算机显示器是CRT屏幕(小型电视),因此格式自然保持不变。当显示器变成纯平屏幕(电视也变成纯平屏幕)时,保持相同格式以方便兼容同样自然。

当然,您然后可以问:为什么电视采用这种方式绘制?它们是20世纪初期发明的,因此,即使有人质疑它,您也可以想象它在设计中投入了多大的考虑或缺乏。注意:这并不意味着无礼,因为与将微小的“灯泡”简单矩阵相对的方程式相比,获取将光线磁偏转到屏幕上适当行的方程式更具挑战性。(这有点像这样的问题:在地球上,他们是如何在点阵简单矩阵之前发明CRT的,可以追溯到20世纪初?)

不过,我的猜测是,由于西方语言从左到右和从上到下书写单词,所以这可能从未受到质疑(一件坏事)。可能没有人想到过做不同的可能性。

我个人不喜欢这种格式。当我编写涉及椭圆轨道的游戏和其他模拟程序时,我获得了这种态度。每当您查找涉及sin,cos或tan的绘图方程式时,都必须小心地反转处理y轴参数的符号...否则您将得到错误的绘图。一个例子是在任何2D角度绘制的椭圆的参数方程式。剖析罪孽,罪恶 cos和类似的东西可能是一场真正的噩梦。

简而言之,屏幕位于象限4中,而不是象限1中。这不必要地复杂。

顺便说一句,当您达到3维时,z轴被视为沿正方向“向上”移动。有点讽刺。[编辑]:也许没有,请参阅下面的评论。

我了解/发现的另外2件事:

北半球的日di(具有朝北的指针和与地面平行的磁盘)始终按顺时针方向旋转。因此,如果将零时置于“钟面”的顶部,则阴影指针开始向右移动。这可能是西方语言从左到右方向的起源,向下传播到笛卡尔坐标和电视/计算机屏幕。

旧计算机并没有绘制太多图形对象。他们在命令提示符下绘制了文本。因此,将第0行置于y = 0是很自然的。如果我们有一个左下角的原点,则绘制文本行的数学会更复杂一些,对于那些老式的慢速计算机(为求善良,他们甚至为增加1的快捷方式,称为“ ++”)。另外,您需要知道屏幕的分辨率,而如果仅在y = 0处执行第0行,则无需知道分辨率。


2
您听起来好像20世纪初是尼安德特人
Nianderthals

1
噢,我只是想强调CRT和LED矩阵之间复杂性的鲜明对比。CRT具有令人惊讶的复杂数学,涉及光线的磁偏转。点矩阵更容易缠住您的头:只需在正确的时间向正确的LED发送电流。如果有的话,那么巨大的复杂性就意味着20世纪初是由更多或更好的天才组成的,因为他们不得不在一个更加有限的时代里做这件事。
DrZ214 2014年

LED阵列用于显示信息,他们从来没有走红的电视和电脑显示器。现代的纯平屏幕不是LED矩阵,而是背光LCD。LED仅在某些屏幕中用作背光,但图像不是由LED创建的。LCD是一种简单的技术,但是将分辨率从原来的手表显示提高到整个屏幕上的数百或数千个像素(然后再增加一些,因为您需要三个子像素来增加色彩!)不一定比调制波形信号容易得多。控制EM波束(在某种程度上类似于无线电广播)
oerkelens 2014年

Z轴向上不是具有讽刺意味的-是数学。坐标系需要右手操作,因此,如果+ X位于右侧,+ Y位于屏幕中,则+ Z向上。就像我们将+ X保留在右边,+ Y保留下来一样,+ Z进入了屏幕。
tpg2114 2014年

1
@ tgp2114为什么需要右手坐标系?
Taemyr

3

附录:早期的图形是在矢量监视器上完成的,与实验室中看到的示波器仅相距一步,此处的(0,0)将位于屏幕的正中间,需要旋转一些旋钮来设置X / Y标度X / Y偏移量,可能还有X / Y反转。

例如,Atari的“ Asteroids”(1979)专用硬件使用了矢量屏幕。知道它的程序坐标系是什么会很有趣。

伊万·萨瑟兰(Ivan Sutherland)的“ Sketchpad”系统(1963年)基于TX-2矢量显示器,在“ Sketchpad:人机图形通信系统”(博士学位论文,1963年1月)中,他写在第70ff页:

TX-2显示系统的坐标系的原点位于示波器的中心,并且每个轴都需要位于18位计算机子字左侧的十位偏转信息。

...

为了方便表示许多组件变量并达到18位以上的精度,Sketchpad使用内部坐标系来绘制与显示系统所需的表示形式不同的图形表示形式。该内部系统称为“页面”坐标系。在使用Sketchpad绘制图形时,页面坐标被认为是固定的。页面到范围的转换使您能够在范围上以任何放大倍数查看所需页面的任何部分,就像通过放大镜(...)一样。显示的比例因子控制正方形的大小,将出现在示波器上。实际保存的数字是正方形边的一半长度,称为SCope大小的SCSZ,如图5.2所示。还保存了范围正方形中心的页面坐标。通过更改这些数字,示波器上显示的页面部分可以更改大小和移动,但不能旋转。

第73页的图5.2显示“页面坐标系”使用X / Y直角坐标系的数学约定。(有人可能会问,为什么这样的约定是这样的?)


但是:仅使用矢量屏幕是因为内存太稀少,无法代表整个可显示图像,并且矢量列表+演示持续时间+连接所需的内存要少得多(例如多边形与体素)
Micka,

2

并非一切都在左上方。

例如,OpenGL指定原点在左下角,并且在整个API中普遍存在:纹理坐标,视口,纹理像素矩形,标准正射投影:一直在左下角。

这里的思维有所不同。

在计算机屏幕上,就像书籍一样,当人们阅读(这里我假设是英语)时,他们从左到右和从上到下阅读。您在写这个问题时是自己做的,在阅读答案时就是在做。

在数学和设计中,绘制图形时,您有一个X轴和一个Y轴,正X向左,正Y向上。

如果您要在游戏中构建2D GUI之类的东西,那么对许多人来说,以“左上角是原点”的方式进行布局会更容易,更直观。

如果您要构建一些东西来模仿方格纸上的设计或布局,则对于许多人来说,以“左下角是原点”的方式进行布局可能更容易,更直观。

实际上,这两个都是相当非正式的约定,如果您要设置正交投影,则实际上可以选择在屏幕上(或屏幕外)的任意点上都具有原点,正X可以向左或向右移动,而正Y上升或下降。只需相应地调整投影矩阵即可。

因此,唯一重要的事情是选择要使用的约定并始终使用它。


好答案。我正在创建一个具有大量三角函数的算法,最终将导致在屏幕上绘制事物。我真的不确定是否要通过使y轴为正值来打破某些禁忌或惯例。
亚历山大·霍斯特

-1

因为屏幕从左上角开始渲染图像。当(0,0,0)位于左上角且+ Y轴进入屏幕时,更容易关联坐标轴的渲染或绘图。


-2

FOR的参数:(例如)

var R uint32 = 0xFF0000FF; //:Red pixel
var W uint32 = 0xFFFFFFFF; //:White Pixel.
var Pixels []uint32 = { 
W,W,W,R,R,W,W,W,
W,W,R,R,R,R,W,W,
W,R,R,R,R,R,R,R,
W,W,W,R,R,W,W,W,   //:8x8 pixel image of " ↑ "
W,W,W,R,R,W,W,W,
W,W,W,R,R,W,W,W,
W,W,W,R,R,W,W,W,
W,W,W,R,R,W,W,W, }

代码与屏幕上的结果匹配

在此处输入图片说明

如果您未使用左上角原点则红色箭头将上下颠倒

我不能说这是“为什么”。只是,这是左上角原点的一个很好的理由。


2
“如果您不使用左上角原点,则红色箭头会上下颠倒”是的,是吗?游戏开发人员是否大部分时间都通过2D数组以代码形式编写图形?
Vaillancourt

我不能代表所有游戏开发商。我会这样做:newgrounds.com/portal/view/706067 Adam Atomic也会这样做,因为他阅读了flixel的源代码。OpenGL和SFML库绝对可以。OpenCL允许您将数据点抽象为X / Y(get_global_id(dim)),但初始内存分配为1D。
J MADISON
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.