在二维透视几何中,有两组主要坐标;由三元组表示的笛卡尔坐标(x,y)
和齐次坐标(x,y,z)
。这个三元组可能会令人困惑——它不是笛卡尔坐标系中的三个维度中的一个点(x,y,z)
。正因为如此,一些作者对同质点使用不同的表示法,比如[x,y,z]
or (x:y:z)
,这种表示法更有意义,原因我们稍后会讨论。
第三个坐标只存在一个目的,就是在域中添加一些点,即无穷远处的点。对于 double (x,y)
,没有办法表示无穷大,至少不能用数字和我们可以轻松操作的方式来表示。但这对于计算机图形学来说是一个问题,因为平行线当然非常普遍,而欧几里得几何的一个公理是平行线在无穷远处相遇。平行线很重要,因为计算机图形学中使用的转换是保留线的. 当我们用单应性或仿射变换扭曲点时,我们以一种将线映射到其他线的方式移动像素。如果这些线恰好是平行的,就像它们在欧几里得或仿射变换中一样,我们使用的坐标系需要能够表示它。
因此,我们使用齐次坐标(x,y,z)
的唯一目的是包括无穷远处的那些点,这些点由三元组表示(x,y,0)
。而且由于我们可以为每个笛卡尔对在这个位置放置一个零,这就像我们在每个方向上都有一个无限远的点(方向由与该点的角度给出)。
但是,既然我们有第三个值,也可以是除零以外的任何其他数字,那么所有这些额外的点是什么?(x,y,2)
和(x,y,3)
等等有什么区别?如果这些点(x,y,2)
和(x,y,3)
不是无穷大的点,它们最好等于其他一些笛卡尔点。幸运的是,有一种非常简单的方法可以很好地将所有这些齐次三元组映射到笛卡尔对:只需除以第三个坐标。然后(x,y,3)
被映射回 Cartesian (x/3, y/3)
,并且映射到 Cartesian 是未定义的——这是完美的,因为在笛卡尔坐标中不存在(x,y,0)
无穷远点。
由于这个比例因子,这意味着齐次坐标可以用无数种方式表示。您可以将笛卡尔点映射到齐(x,y)
次(x,y,1)
坐标,但也可以映射(x,y)
到(2x, 2y, 2)
. 请注意,如果我们除以第三个坐标返回笛卡尔坐标,我们最终会得到相同的起点。当您乘以任何非零标量时,这通常是正确的。所以这个想法是笛卡尔坐标由一对值唯一地表示,而齐次坐标可以用无数种方式表示。这就是为什么一些作者使用[x,y,z]
or的原因(x:y:z)
。方括号通常在数学中用于定义等价关系,对于齐次坐标,[x,y,z]~[sx,sy,sz]
对于非零s
。同样,:
通常用作比率,因此三个点的比率将等效于任何标量s
乘以它们。因此,每当您想从齐次坐标转换为笛卡尔坐标时,只需除以最后一个数字,因为它就像一个比例因子,然后只需拉出(x,y)
值。例如,请参阅我的答案。
所以移动到齐次坐标的简单方法是附加一个 1,但实际上,你可以附加一个 1,然后乘以任何标量;你不会改变任何东西。您可以映射(x,y)
到(5x,5y,5)
,应用您的转换(sx',sy',s) = H * (5x,5y,5)
,然后(sx',sy')/s = (x',y')
同样获得笛卡尔点。