几何向量:直线和平面

  • Post author:
  • Post category:其他


紧接上一篇:

http://blog.csdn.net/yinhun2012/article/details/79444277

这一篇我们来看一下直线和平面在计算机中的数学表示,因为我们程序中不可能用笔和纸去画一个直线或者平面,我们只能通过函数或者向量组合表示这些抽象的概念,这样才能带入并实现具体的功能。

首先来看一下二维xy坐标轴下直线的表示,如下图:


一个二元一次方程就能表示直线在坐标系中所有坐标点的集合了,可以看作a*x+b*y+c = 0。

接下来的问题是如何表示一个空间xyz坐标系中的直线,如果平面坐标系中直线是a*x+b*y+c = 0,那么空间坐标系中难道不是

a*x + b*y + c*z + d = 0么?我们仔细思考一下,在二维坐标系中拓展出第三个维度z,那么c*z是一个动量,c*z的值是不断变化的,我们想一下,在一条直线AB上,一手握着端点A,一手握着端点B,双手往外拉动,不就是拓展出了一个跟老式打字机一样不断扫描的动点Z = c*z,那么不就是拉出一张“复印纸”么,这不就是一个平面(或者一个扭曲的曲面),反正不是一根三维空间中的直线。

接下来我们通过向量的形式来绘画一下空间直线,如下图:


我们求直线的动点P的坐标公式,就是求出了这条直线的表示,因为向量OP = OA + AP,我们已知AB两点的坐标(ps:我们至少得知道一条直线上的两个不同点的坐标,不然我们也没办法推出直线),这时候我们引入一个数值变量t(也就是上面推出的m*n)就能表示出这个直线了,p(???) = (x,y,z) + t(a-x,b-y,c-z),动点P的坐标就随着t数值的变化而变化。

下面我们同样来用数字描叙一下平面,上面我们随便猜想了一下a*x + b*y + c*z + d = 0表示一个平面或者曲面(暂时未推导所以未知),下面我们来绘画一个平面,如下图:


这里我来解释一下,首先我们要确定一个平面Ground(简称G),那么我们必须得先测量出G上的三个点ABC,或者说我们知道三个点ABC,求ABC组成的平面G,因为只有不共线的三点ABC才能确定一个平面,此时,我们确定了ABC三个坐标点,两两连接得到向量AB,AC,就能通过叉积求出法向量AN,当我们求出了法向量AN后,因为平面其实就是一个动点的所有坐标的集合,我们记为P(x,y,z)动点,那么平面G其实变成了求P(x,y,z)的集合了,这时候根据点积,因为AN为法向量,那么AN·AP = 0,此时建立公式计算就能得到u*x+v*y+w*z+(-ua-vb-wc) = 0,其中a,b,c为坐标A(a,b,c)已知,u,v,w为求出的法向量AN可以得出,这就推导出了平面的实际方程表示了。

我们简化为a*x + b*y + c*z + d = 0。

平面方程的实际应用呢,我们可以看出现在市面上的ARsdk几乎都有平面检测功能,实际上原理就是:

拍摄当前画面比如一张桌面,选取三个极值特征点,假设特征点为ABC,这样就能推导出桌面的平面方程,这时候我们不仅可以计算出桌面的法向量n,同时也可以根据a*x + b*y + c*z + d = 0计算出桌面上任意一个动点P(x,y,z),这时候我们随便放置一个模型在桌面上,根据动点P(x,y,z)和法向量n就能稳稳的“正立”在桌面上。


如上图,我们取到特征点ABC后(特征点选取算法暂时不讨论),得到平面方程,然后随意计算一个动点P(x,y,z),计算方法可以先假设x,y的值然后求z,然后根据法向量N就能把茶杯稳稳摆在平面G上



版权声明:本文为yinhun2012原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。