一.点(XYZ)
Revit是三维的系统,所以点(XYZ)也是三维的坐标体系。
1.点的操作
点的操作就不用多说了,加减乘除而已
public XYZ Add(XYZ source); public XYZ Divide(double value); public XYZ Multiply(double value); public XYZ Subtract(XYZ source); public static XYZ operator +(XYZ left, XYZ right); public static XYZ operator -(XYZ source); public static XYZ operator -(XYZ left, XYZ right); public static XYZ operator *(double value, XYZ right); public static XYZ operator *(XYZ left, double value); public static XYZ operator /(XYZ left, double value);
在Revit中点也是向量的一种表示形式。
点与点之间的距离:public double DistanceTo(XYZ point); RevitAPI函数
二.向量(XYZ)
向量的操作
1.相对于其他向量和平面的角度
public double AngleOnPlaneTo(XYZ right,XYZ normal) 向量和指定平面的夹角
public double AngleTo(XYZ p) 两个向量之间的夹角
2.叉乘和级乘
public XYZ CrossProduct(XYZ point) 叉乘--两个向量的模 例如 Basis.X与Basis.Y的叉乘就是Basis.Z, 俗称--结果为两个向量构成平面的法向量,遵守右手定则
public double DotProduct(XYZ point) 级乘--两个向量的夹角
3.向量的其他操作
public XYZ Negate(); // 反转
public XYZ Normalize(); // 正则化
public double TripleProduct(XYZ middle, XYZ right); // 叉乘再点乘
三.代码示例
用途: 获取给定曲线在xoy平面内,给定点一侧的法线
public static XYZ GetCurveNormal(Curve curve, XYZ point) { XYZ nor = null; if (curve is Line) { Line line = curve as Line; nor = plane.Normal; } else { var transf = curve.ComputeDerivatives(0.5, true); nor = transf.BasisY.Normalize(); } XYZ start = curve.GetEndPoint(0); XYZ tempVector = new XYZ(point.X, point.Y, start.Z) - start; //指向p点,并忽略高度 if (tempVector.DotProduct(nor) > 0) { //夹角小于90° return nor; } else { return nor.Negate(); } }
上述代码:
1.curve.ComputeDerivatives(0.5, true); 表示获取中点位置的转换矩阵。
2.逻辑:如果传入的曲线是直线,只需要获取Normal,如果是曲线,则获取中点位置的转换矩阵,在通过矩阵获取该点位置的Y方向的向量值。
最后判断是否需要对向量进行反向。