Answers:
这是历史造成的。早期的计算机具有阴极射线管(CRT),该阴极射线管利用阴极射线从左上角向右下“绘制”图像。
为了简化图形卡内存和CRT之间的接口,从头开始读取内存,并从左上角(内存地址最低)到右下角(内存地址最高)绘制图像。
扩展名(基于评论)
CRT基于当时可用的模拟电视机。
电视机首先从左到右然后从上到下逐行创建图像。只能将其原因假定为基于西方国家的写作风格。
我已经想过很多次了。对“为什么”的简单回答是因为电视格式也从左到右再从上到下划出了界线。原始的计算机显示器是CRT屏幕(小型电视),因此格式自然保持不变。当显示器变成纯平屏幕(电视也变成纯平屏幕)时,保持相同格式以方便兼容同样自然。
当然,您然后可以问:为什么电视采用这种方式绘制?它们是20世纪初期发明的,因此,即使有人质疑它,您也可以想象它在设计中投入了多大的考虑或缺乏。注意:这并不意味着无礼,因为与将微小的“灯泡”简单矩阵相对的方程式相比,获取将光线磁偏转到屏幕上适当行的方程式更具挑战性。(这有点像这样的问题:在地球上,他们是如何在点阵简单矩阵之前发明CRT的,可以追溯到20世纪初?)
不过,我的猜测是,由于西方语言从左到右和从上到下书写单词,所以这可能从未受到质疑(一件坏事)。可能没有人想到过做不同的可能性。
我个人不喜欢这种格式。当我编写涉及椭圆轨道的游戏和其他模拟程序时,我获得了这种态度。每当您查找涉及sin,cos或tan的绘图方程式时,都必须小心地反转处理y轴参数的符号...否则您将得到错误的绘图。一个例子是在任何2D角度绘制的椭圆的参数方程式。剖析罪孽,罪恶 cos和类似的东西可能是一场真正的噩梦。
简而言之,屏幕位于象限4中,而不是象限1中。这不必要地复杂。
顺便说一句,当您达到3维时,z轴被视为沿正方向“向上”移动。有点讽刺。[编辑]:也许没有,请参阅下面的评论。
我了解/发现的另外2件事:
北半球的日di(具有朝北的指针和与地面平行的磁盘)始终按顺时针方向旋转。因此,如果将零时置于“钟面”的顶部,则阴影指针开始向右移动。这可能是西方语言从左到右方向的起源,向下传播到笛卡尔坐标和电视/计算机屏幕。
旧计算机并没有绘制太多图形对象。他们在命令提示符下绘制了文本。因此,将第0行置于y = 0是很自然的。如果我们有一个左下角的原点,则绘制文本行的数学会更复杂一些,对于那些老式的慢速计算机(为求善良,他们甚至为增加1的快捷方式,称为“ ++”)。另外,您需要知道屏幕的分辨率,而如果仅在y = 0处执行第0行,则无需知道分辨率。
附录:早期的图形是在矢量监视器上完成的,与实验室中看到的示波器仅相距一步,此处的(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直角坐标系的数学约定。(有人可能会问,为什么这样的约定是这样的?)
并非一切都在左上方。
例如,OpenGL指定原点在左下角,并且在整个API中普遍存在:纹理坐标,视口,纹理像素矩形,标准正射投影:一直在左下角。
这里的思维有所不同。
在计算机屏幕上,就像书籍一样,当人们阅读(这里我假设是英语)时,他们从左到右和从上到下阅读。您在写这个问题时是自己做的,在阅读答案时就是在做。
在数学和设计中,绘制图形时,您有一个X轴和一个Y轴,正X向左,正Y向上。
如果您要在游戏中构建2D GUI之类的东西,那么对许多人来说,以“左上角是原点”的方式进行布局会更容易,更直观。
如果您要构建一些东西来模仿方格纸上的设计或布局,则对于许多人来说,以“左下角是原点”的方式进行布局可能更容易,更直观。
实际上,这两个都是相当非正式的约定,如果您要设置正交投影,则实际上可以选择在屏幕上(或屏幕外)的任意点上都具有原点,正X可以向左或向右移动,而正Y上升或下降。只需相应地调整投影矩阵即可。
因此,唯一重要的事情是选择要使用的约定并始终使用它。
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, }
代码与屏幕上的结果匹配:
如果您未使用左上角原点,则红色箭头将上下颠倒。
我不能说这是“为什么”。只是,这是左上角原点的一个很好的理由。