在给定的域中,我需要在3D空间中表示数学平面,因此我打算创建一个Plane3D
类。
我还有Point3D
,Vector3D
,Ray3D
等等。主要用例是测试/找到线平面交点,线平面角度和其他几何运算。
问题是:
在类中实现平面定义是一种好的,规范的,计算友好的方法吗?
最明显的候选人将是"点正常"形式,有六个数字参数(点的三个坐标,三个矢量)和#34;一般(代数)形式",有四个数字参数(每个坐标一个系数和一个常数)。其中一个在计算上更受欢迎吗?
此外,是否有任何开源,高级3D几何库已经实现了这个类,值得寻找灵感?
OBS:由于.NET有System.Windows.Media.Media3D
库和一些有用的类,我很可能会在C#中实现它,利用Point3D
和Vector3D
结构,但是我认为这个问题与语言无关。
答案 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+d
和s2=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°,这意味着你得到了直线和平面之间角度的正弦。