【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  定义原点(在新坐标系定义旧坐标系)

posted @ 2023-05-15 16:59  90Red  阅读(291)  评论(0编辑  收藏  举报