从直线说起
我们已经在前面的文章提到过homogeneous表示点。
具体的文章可以参考
一条直线我们可以表示为
如果我们让l = (a, b, c), p = (x, y, 1), 那么上面的公式可以改写为
事实上,给直线l的每个系数都乘以一个非零的系数k是不改变这条直线的,因为kax+ kby + kc = 0和ax+by+c=0显然表达的是同一条直线。那么也就是说l' = (ka, kb, kc)与l = (a, b, c)是等价的。我们把这种表达叫做homogeneous表达。
其实homogeneous在英语中的含义就是由同类事物(或人)组成的;同类的;相似的。
点的表达我们在之前已经用过了。一个2D欧式坐标点(x, y)我们用homogeneous形式表达为(x, y, 1)。其实我们也可以表达成(kx, ky, k),对于任意的k\ne 0,表达的都是同样的一个点。
那好处是什么呢?其实从上面的直线公式我们就可以看出,使用了homogeneous形式的表达之后,传统的直线表达可以更简单地表达成为内积的形式。
当然了,homogeneous带来了表达的简洁,也同样带来了表达的冗余。多个homogeneous的表达对应的是同样的一个点或者直线。
直线相交
对于两条直线
他们的交点是什么呢?
我们现在假设有一个点的homogeneous表达是l_1 \times l_2,我们验证一下有
也就是说,我们假设的这个点确实同时在两条直线上,换句话说,也就是两条直线的交点。
这个地方也再次体现了homogeneous表达形式的优越,它使得求直线的交点的表达直接就转换成了叉积。
通过两个点的直线
现在我们已经知道了一条直线上的两个点
我们想要知道这条直线上的表达。
现在我们假设l = p_1 \times p_2,我们验证可以知道
也就是说l就是我们想要的直线的表达。
多么神奇的事情,求直线的法向也通过hemogeneous表达变成了叉积。
平行直线的交点
如果两条直线是平行直线
我们通过上面知道它们的交点是
由于homogeneous表达可以不用管大家都有的系数,那么交点的homogeneous表达就是(b, -a, 0)。
这其实是一个用常规欧式坐标完全无法表达的点。对应的欧式坐标为(b/0, -a/0),也就是说是一个无穷远坐标。但是我们使用homogeneous可以很清晰地表达出这个在无穷远的坐标。
另外我们还可以知道,所有无穷远点都是在一条直线上,这条直线的表达为l = (0, 0, 1),因为很显然
到这里,我们使用homogeneous表达比我们常规的欧式表达多出了两个结论:
任意两条直线的交点都可以表达,平行直线也可以;
平行直线的交点都在直线(0, 0, 1)上面。
结束语
从上面我们已经知道homogeneous表达是什么,也看到了它的一些运用的地方。其实在slam、三维重建、渲染这些方向,这个表达基本上可以说是无所不在,处处体现出数学的魅力。
更多文章发表在公众号“探知轩”,欢迎关注。