Revit开发中经常会需要把其他标高的上的点投影到另一个标高的平面上,对于只需要在Z轴上投影,最简单的办法就是直接New一个新的XYZ,Z坐标换成新的平面的高度即可。但是如果平面不是XOY平面,或者任意的平面,这种做法就不好用了。下面实现一个简单的点投影到Plane的算法
假设有一个空间点P(10,20,30),有一个平面是由Origin(1,4,10)和Normal(0,0,1)确定,现在需要把把P投影到平面上:
//准备数据
var p=new XYZ(10,20,30);
var origin=new XYZ(1,4,10);
var normal=new XYZ(0,0,1);
var plane=Plane.CreateByOriginAndNormal(origin,normal);
public static XYZ Project(this XYZ point,Plane plane)
{
//这个是从平面的Origin指向需要投影点的向量
var vector=origin-point;
//这个是点到平面的距离
//其实distance是OP在平面plane的法向方向的投影距离,因为法向是单位向量
//所以可以认为是P点到平面plane的距离
var distance=vector.DotProduct(plane.Normal);
//点投影到平面,其实就是计算点到平面的距离
//因为知道了点到平面的距离,沿着法相的反方向便宜距离,就可以得到点在平面的投影点
return point-plane.Normal.Normalize()*distance;
}