View Javadoc

1   /* File Curve2D.java 
2    *
3    * Project : Java Geometry Library
4    *
5    * ===========================================
6    * 
7    * This library is free software; you can redistribute it and/or modify it 
8    * under the terms of the GNU Lesser General Public License as published by
9    * the Free Software Foundation, either version 2.1 of the License, or (at
10   * your option) any later version.
11   *
12   * This library is distributed in the hope that it will be useful, but 
13   * WITHOUT ANY WARRANTY, without even the implied warranty of MERCHANTABILITY
14   * or FITNESS FOR A PARTICULAR PURPOSE.
15   *
16   * See the GNU Lesser General Public License for more details.
17   *
18   * You should have received a copy of the GNU Lesser General Public License
19   * along with this library. if not, write to :
20   * The Free Software Foundation, Inc., 59 Temple Place, Suite 330,
21   * Boston, MA 02111-1307, USA.
22   */
23  
24  // package
25  
26  package math.geom2d.curve;
27  
28  // Imports
29  import java.awt.Graphics2D;
30  import java.awt.Shape;
31  import java.util.Collection;
32  
33  import math.geom2d.AffineTransform2D;
34  import math.geom2d.Box2D;
35  import math.geom2d.Point2D;
36  import math.geom2d.Shape2D;
37  import math.geom2d.line.LinearShape2D;
38  
39  /**
40   * <p>Interface for piecewise smooth curves, like polylines, conics, straight
41   * lines, line segments...</p>
42   * <p>Several interfaces exist to use more explicit type of curves:
43   * {@link ContinuousCurve2D ContinuousCurve2D} for finite or infinite
44   * continuous curves, {@link SmoothCurve2D SmoothCurve2D} for curves that
45   * admit a derivative (and hence a tangent, a curvature...) at each point, 
46   * {@link math.geom2d.domain.OrientedCurve2D OrientedCurve2D} that are used to
47   * define the {@link math.geom2d.domain.Boundary2D boundary} of a
48   * {@link math.geom2d.domain.Domain2D domain}...</p>
49   * <p>
50   * Points on curves are identified using curve parameterization. 
51   * This parameterization is left to the implementation.
52   */
53  public interface Curve2D extends Shape2D, Cloneable {
54  
55      // ===================================================================
56      // class variables
57  
58      // ===================================================================
59      // constructors
60  
61      // ===================================================================
62      // accessors
63  
64      /**
65       * Get value of parameter t for the first point of the curve. It can be
66       * -Infinity, in this case the piece of curve is not bounded.
67       */
68      public abstract double getT0();
69  
70      /**
71       * Get value of parameter t for the last point of the curve. It can be
72       * +Infinity, in this case the piece of curve is not bounded.
73       */
74      public abstract double getT1();
75  
76      /**
77       * Gets the point from a parametric representation of the curve. If the
78       * parameter lies outside the definition range, the parameter corresponding
79       * to the closest bound is used instead. This method can be used to draw an
80       * approximated outline of a curve, by selecting multiple values for t and
81       * drawing lines between them.
82       */
83      public abstract Point2D getPoint(double t);
84  
85      /**
86       * Get the first point of the curve. It must returns the same result as
87       * <code>getPoint(getT0())</code>.
88       * 
89       * @return the first point of the curve
90       */
91      public abstract Point2D getFirstPoint();
92  
93      /**
94       * Get the last point of the curve. It must returns the same result as
95       * <code>getPoint(getT1())</code>.
96       * 
97       * @return the last point of the curve.
98       */
99      public abstract Point2D getLastPoint();
100 
101     /**
102      * Returns a set of singular points, i. e. which do not locally admit
103      * derivative.
104      * 
105      * @return a collection of Point2D.
106      */
107     public abstract Collection<Point2D> getSingularPoints();
108 
109     /**
110      * Checks if a point is singular.
111      * 
112      * @param pos the position of the point on the curve
113      * @return true if the point at this location is singular
114      */
115     public abstract boolean isSingular(double pos);
116 
117     /**
118      * Get position of the point on the curve. If the point does not belong to
119      * the curve, return Double.NaN.
120      * 
121      * @param point a point belonging to the curve
122      * @return the position of the point on the curve
123      */
124     public abstract double getPosition(java.awt.geom.Point2D point);
125 
126     /**
127      * Returns the position of the closest orthogonal projection of the point on
128      * the curve, or of the closest singular point. This function should always
129      * returns a valid value.
130      * 
131      * @param point a point to project
132      * @return the position of the closest orthogonal projection
133      */
134     public abstract double project(java.awt.geom.Point2D point);
135 
136     /**
137      * Returns the intersection points of the curve with the specified line. The
138      * length of the result array is the number of intersection points.
139      */
140     public abstract Collection<Point2D> getIntersections(LinearShape2D line);
141 
142     /**
143      * Return the path for tracing the curve, when cursor is already located at
144      * the beginning of the curve. Using this method allows to concatenate
145      * curves and to draw polycurves.
146      * 
147      * @return the path for tracing the curve.
148      */
149     // public abstract java.awt.geom.GeneralPath getInnerPath();
150     /**
151      * Returns the curve with same trace on the plane with parametrization in
152      * reverse order.
153      */
154     public abstract Curve2D getReverseCurve();
155 
156     /**
157      * Returns the collection of continuous curves which constitute this curve.
158      * 
159      * @return a collection of continuous curves.
160      */
161     public abstract Collection<? extends ContinuousCurve2D> getContinuousCurves();
162 
163     /**
164      * Returns a portion of the original curve, delimited by two positions on
165      * the curve.
166      * 
167      * @param t0 position of the start of the sub-curve
168      * @param t1 position of the end of the sub-curve
169      * @return the portion of original curve comprised between t0 and t1.
170      */
171     public abstract Curve2D getSubCurve(double t0, double t1);
172 
173     /**
174      * Transforms the curve by an affine transform. The result is an instance of
175      * Curve2D.
176      */
177     //TODO: specifies orientation of transformed curve. Should we invert curve
178     // when transform is not direct ?
179     public abstract Curve2D transform(AffineTransform2D trans);
180 
181     /**
182      * When a curve is clipped, the result is a set of curves.
183      */
184     public abstract CurveSet2D<? extends Curve2D> clip(Box2D box);
185 
186     /**
187      * @since 0.7.1
188      * @return the shape corresponding to this curve
189      */
190     public java.awt.Shape getAsAWTShape() ;
191     
192     /**
193      * Draws the curve on the given Graphics2D object.
194      * 
195      * @param g2 the graphics to draw the curve
196      * @since 0.6.3
197      */
198     public abstract void draw(Graphics2D g2);
199 
200     /**
201      * Overrides Object declaration to ensure Curve2D implementation are
202      * cloned as Curve2D.
203      * @return the cloned curve
204      */
205     public abstract Curve2D clone();
206 
207 }