/* * 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.primitive; import org.opengis.annotation.Association; import org.opengis.annotation.UML; import static org.opengis.annotation.Obligation.*; import static org.opengis.annotation.Specification.*; /** * Primitives that can be mirrored into new geometric objects in terms of their internal local * coordinate systems (manifold charts). For curves, the orientation reflects the direction in * which the curve is traversed, that is, the sense of its parameterization. When used as boundary * curves, the surface being bounded is to the "left" of the oriented curve. For surfaces, the * orientation reflects from which direction the local coordinate system can be viewed as right * handed, the "top" or the surface being the direction of a completing <var>z</var>-axis that * would form a right-handed system. When used as a boundary surface, the bounded solid is "below" * the surface. The orientation of points and solids has no immediate geometric interpretation in * 3-dimensional space. * <p> * {@code OrientablePrimitive} objects are essentially references to geometric primitives * that carry an "orientation" reversal flag (either "+" or "-") that determines whether this * primitive agrees or disagrees with the orientation of the referenced object. * * <blockquote><font size=2> * <strong>NOTE:</strong> There are several reasons for subclassing the "positive" primitives * under the orientable primitives. First is a matter of the semantics of subclassing. Subclassing * is assumed to be a "is type of" hierarchy. In the view used, the "positive" primitive is simply * the orientable one with the positive orientation. If the opposite view were taken, and orientable * primitives were subclassed under the "positive" primitive, then by subclassing logic, the * "negative" primitive would have to hold the same sort of geometric description that the * "positive" primitive does. The only viable solution would be to separate "negative" primitives * under the geometric root as being some sort of reference to their opposite. This adds a great * deal of complexity to the subclassing tree. To minimize the number of objects and to bypass this * logical complexity, positively oriented primitives are self-referential (are instances of the * corresponding primitive subtype) while negatively oriented primitives are not. * </font></blockquote> * * * @source $URL: http://svn.osgeo.org/geotools/trunk/modules/library/opengis/src/main/java/org/opengis/geometry/primitive/OrientablePrimitive.java $ * @version <A HREF="http://www.opengeospatial.org/standards/as">ISO 19107</A> * @author Martin Desruisseaux (IRD) * @since GeoAPI 1.0 */ @UML(identifier="GM_OrientablePrimitive", specification=ISO_19107) public interface OrientablePrimitive extends Primitive { /** * Determines which of the two possible orientations this object represents. * * @return +1 for a positive orientation, or -1 for a negative orientation. */ @UML(identifier="orientation", obligation=MANDATORY, specification=ISO_19107) int getOrientation(); /** * Returns the primitive associated with this {@code OrientablePrimitive}. * Each {@linkplain Primitive primitive} of dimension 1 or 2 is associated * to two {@code OrientablePrimitive}s, one for each possible orientation. * For curves and surfaces, there are exactly two orientable primitives * for each geometric object. For the positive orientation, the orientable * primitive shall be the corresponding {@linkplain Curve curve} or * {@linkplain Surface surface}. * <p> * This method is <em>optional</em> since the association in ISO 19107 is navigable * only from {@code Primitive} to {@code OrientablePrimitive}, not the other way. * * @return The primitive, or {@code null} if the association is * not available or not implemented that way. * * @see Primitive#getProxy * @issue http://jira.codehaus.org/browse/GEO-63 */ @Association("Oriented") @UML(identifier="primitive", obligation=OPTIONAL, specification=ISO_19107) Primitive getPrimitive(); }