org.opengis.geometry.coordinate.ParametricCurveSurface Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of gt-opengis Show documentation
Show all versions of gt-opengis Show documentation
Standard interfaces implemented throughout the library.
The newest version!
/*
* GeoTools - The Open Source Java GIS Toolkit
* http://geotools.org
*
* (C) 2011, Open Source Geospatial Foundation (OSGeo)
* (C) 2003-2005, Open Geospatial Consortium Inc.
*
* All Rights Reserved. http://www.opengis.org/legal/
*/
package org.opengis.geometry.coordinate;
import static org.opengis.annotation.Obligation.*;
import static org.opengis.annotation.Specification.*;
import org.opengis.annotation.UML;
import org.opengis.geometry.DirectPosition;
import org.opengis.geometry.complex.Complex;
import org.opengis.geometry.primitive.Curve;
import org.opengis.geometry.primitive.CurveInterpolation;
import org.opengis.geometry.primitive.Surface;
import org.opengis.geometry.primitive.SurfacePatch;
/**
* The surface patches that make up the parametric curve surfaces. {@code ParametricCurveSurface}
* are all continuous families of curves, given by a constructive function of the form:
*
*
*
* {@code surface}(s,t):
* [a,b]×[c,d] → {@link DirectPosition}
*
*
*
* By fixing the value of either parameter, we have a one-parameter family of curves.
*
*
*
* ct(s) = cs(t) = {@code
* surface}(s,t);
*
*
*
* The functions on {@code 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
*
* {@link Cylinder}
* Circle, constant radii
* Line Segment
*
* {@link Cone}
* Circle, decreasing radii
* Line Segment
*
* {@link Sphere}
* Circle of constant latitude
* Circle of constant longitude
*
* {@link BilinearGrid}
* Line string
* Line string
*
* {@link 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 {@linkplain #getUpNormal 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 {@linkplain #getUpNormal
* upNormal} implies that the surface is orientable. Non-orientable surfaces, such as the Möbius
* band and Klein bottle are counter-intuitive. {@link 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.
*
*
*
* @version ISO 19107
* @author Martin Desruisseaux (IRD)
* @since GeoAPI 2.0
*/
@UML(identifier = "GM_ParametricCurveSurface", specification = ISO_19107)
public interface ParametricCurveSurface extends SurfacePatch {
/**
* Indicates the type of surface curves used to traverse the surface horizontally with respect
* to the parameter s.
*/
@UML(identifier = "horizontalCurveType", obligation = MANDATORY, specification = ISO_19107)
CurveInterpolation getHorizontalCurveType();
/**
* Indicates the type of surface curves used to traverse the surface vertically with respect to
* the parameter t.
*/
@UML(identifier = "verticalCurveType", obligation = MANDATORY, specification = ISO_19107)
CurveInterpolation getVerticalCurveType();
/**
* 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 {@linkplain Complex
* 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.
*
*
*
* @param t The t value to hold constant.
* @return The curve that traverses the surface.
*/
@UML(identifier = "horizontalCurve", obligation = MANDATORY, specification = ISO_19107)
Curve horizontalCurve(double t);
/**
* Constructs a curve that traverses the surface vertically with respect to the parameter
* t. This curve holds the parameter s constant.
*
* @param s The s value to hold constant.
* @return The curve that traverses the surface.
*/
@UML(identifier = "verticalCurve", obligation = MANDATORY, specification = ISO_19107)
Curve verticalCurve(double s);
/** Traverses the surface both vertically and horizontally. */
@UML(identifier = "surface", obligation = MANDATORY, specification = ISO_19107)
DirectPosition surface(double s, double t);
}