## NURBS Geometry commands

The following commands describe geometric parts of NURBS elements: curves and surface.

### NURBSCURVE2D

```NURBSCURVE2D degree, nControlPoints,
knot_1, knot_2, ..., knot_m,
cPoint_1_x, cPoint_1_y, weight_1,
cPoint_2_x, cPoint_2_y, weight_2,
...,
cPoint_n_x, cPoint_n_y, weight_n```

### NURBSCURVE3D

```NURBSCURVE3D degree, nControlPoints,
knot_1, knot_2, ..., knot_m,
cPoint_1_x, cPoint_1_y, cPoint_1_z, weight_1,
cPoint_2_x, cPoint_2_y, cPoint_2_z, weight_2,
...,
cPoint_n_x, cPoint_n_y, cPoint_n_z, weight_n```

2 and 3 dimensional NURBS curves with given degree, knotvector, controlpoints and weigths.

`degree: `degree of NURBS curve, one less than order of curve (`order = degree + 1`), positive.
`nControlPoints: `number of control points (n), greater than the degree of the curve (not less than the order).
`knot_i: `index i knot value
• number of knot values (`m`, the size of knot vector) is given by the following: `m = degree + 1 + n`
• knots are in non-descending order (`knot_i <= knot_{i+1}`)
• equal knot values are allowed, with multiplicity up to degree, or with multiplicity up to `degree + 1` for the first and last knot.
`cPoint_i_x, cPoint_i_y, cPoint_i_z: `coordinates of index i control point.
`weight_i: `weigth of index i control point, positive

Periodic curves are not handled separately, but described as floating (not clamped) NURBS curves which are geometrically closed and have appropriately continuous connection at the the ends. This is ensured by repeating sufficient number of control points and knot-intervals at the end:

• the last degree many control points are duplicates of the first degree many control points (not in reverse order),
• the first twice-the-degree number of knot-differences (`knot_1-knot_0, knot_2-knot_1, ...`) are the same as the last ones in the knot vector (these are the knots which are in connection with the first (or last) degree many control points).

The usable domain of a curve is the closed interval between `knot_{degree + 1}` and `knot_{m - degree}`.

### NURBSSURFACE

```NURBSSURFACE degree_u, degree_v, nu, nv,
knot_u_1, knot_u_2, ..., knot_u_mu,
knot_v_1, knot_v_2, ..., knot_v_mv,
cPoint_1_1_x, cPoint_1_1_y, cPoint_1_1_z, weight_1_1,
cPoint_1_2_x, cPoint_1_2_y, cPoint_1_2_z, weight_1_2,
...,
cPoint_1_nv_x, cPoint_1_nv_y, cPoint_1_nv_z, weight_1_nv,
cPoint_2_1_x, cPoint_2_1_y, cPoint_2_1_z, weight_2_1,
...,
cPoint_nu_nv_x, cPoint_nu_nv_y, cPoint_nu_nv_z, weight_nu_nv```

3-dimensional NURBS surface with u-v parameter space, given degree, knotvectors in `u` and `v` directions and given controlpoint, weigth net. Degrees are one less than orders of surface (`order_u = degree_u + 1`), degrees are positive.

`degree_u: `degree of surface in the u parameter direction
`degree_v: `degree of surface in the v parameter direction
`nu, nv: `number of control points in u and v directions, greater than degree (not less than order) of then surface in given direction
`knot_u_i, knot_v_i: `index i knot value in u and v directions
• their number (the size of knot vector) is given by the following: `mu = degree_u + 1 + nu`
• knots are in non-descending order (`knot_u_i <= knot_u_{i+1}, knot_v_i <= knot_v_{i+1}`)
• equal knot values are allowed, with multiplicity up to degree, or with multiplicity up to `degree + 1` for the first and last knot.
`cPoint_i_x, cPoint_i_y, cPoint_i_z: `control point on the control point net, index i in the u direction, index j in the v direction
`weight_i_j: `weight for control point cPoint_ij, positive

Surfaces may be periodic in either (`u` or `v`) direction or in both directions. Periodic surfaces are not handled separately, but described as floating (not clamped) NURBS surfaces which are geometrically closed and have appropriately continuous connection at the the ends. This is ensured the same way as in case of curves.
The usable domain of a surface is the cross product of the closed intervals between `knot_u_{degree_u + 1}`, `knot_u_{mu - degree_u}` and `knot_v_{degree_v + 1}`, `knot_v_{mv - degree_v}` respectively.