您的位置:首页 > 其它

数学笔记(二)之平面表示

2015-11-22 15:37 183 查看
关于平面的表示方法,之前也有些模糊的地方,在此顺便一记吧~

假设我们知道垂直于平面的法向量n,以及平面上的一点p0,如何使用这两个元素来表示该平面呢?

取平面上的任意一点p,并设d为从点p0到点p的向量,以坐标表示如下:

n = (xn, yn, zn)

p0 = (x0, y0, z0)

p = (x, y, z)

d = p - p0 = (x - x0, y - y0, z - z0)

由于n是垂直于平面的向量,所以n也垂直于平面上的任一向量(这里为d),即nd的点乘为0:

n * d = 0

依然以坐标表示:

(xn, yn, zn) * (x - x0, y - y0, z - z0) = 0 =>

xn * (x - x0) + yn * (y - y0) + zn * (z - z0) = 0 =>

xn * x + yn * y + zn * z + (- xn * x0 - yn * y0 - zn * z0) = 0

如果设定

A = xn

B = yn

C = zn

D = - xn * x0 - yn * y0 - zn * z0

那么就有

A * x + B * y + C * z + D = 0

而以上便是平面的表示方法了~

(注:相关的一些向量知识可以参考这里)

而关于上面等式中的D,但就数值来看似乎是向量n和点p0做点乘,貌似没啥意义,但是如果我们设置k为从坐标原点到p0点的向量,则有:

k = (x0, y0, z0) - (0, 0, 0) = (x0, y0, z0)

那么

D = - xn * x0 - yn * y0 - zn * z0 = - (xn * x0 + yn * y0 + zn * z0) = - n * k

如果n是标准化向量(即模为1),那么D其实可以理解为坐标原点到平面的带符号距离,据此,我们也可以判断空间内任一点与平面的相对关系了~

拿cocos2d-x中的Plane类型举例,其使用的正是这种方法:

class CC_DLL Plane
{
public:

// ...
protected:
Vec3 _normal; // the normal line of the plane
float _dist; // original displacement of the normal
};
PointSide Plane::getSide(const Vec3& point) const
{
float dist = dist2Plane(point);
if (dist > 0)
return PointSide::FRONT_PLANE;
else if (dist < 0)
return PointSide::BEHIND_PLANE;
else
return PointSide::IN_PLANE;
}


就这样了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: