Revit中点与向量

一.点(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方向的向量值。

                                            最后判断是否需要对向量进行反向。

 

 

                

      

posted @ 2021-06-09 17:25  小王子的博客  阅读(773)  评论(0编辑  收藏  举报