## org.opengis.geometry.coordinate
Interface ParametricCurveSurface

All Superinterfaces:
  GenericSurface, SurfacePatch

All Known Subinterfaces:
  BicubicGrid, BilinearGrid, BSplineSurface, Cone, Cylinder, GriddedSurface, Sphere

    @UML(identifier="GM_ParametricCurveSurface",
         specification=ISO_19107)
    public interface ParametricCurveSurface

extends SurfacePatch

The surface patches that make up the parametric curve surfaces. `ParametricCurveSurface` are all continuous families of curves, given by a constructive function of the form:

> `surface`(s,t): [a,b]×[c,d] → `DirectPosition`

By fixing the value of either parameter, we have a one-parameter family of curves.

> ct(s) = cs(t) = `surface`(s,t);

The functions on `ParametricCurveSurface` shall expose these two families of curves. The first gives us the "horizontal" cross sections ct(s), the later the "vertical" cross sections cs(t). The terms "horizontal" and "vertical" refer to the parameter space and need not be either horizontal or vertical curves in the coordinate reference system. The table below lists some possible pairs of types for these surface curves (other representations of these same surfaces are possible).

Surface type | Horizontal Curve type | Vertical curve type
--- | --- | ---
`Cylinder` | Circle, constant radii | Line Segment
`Cone` | Circle, decreasing radii | Line Segment
`Sphere` | Circle of constant latitude | Circle of constant longitude
`BilinearGrid` | Line string | Line string
`BicubicGrid` | Cubic spline | Cubic spline

The two partial derivatives of the surface parameterization, i and j are given by:

> TODO: copy equations there

and

> TODO: copy equations there

The default upNormal for the surface shall be the vector cross product of these two curve derivatives when they are both non-zero:

> k = i × j

If the coordinate reference system is 2D, then the vector k extends the local coordinate system by supplying an "upward" elevation vector. In this case the vector basis (i, j) must be a right hand system, that is to say, the oriented angle from i to j must be less than 180°. This gives a right-handed "moving frame" of local coordinate axes given by <i, j>. A moving frame is defined to be a continuous function from the geometric object to a basis for the local tangent space of that object. For curves, this is the derivative of the curve, the local tangent. For surfaces, this is a local pair of tangents. Parameterized curve surfaces have a natural moving frame and it shall be used as defined in this paragraph to define the upNormal of the surface.

> NOTE: The existence of a viable moving frame is the definition of "orientable" manifold. This is why the existence of a continuous upNormal implies that the surface is orientable. Non-orientable surfaces, such as the Möbius band and Klein bottle are counter-intuitive. `Surface` forbids their use in application schemas conforming to the ISO 19107 standard. Klein bottles cannot even be constructed in 3D space, but require 4D space for non-singular representations.

Since:
  GeoAPI 2.0
Version:
  ISO 19107

Method Summary
`CurveInterpolation` `getHorizontalCurveType()` Indicates the type of surface curves used to traverse the surface horizontally with respect to the parameter s.
`CurveInterpolation` `getVerticalCurveType()` Indicates the type of surface curves used to traverse the surface vertically with respect to the parameter t.
`Curve` `horizontalCurve(double t)` Constructs a curve that traverses the surface horizontally with respect to the parameter s.
`DirectPosition` `surface(double s, double t)` Traverses the surface both vertically and horizontally.
`Curve` `verticalCurve(double s)` Constructs a curve that traverses the surface vertically with respect to the parameter t.

Methods inherited from interface SurfacePatch
`getBoundary, getInterpolation, getNumDerivativesOnBoundary, getSurface`

Methods inherited from interface GenericSurface
`getArea, getPerimeter, getUpNormal`

Method Detail

### getHorizontalCurveType

    @UML(identifier="horizontalCurveType",
         obligation=MANDATORY,
         specification=ISO_19107)
    CurveInterpolation getHorizontalCurveType()

  Indicates the type of surface curves used to traverse the surface horizontally with respect to the parameter s.

### getVerticalCurveType

    @UML(identifier="verticalCurveType",
         obligation=MANDATORY,
         specification=ISO_19107)
    CurveInterpolation getVerticalCurveType()

  Indicates the type of surface curves used to traverse the surface vertically with respect to the parameter t.

### horizontalCurve

    @UML(identifier="horizontalCurve",
         obligation=MANDATORY,
         specification=ISO_19107)
    Curve horizontalCurve(double t)

  Constructs a curve that traverses the surface horizontally with respect to the parameter s. This curve holds the parameter t constant.

  > NOTE: The curve returned by this function or by the corresponding vertical curve function, are normally not part of any complex to which this surface is included. These are, in general, calculated transient values. The exceptions to this may occur at the extremes of the parameter space. The boundaries of the parameter space support for the surface map normally to the boundaries of the target surfaces.

  Parameters:
    `t` - The t value to hold constant.
  Returns:
    The curve that traverses the surface.

### verticalCurve

    @UML(identifier="verticalCurve",
         obligation=MANDATORY,
         specification=ISO_19107)
    Curve verticalCurve(double s)

  Constructs a curve that traverses the surface vertically with respect to the parameter t. This curve holds the parameter s constant.

  Parameters:
    `s` - The s value to hold constant.
  Returns:
    The curve that traverses the surface.

### surface

    @UML(identifier="surface",
         obligation=MANDATORY,
         specification=ISO_19107)
    DirectPosition surface(double s,
                                                                                  double t)

  Traverses the surface both vertically and horizontally.

Copyright © 1994-2008 Open Geospatial Consortium. All Rights Reserved.