用叉积求二维直线交点
http://en.wikipedia.org/wiki/Line%E2%80%93line_intersection
其中的Using homogeneous coordinates。
若有两条二维直线:
a1 * x + b1 * y + c1 = 0
a2 * x + b2 * y + c2 = 0
那么它们的交点可以这么求,取两个三维向量(a1, b1, c1), (a2, b2, c2),求它们的叉积得(a3, b3, c3), 则若c3为0,则两直线平行,若c3不为0,则两直线交点为(a3/c3, b3/c3)。
为什么呢?
首先一个二维点可以映射到三维齐次空间中的一条过原点的直线,该直线与平面z=1的交点为(x,y,1),这里的(x,y)即为这条直线对应二维平面中的点。取直线上任意一点(x,y,z),则(x/z, y/z)也是这条直线对应二维平面中的点。这个内容在这本书里面http://book.douban.com/subject/1400419/
这样,一条二维面上的直线可以对应三维齐次空间中的一个<b>过原点</b>的平面。这样的平面的方程为A * x + B * y + C * z = 0。(A, B, C) 为这个平面的一个法向量。则 A * x + B * y + C = 0 即为二维直线的方程(因为二维直线对应齐次空间的面 A * x + B * y + C * z = 0 与面z=1的交线,这条交线上的点满足A * x + B * y + C * z = 0 且 z = 1)。
两直线方程
a1 * x + b1 * y + c1 = 0
a2 * x + b2 * y + c2 = 0
可对应三维齐次空间中的两个平面,则两直线方程交点对应这两个平面的交线。两平面的交线的其中一个方向向量即为两平面法向量的叉积。由于这条交线过原点,故这个方向向量即可对应这条直线上的某一个点。所以我们就可以从这个三维齐次点的坐标,通过(x/z, y/z)求得二维平面上的直线。所以可以用齐次空间算二维直线交点。
除此之外,还可以用齐次空间从两个二维点,直接算出二维直线标准方程。