【Revit二开】几何运算基础
Revit几何对象
点
在Revit中,用于存储点三维位置信息的类是XYZ(除了点以外,向量也同样使用XYZ存储)
XYZ类型变量有两种声明方式,一种是默认的构造函数XYZ()即坐标原点(0, 0, 0),一种是传入三个Double数值的构造函数XYZ(Double, Double, Double)
而第二种由于传入参数是Double类型,其精确度是有限的
在比较两个XYZ类型变量时,XYZ类提供的既有方法IsAlmostEqualTo()有两种函数重载:
第一种是IsAlmostEqualTo(XYZ),误差是1.0e-09
第二种是IsAlmostEqualTo(XYZ, Double),可以用后面的这个Double参数自定义误差
其他XYZ的既有几何运算方法:
点乘 DotProduct
叉乘 CrossProduct 注意:Revit中的坐标系统一为右手坐标系(进行叉乘运算的时候要用右手判断叉乘方向)
加 Addition
减 Subtraction
乘 Multiply
除 Division
取相反数 UnaryNegation
线
在RevitAPI中用Curve作为线对应的类,同时Curve又包含了一些子类,比如:Arc弧,Ellipse椭圆,NURBs非均匀有理b样条曲线(计算机图形学中常用的数学模型,用于产生和表示曲线及曲面)
CreateOffset(double offsetDist, XYZ referenceVector) 这个方法可以创建一个带有偏移的Curve(这么设置传入参数主要是用于Curve比较复杂的子类的偏移情况,具体原因可以在API中Curve.CreateOffset Method下的Remarks详细查看),参数列表中用一个double类型值设置偏移距离(长度),用一个XYZ类型值来设置参考向量(方向)
我们可以使用Intersect(Curve curve, out IntersectionResultArray resultArray)方法求得一个表示两条Curve位置关系判断结果的SetComparisonResult类型值,主要有以下几种结果:
相交 Overlap
共线 Subset(两条线段,在一条直线上且有一个交点)
重叠 Superset(一条射线,一条线段,两者有一个交点)
相同 Equal(重叠部分超过了一个点)
无交点 Disjoint
其他常用方法:
CurveReversed 端点调换
Evaluate(double parameter, bool normalized) 使用一个double类型的值求Curve上某一个点的坐标,如果调用此方法的主体Curve是一条线段,那么bool类型值则为true,前面的double值也只能在0-1之间(相当于是该点到线段起点的距离与整条线段长度的比值);而如果Curve是一条射线,那么bool类型值则为false,前面的double值非负即可
GetEndPoint(int index) 取端点,如果是起点则int类型值为0,如果是终点则int类型值为1
面
Face,不能直接创建,只能以成员的形式从Solid中获取
一个面可能包含多个封闭曲线CurveLoop
边
Edge,和面一样,同样不能直接创建,而需要以成员的形式从Solid中获取
体
Solid
空间变换运算
变换矩阵
Transform类,本质是一个4X4矩阵
相关矩阵运算方法:
CreateReflection 创建一个镜像矩阵
CreateRotation 创建一个旋转矩阵
CreateRotationAtPoint 创建一个基于某点旋转的矩阵
CreateTranslation 创建一个平移的变换矩阵
Multiply 矩阵相乘
OfPoint 对一个点进行矩阵变换
OfVector 对一个向量进行矩阵变换
属性:
BasisX 对应rxx,rxy, rxz
BasisY 对应ryx,ryy,ryz
BasisZ 对应rzx,rzy,rzz
Determinant 行列式值
Identity 单位矩阵
Inverse 逆矩阵
Scale 缩放
Origin 定义原点(在新坐标系定义旧坐标系)