zoukankan      html  css  js  c++  java
  • 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方向的向量值。

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

                    

          

  • 相关阅读:
    动态载入DLL
    在DELPHI中使用自定义光标
    Delphi实现提取可执行文件内部所有图标
    delphi 网络函数
    delphi制作dll
    实现半透明效果
    自绘按钮,添加Color属性(转载)
    为汉语名字生成首字母助记码
    DELPHI 获取本月 的第一天 和 最后一天
    GRID用法(取行、列值;定位选中某行等等)
  • 原文地址:https://www.cnblogs.com/xiaowangzi1987/p/14867816.html
Copyright © 2011-2022 走看看