视口坐标的计算

时间:2016-08-21 16:53:49

标签: vector graphics coordinates viewport

我阅读了一篇关于规范化设备坐标的文章(在德国DGL维基上),并提供了以下示例: “我们假设我们有一个尺寸为1024像素(宽度)和768像素高度的视口。具有绝对坐标P(350/210)的绝对坐标P(350/210)的点P将在标准化坐标P(-0,32 / -0)中这些坐标现在可以通过将标准化设备坐标(类似于矢量缩放)与视口大小相乘来投影到视口(800x600)上。在这种情况下,结果将是P(273/164)。

不知何故,我无法理解如何获得所提供的结果(我的意思是273/164和-0,32 / -0,59 ......有人可以向我解释如何计算坐标吗?

P.S。 :这是文章 - https://wiki.delphigl.com/index.php/Normalisierte_Ger%C3%A4tekoordinate

谢谢!

1 个答案:

答案 0 :(得分:1)

那篇文章肯定缺乏描述。我可以让你在那里的一部分;也许有更多数学的人可以帮助完成。

根据this answer,将非标准化坐标转换为标准化坐标的公式为:

Nx = (Cx / Sx) * 2.0 - 1.0

Ny = 1.0 - (Cy / Sy) * 2.0

(其中Cx / y =坐标X / Y; Sx / y =屏幕X / Y;以及Nx / y =标准化X / Y)。

将示例的数字插入:

Nx = (350/1024) * 2 - 1 = -0.31640625
Ny = 1 - (210/768) * 2 = 0.453125

......或(-.36,0.45)。

扭转这一点以获得新的坐标:

(1 + Nx) / 2 * Sx

(1 - Cy) / 2 * Sx

Cx = (1 + -0.31640625) / 2 * 800 = 273.4375
Cy = (1 - 0.453125) / 2 * 600 = 164.0625

请注意,Y值不匹配。这可能是因为我的计算没有考虑宽高比,应该是因为这些屏幕的宽高比为0.75,而NDC为1. This SO answer也可能有所帮助。