All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opengis.geometry.coordinate.ParametricCurveSurface Maven / Gradle / Ivy

There is a newer version: 24.2-oss84-1
Show 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 * (ij) 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); }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy