在计算设计中,曲线和曲面经常用作基础功能,用于构建后续几何体。为了使早期几何体用作以后几何体的基础,脚本必须能够提取诸如整个对象区域的位置和方向等特性。曲线和曲面均支持此提取,并且称为参数化。
    曲线上的所有点可以看作具有从 0 到 1 的唯一参数。如果基于多个控制点或插值点创建 NurbsCurve,则第一个点将具有参数 0,而最后一个点将具有参数 1。不可能提前知道什么是精确参数以及什么是中间点,这听起来像是严重限制,但这可通过一系列实用程序函数来减轻。虽然使用两个参数而不是一个参数(称为 u 和 v),但曲面的参数化与曲线相似。如果我们要使用以下点创建一个曲面:

    1. pts = [ [p1, p2, p3],
    2. [p4, p5, p6],
    3. [p7, p8, p9] ];

    p1 将具有参数 u = 0 v = 0,而 p9 将具有参数 u = 1 v = 1。
    在确定用于生成曲线的点时,参数化并非特别有用,其主要用途是确定 NurbsCurve 和 NurbsSurface 构造函数生成中间点时的位置。
    曲线具有 PointAtParameter 方法,该方法采用 0 到 1 之间的单个双精度参数,并返回该参数处的“点”对象。例如,此脚本会在参数 0、.1、.2、.3、.4、.5、.6、.7、.8、.9 和 1 处查找点:
    12.7 几何参数化 - 图1

    1. pts = {};
    2. pts[0] = Point.ByCoordinates(4, 0, 0);
    3. pts[1] = Point.ByCoordinates(6, 0, 1);
    4. pts[2] = Point.ByCoordinates(4, 0, 2);
    5. pts[3] = Point.ByCoordinates(4, 0, 3);
    6. pts[4] = Point.ByCoordinates(4, 0, 4);
    7. pts[5] = Point.ByCoordinates(3, 0, 5);
    8. pts[6] = Point.ByCoordinates(4, 0, 6);
    9. crv = NurbsCurve.ByPoints(pts);
    10. pts_at_param = crv.PointAtParameter(0..1..#11);
    11. // draw Lines to help visualize the points
    12. lines = Line.ByStartPointEndPoint(pts_at_param,
    13. Point.ByCoordinates(4, 6, 0));

    同样,曲面具有 PointAtParameter 方法,该方法采用两个参数,即生成点的 u 和 v 参数。
    尽管提取曲线和曲面上的各个点非常有用,但脚本通常需要了解参数处的特定几何特征,例如曲线或曲面面对的方向。CoordinateSystemAtParameter 方法不仅可以查找位置,还能查找位于曲线或曲面参数处的定向 CoordinateSystem。例如,以下脚本沿旋转曲面提取定向 CoordinateSystems,并使用 CoordinateSystems 的方向生成将法线粘滞到曲面的线:
    12.7 几何参数化 - 图2

    1. pts = {};
    2. pts[0] = Point.ByCoordinates(4, 0, 0);
    3. pts[1] = Point.ByCoordinates(3, 0, 1);
    4. pts[2] = Point.ByCoordinates(4, 0, 2);
    5. pts[3] = Point.ByCoordinates(4, 0, 3);
    6. pts[4] = Point.ByCoordinates(4, 0, 4);
    7. pts[5] = Point.ByCoordinates(5, 0, 5);
    8. pts[6] = Point.ByCoordinates(4, 0, 6);
    9. pts[7] = Point.ByCoordinates(4, 0, 7);
    10. crv = NurbsCurve.ByPoints(pts);
    11. axis_origin = Point.ByCoordinates(0, 0, 0);
    12. axis = Vector.ByCoordinates(0, 0, 1);
    13. surf = Surface.ByRevolve(crv, axis_origin, axis, 90,
    14. 140);
    15. cs_array = surf.CoordinateSystemAtParameter(
    16. (0..1..#7)<1>, (0..1..#7)<2>);
    17. def make_line(cs : CoordinateSystem) {
    18. lines_start = cs.Origin;
    19. lines_end = cs.Origin.Translate(cs.ZAxis, -0.75);
    20. return = Line.ByStartPointEndPoint(lines_start,
    21. lines_end);
    22. }
    23. lines = make_line(Flatten(cs_array));

    如前所述,参数化在曲线或曲面的长度上并非始终统一,这意味着参数 0.5 并不始终与中点对应,0.25 并不始终对应于曲线或曲面上的 1/4 点。为了解决此限制,曲线还有一组附加的参数化命令,使您可以沿曲线找到特定长度处的点。