Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 将平面从点/法线/D转换为平面方程_Math_Plane - Fatal编程技术网

Math 将平面从点/法线/D转换为平面方程

Math 将平面从点/法线/D转换为平面方程,math,plane,Math,Plane,我有一个plane类,它将飞机存储为 Vector position; Vector normal; float d; (向量在助手类中仅为x、y、z) 多年来一直在使用它,几乎满足了我的所有目的。然而,我把它当作学者来使用,却没有真正思考它是如何工作的/为什么工作的 所以。。。我需要将其转换为float[4]格式,供朋友用于OpenGL渲染。在float[4]中,将点/法线/d转换为平面方程的正确方法是什么?我尝试的每件事似乎都有点不对劲 [编辑] 这是平面的Create()函数,它为d指定

我有一个plane类,它将飞机存储为

Vector position;
Vector normal;
float d;
(向量在助手类中仅为x、y、z)

多年来一直在使用它,几乎满足了我的所有目的。然而,我把它当作学者来使用,却没有真正思考它是如何工作的/为什么工作的

所以。。。我需要将其转换为float[4]格式,供朋友用于OpenGL渲染。在float[4]中,将点/法线/d转换为平面方程的正确方法是什么?我尝试的每件事似乎都有点不对劲

[编辑] 这是平面的Create()函数,它为d指定一个值

void            Create(Vector thePoint, Vector theNormal)
    {
        theNormal.Normalize();
        pos=thePoint;
        normal=theNormal;
        d=-theNormal.Dot(thePoint);
    }

使用齐次坐标,点是

 Point = [x,y,z,1] 
定义平面方程的步骤

平面坐标需要以下4个值

Plane = [n_x,n_y,n_z,-d]
其中
(nux,nuy,nuz)
是法向量,
d
是到原点的距离

现在取点和平面的点积,得到方程

[x,y,z,1] . [n_x,n_y,n_z,-d] = 0

x*n_x + y*n_y + z*n_z - d = 0
C#
code中,这是

public float[] GetCoord(Plane plane)
{
   return new float[] { plane.normal.X, plane.normal.Y, plane.normal.Z, -plane.d };
}

这类飞机的
d
是什么?平面可以在具有位置和法线的三维空间中唯一定义。平面方程(Ax+By+Cz+D=0)指定了一个具有法线(a、B、C)和单个值的平面,该值定义了从原点到平面(沿法线方向)的距离。但是如果你在平面上有一个点,你不需要D。那么这在你的结构中是什么呢?我已经编辑了正文来说明D是如何计算的。它是法线和位置的负点积。但是,我尝试用pos.xnormal.x+pos.ynnormal.y+pos.z*normal.z+d构建我的四个浮动,只产生喜剧效果。这个位置对于无限平面的定义来说是多余的。你所需要的就是法向量和到原点的距离,求反D是我唯一没有尝试的组合。谢谢你,陌生人。