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方向的向量值。

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

                    

          

  • 相关阅读:
    SQL学习记录
    Python 函数和变量作用域
    Python 使用socket实现一对多通信
    Flask wtforms validate_on_submit() 无法返回值问题
    Flask WTForm BooleanField用法
    Python3 中的nonlocal用法
    Python 实现二进制循环效果
    Python 各种类型转换
    第一章:数据结构
    Python Challenge
  • 原文地址:https://www.cnblogs.com/xiaowangzi1987/p/14867816.html
Copyright © 2011-2022 走看看