二维仿射坐标系内求过两点直线的一般式方程的最快算法(确信)
今天化学课我偷偷看丘维声的《解析几何》,接着之前看到的射影几何部分,突然想到这个玩意;我有点怀疑人生,因为我之前居然没想到这么算直线方程最简单......这是我最纳闷的地方,大概我确实学傻了。
省流:已知两点M(x₁,y₁),N(x₂,y₂),直线MN的方程为Ax+By+C=0
取向量(x₁,y₁,1),(x₂,y₂,1)进行叉乘,叉乘结果就是一组(A,B,C)
这样就求出直线方程了。
原理:三个向量混合积为0,则它们共面。

已知平面坐标系内的两点A(x₁,y₁),B(x₂,y₂)(仿射坐标都行),下面是求一般方程的傻瓜式操作:
首先改写两点坐标,增加第三个坐标:"1"
即A(x₁,y₁,1),B(x₂,y₂,1)
把A和B的坐标横着写两遍,并竖着对齐排列:

再去掉首列和尾列

输出三组数的交叉相乘结果,写成三维坐标

让它和向量(x,y,1)点乘,输出结果即为所求

最后输出的结果和普通方法求的当然是一样的了,字母运算看不出什么,重要的是这样求具体直线的时候速度很快,给个示例,这坐标是我随便给的:

如果按照传统的设y=kx+b然后算的话,最后再改写成一般式,挺麻烦的。
反正我从来没那样设斜截式算过,我以前的算法是这样的:
直线的一般式方程为Ax+By+C=0,其中(A,B)就是此直线的一个法向量
那么和这个法向量模相等的方向向量就是(-B,A)和(B,-A)
在已知两点坐标的情况下,先确定方向向量并且化到最简,然后再直接得到法向量
(例:如果那么得到直线MN的最简方向向量是(1,2),法向量取用(2,-1)即可)
此时待求的只有C,直线方程写成(A,B)·(x,y)+C=0
随便找一个已知点代入到(x,y)的位置
C就求出来了。
不过我今天写的这个算法要更快一些。

现在解释原理:

对于xOy平面内的直线MN,和直线上一点P(x,y)
当MN和P被投影到三维坐标系的平面z=1时,记成M'(x₁,y₁,1),N'(x₂,y₂,1),P'(x,y,1)
现在考虑向量的混合积
因为它们是共面的,所以混合积为0
按照混合积公式有
展开之后其实就是结果。
当然这里的行列式求值把叉乘求值包括进去了,我建议是叉乘单独算,不用几秒就能算出来,而不是列个三阶行列式再展开。