我该如何实现表示几何平面的类?

时间:2014-04-30 13:05:22

标签: oop math 3d language-agnostic computational-geometry

在给定的域中,我需要在3D空间中表示数学平面,因此我打算创建一个Plane3D类。

我还有Point3DVector3DRay3D等等。主要用例是测试/找到线平面交点,线平面角度和其他几何运算。

问题是:

  

在类中实现平面定义是一种好的,规范的,计算友好的方法吗?

最明显的候选人将是"点正常"形式,有六个数字参数(点的三个坐标,三个矢量)和#34;一般(代数)形式",有四个数字参数(每个坐标一个系数和一个常数)。其中一个在计算上更受欢迎吗?

此外,是否有任何开源,高级3D几何库已经实现了这个类,值得寻找灵感?

OBS:由于.NET有System.Windows.Media.Media3D库和一些有用的类,我很可能会在C#中实现它,利用Point3DVector3D结构,但是我认为这个问题与语言无关。

1 个答案:

答案 0 :(得分:2)

我会选择你所谓的代数形式。如果(x,y,z),则(a,b,c,d)点在a*x+b*y+c*z+d=0平面上。

要将该平面与(x1,y1,z1)(x2,y2,z2)所跨越的线相交,请计算s1=a*x1+b*y1+c*z1+ds2=a*x2+b*y2+c*z2+d。然后你的交点由

定义
x=(s1*x2-s2*x1)/(s1-s2)
y=(s1*y2-s2*y1)/(s1-s2)
z=(s1*z2-s2*z1)/(s1-s2)

要计算直线与平面之间的角度,只需计算

即可
sin(α)=(a*x+b*y+c*z)/sqrt((a*a+b*b+c*c)*(x*x+y*y+z*z))

其中(a,b,c)表示平面的此表示中的法线向量,(x,y,z)是线的方向向量,即(x2-x1,y2-y1,z2-z1)。该等式基本上是归一化的点积,并且因此等效于两个矢量之间的余弦。由于法向量垂直于平面,正弦和余弦相差90°,这意味着你得到了直线和平面之间角度的正弦。