目录
本篇介绍SpaceClaim二次开发文档的第八章。(使用的翻译,如有错误,敬请指正)。
第八章 Accuracy(精确性)
8.1 线性和角度分辨率
在内部,执行几何计算以加工双精度。比较计算结果时,应始终在特定分辨率范围内比较数值。这些分辨率由准确度等级提供:
如果两个长度之差小于LinearResolution,则认为它们相等。
如果两个角度之差小于AngularResolution,则认为它们相等。
例如,当调用ContainsPoint以确定点是否位于曲面中时,可能会在内部计算到曲面的距离,如果此距离小于LinearResolution,则结果为true。
8.2 比较长度和角度
Accuracy类提供比较长度和角度的方法。CompareLn方法接受两个参数lengthA和lengthB,并返回一个整数结果:
-1 长度A小于长度B。
0 lengthA等于lengthB,在线性分辨率内。
+1 长度A大于长度B。
此方法提供两个长度的一般比较,但对于常见情况,例如与零比较,或测试两个值是否相等,可以使用更简单,更可读的方法:
public static void Example(double lengthA, double lengthB) {
// same as CompareLengths(lengthA, lengthB) == 0
bool equalLengths = Accuracy.EqualLengths(lengthA, lengthB);
// same as CompareLengths(lengthA, 0) == 0
bool lengthIsZero = Accuracy.LengthIsZero(lengthA);
// same as CompareLengths(lengthA, 0) > 0
bool lengthIsPositive = Accuracy.LengthIsPositive(lengthA);
// same as CompareLengths(lengthA, 0) < 0
bool lengthIsNegative = Accuracy.LengthIsNegative(lengthA);
}
为角度提供了相应的方法:CompareAngles、CompreAngles、AngleIsZero、AngleIsPositive和AngleIsNegative。
8.3 比较XYZ对象
基本的XYZ类型(Point、Vector、Direction、Box和Frame)都内置了分辨率测试,因此可以使用==运算符比较对象。例如,如果两个点之间的距离小于线性分辨率,则两个点相等;如果两个点之间的角度小于角分辨率,则两个方向相等。
public static void Example(Plane plane, Point point) {
// project point onto plane 将点投影到平面上
SurfaceEvaluation eval = plane.ProjectPoint(point);
Point pointOnPlane = eval.Point;
// points are the same if less than linear resolution apart 如果间隔小于线性分辨率,则点相同
bool planeContainsPoint = point == pointOnPlane;
// ContainsPoint is more efficient, but gives the same result
Debug.Assert(planeContainsPoint == plane.ContainsPoint(point));
}
8.4 比较UV对象
对于曲面参数UV类型PointUV、VectorUV、DirectionUV和BoxUV或曲线参数类型Interval,情况并非如此。这些类型不知道它们表示的参数化是线性的、角度的还是其他类型。例如,对于平面,U参数化是线性的,但对于圆柱体,U参数化是有角度的。对于NURBS曲面,U参数化既不是线性的,也不是角度的。
因此,不应该对这些类型使用==运算符。比较参数时,应对每个U和V值使用适当的长度或角度比较方法。对于NURBS参数化,可以使用角度比较,但最安全的方法是计算点并比较这些点。
8.5 比较几何体
说两个曲面或两条曲线相等是模棱两可的,因为对这个概念有不止一种解释。例如,对于两个平面:
它们可以共面,但法线可以相反。
它们可以是共面的,法线具有相同的意义,但它们的框架以及它们的参数化可能不同。
他们可能在各个方面都是一样的。
不应该对曲面和曲线类型使用==运算符,因为这只会测试参照相等性。
提供了Geometry.IsCoincident和ITrimmedCurve.lsCoincident以进行比较。他们只测试巧合,这意味着上述任何情况都会通过。