Class PicSmoothPolygon

  • All Implemented Interfaces:
    Element, PicMultiCurveConvertable, PicObjectConstants, ActionFactory, CustomizerFactory

    public class PicSmoothPolygon
    extends AbstractCurve
    implements ActionFactory, CustomizerFactory, PicMultiCurveConvertable

    A multicurve, either close or not, whose geometry is specified using a polygon, in such a way that the curve snakes "smoothly" along the polygon. For each polygon point, a coefficient helps altering the smoothness of the the path. Like the class it inherits from, this element has a variable number of user-controlled points that can be added/inserted/deleted by the user.
    Each polygon point is also an anchor point (e.g. for grid alignment).

    Implementation notes : inherited pts ArrayList acts as an array of specification points for the multicurve (this behaviour being mostly inherited from superclass). Besides, there's an ArrayList of PicPoint's, namely polygonPts, which backs the geometry of the polygon, and acts as a list of user-controlled points. Moving a control-point thus updates specification points as appropriate. [SR:todo:11/01/2003] add documentation about curve equation.

    Since:
    jpicedt 1.3.3
    Version:
    $Id: PicSmoothPolygon.java,v 1.18.2.1 2007/09/02 11:56:27 reynal Exp $
    Author:
    Vincent Guirardel
    • Field Detail

      • polygonPts

        protected java.util.ArrayList polygonPts
        An array of PicPoint's backing the geometry of the polygon. Aka caching mechanism holding a list of user-controlled points.
      • smoothCoeff

        protected java.util.ArrayList smoothCoeff
        The following array contains one Double per polygon point, specifying how close to polygon points the curve should go along.
      • DEFAULT_SMOOTH_COEFF

        protected static double DEFAULT_SMOOTH_COEFF
        the default value for the smoothness coefficient on startup. [SR:pending] fetch from a Properties object in constructor
      • COEF_SLIDER_MIN

        protected static int COEF_SLIDER_MIN
        Min value of smoothness coefficient accessible to JSlider in the geometry editor
      • COEF_SLIDER_MAX

        protected static int COEF_SLIDER_MAX
        Max value of smoothness coefficient accessible to Jslider in the geometry editor
    • Constructor Detail

      • PicSmoothPolygon

        public PicSmoothPolygon()
        Create a new empty open smooth polygon, with a default attribute set.
      • PicSmoothPolygon

        public PicSmoothPolygon​(boolean closed)
        Create a new empty smooth polygon, open or closed, with a default attribute set bound to it.
        Parameters:
        closed - whether the generated multi-curve will be closed or not
      • PicSmoothPolygon

        public PicSmoothPolygon​(boolean closed,
                                PicAttributeSet set)
        Create a new empty smooth polygon with the given attribute set.
        Parameters:
        set - attribute set to be bound to this element
        closed - whether the generated multi-curve will be closed or not
      • PicSmoothPolygon

        public PicSmoothPolygon​(PicPoint[] polyPts,
                                boolean closed,
                                double smoothCoeff,
                                PicAttributeSet set)
        Create a new smooth polygon initialized from the given array of PicPoint's.
        Parameters:
        polyPts - array of PicPoint's specifying the polygon geometry.
        set - attribute set to be bound to this element
        closed - whether the generated multi-curve will be closed or not
        smoothCoeff - the default smoothness value for each polygon point
        Since:
        PicEdt 1.3.3
      • PicSmoothPolygon

        public PicSmoothPolygon​(PicPoint[] polygonPts,
                                boolean closed,
                                double[] smoothCoeffs,
                                PicAttributeSet set)
        Create a new smooth polygon initialized from the given array of PicPoint's, using the given array of smoothness values. If array sizes do not match, number of polygon points gets trimmed to the smaller of both.
        Parameters:
        polygonPts - array of PicPoint's specifying the polygon geometry.
        set - attribute set to be bound to this element
        closed - whether the generated multi-curve will be closed or not
        smoothCoeff - array of smoothness values for each polygon point
        Since:
        PicEdt 1.3.3
      • PicSmoothPolygon

        public PicSmoothPolygon​(PicPoint[] polygonPts,
                                boolean closed,
                                PicAttributeSet set)
        Create a new smooth polygon initialized from the given array of PicPoint's, using the default smoothness value.
        Parameters:
        polygonPts - array of PicPoint's specifying the polygon geometry.
        set - attribute set to be bound to this element
        closed - whether the generated multi-curve will be closed or not
        Since:
        PicEdt 1.3.3
      • PicSmoothPolygon

        public PicSmoothPolygon​(PicSmoothPolygon poly)
        "cloning" constructor (to be used by clone())
        Parameters:
        poly - PicSmoothPolygon to be cloned
        Since:
        jpicedt 1.3.3
    • Method Detail

      • clone

        public java.lang.Object clone()
        Overide Object.clone() method
        Specified by:
        clone in interface Element
        Overrides:
        clone in class DefaultLeafElement
        Returns:
        Description of the Return Value
        Since:
        PicEdt 1.1
      • getName

        public java.lang.String getName()
        Description copied from class: DefaultLeafElement
        Returns a non-localised string representing this object's name This default implementation returns the class name.
        Specified by:
        getName in interface Element
        Overrides:
        getName in class DefaultLeafElement
        Returns:
        a localised string that represents this object's name
      • getLastPointIndex

        public int getLastPointIndex()
        Returns the index of the last user-controlled point that can be retrieved by getPoint(). This default implementation returns the number of polygon-points minus one.
        Specified by:
        getLastPointIndex in interface Element
        Overrides:
        getLastPointIndex in class DefaultLeafElement
      • getPoint

        public PicPoint getPoint​(int numPoint,
                                 PicPoint src)
        Return the user-controlled point (ie a polygon point, not a bezier point) having the given index. The general contract in Element is to return an IMMUTABLE instance of PicPoint, so that the only way to alter the geometry of this element is by calling the setPoint method.
        Overriden so as to return a "polygon" point instead of a bezier-point (which act as specification-point here).
        Specified by:
        getPoint in interface Element
        Overrides:
        getPoint in class DefaultLeafElement
        Parameters:
        numPoint - the point index, should be greater or equal to the value returned by getFirstPointIndex, and lower or equal to getLastPointIndex.
        Returns:
        the point indexed by numPoint ; if src is null, allocates a new PicPoint and return it, otherwise directly modifies src and returns it as well for convenience.
      • getPolygonPoint

        protected final PicPoint getPolygonPoint​(int numPoint)
        Return a reference on the polygon point with the given index. This is equivalent to calling getPoint(int,PicPoint), except that a mere reference is returned.
      • getPointX

        public double getPointX​(int index)
        This implementation returns the X-coord of the polygon-point with the same index.
        Specified by:
        getPointX in interface Element
        Overrides:
        getPointX in class DefaultLeafElement
        Parameters:
        index - the point index, should be greater or equal to the value returned by getFirstPointIndex, and lower or equal to getLastPointIndex.
        Returns:
        the X-coord of the point indexed by index.
        Since:
        jpicedt 1.3.3
      • getPointY

        public double getPointY​(int index)
        This implementation returns the Y-coord of the polygon-point with the same index.
        Specified by:
        getPointY in interface Element
        Overrides:
        getPointY in class DefaultLeafElement
        Parameters:
        index - the point index, should be greater or equal to the value returned by getFirstPointIndex, and lower or equal to getLastPointIndex.
        Returns:
        the Y-coord of the point indexed by index.
        Since:
        jpicedt 1.3.3
      • translate

        public void translate​(double dx,
                              double dy)
        Translate this Element by (dx,dy) ; this implementation translates the specification-points, then fires a changed-update event.
        Specified by:
        translate in interface Element
        Overrides:
        translate in class DefaultLeafElement
        Parameters:
        dx - The X coordinate of translation vector
        dy - The Y coordinate of translation vector
        Since:
        PicEdt 1.0
      • scale

        public void scale​(double ptOrgX,
                          double ptOrgY,
                          double sx,
                          double sy)
        Scale this object by (sx,sy) using (ptOrgX,ptOrgY) as the origin. This implementation simply apply a scaling transform to all specification-points. Note that sx and sy may be negative. This method eventually fires a changed-update event.
        Specified by:
        scale in interface Element
        Overrides:
        scale in class DefaultLeafElement
      • rotate

        public void rotate​(PicPoint ptOrg,
                           double angle)
        Rotate this Element by the given angle along the given point
        Specified by:
        rotate in interface Element
        Overrides:
        rotate in class DefaultLeafElement
        Parameters:
        angle - rotation angle in radians
      • shear

        public void shear​(PicPoint ptOrg,
                          double shx,
                          double shy)
        Shear this Element by the given params wrt to the given origin
        Specified by:
        shear in interface Element
        Overrides:
        shear in class DefaultLeafElement
      • setPoint

        public void setPoint​(int index,
                             PicPoint pt,
                             EditPointConstraint constraint)
        Set the user-controlled point with the given index to the given value. This implementation sets the value of the polygon-point having the same index, then update the associated Bezier curve, and fires a changed-update event.
        Specified by:
        setPoint in interface Element
        Overrides:
        setPoint in class AbstractCurve
        Parameters:
        constraint - not used so far
      • addPoint

        public void addPoint​(PicPoint pt)
        adds the given point at the end of this PicSmoothPolygon.
        Specified by:
        addPoint in class AbstractCurve
      • addPoint

        public void addPoint​(PicPoint pt,
                             double smoothCoeff)
        adds the given point with the given smoothness-coefficient at the end of this PicSmoothPolygon.
      • addPoint

        public void addPoint​(int ptIndex,
                             PicPoint pt)
        Adds the given polygon point at the given position, shifting ensuing point indices to the right. For instance, adding at point at position "1" is equivalent to splitting segment "0".
      • addPoint

        public void addPoint​(int ptIndex,
                             PicPoint pt,
                             double smoothCoeff)
        Adds the given polygon point at the given position, shifting ensuing point indices to the right. For instance, adding at point at position "1" is equivalent to splitting segment "0".
      • splitSegment

        public int splitSegment​(int segIdx,
                                PicPoint pt)
        Split the given polygon segment (starting from 0), by inserting a new polygon point at the appropriate position. then fires a changed-update. For instance, spliting segment "2" yields the following polygon points : 0, 1, 2, insertion pt, 3, 4, etc...
        Specified by:
        splitSegment in class AbstractCurve
        Parameters:
        segIdx - index of the polygon segment that must be split.
        pt - the PicPoint to be added
        Returns:
        the index of the user-controlled point which got inserted, according to the indexing scheme of set/getPoint(). This may for instance allow a receiver to control the "new" segment shape by calling setPoint() with this index as a parameter w/o the burden of computing an exact point index (a thing that may depend on the particular implementation of this method).
      • splitSegment

        public int splitSegment​(int segIdx,
                                PicPoint pt,
                                double smoothCoeff)
        Split the given polygon segment (starting from 0), by inserting a new polygon point at the appropriate position. then fires a changed-update. For instance, spliting segment "2" yields the following polygon points : 0, 1, 2, insertion pt, 3, 4, etc...
        Parameters:
        segIdx - index of the polygon segment that must be split.
        smoothCoeff - the smoothness coefficient to be used for the new polygon point.
        pt - the PicPoint to be added
      • removePoint

        public void removePoint​(int pos)
        Remove a point at the given position from this PicSmoothPolygon, then fire a changed-update. This shifts any subsequent points to the left.

        Nothing is done if this polygon has only one point.

        Specified by:
        removePoint in class AbstractCurve
        Parameters:
        pos - index of point to be removed
      • removeLastPoint

        public void removeLastPoint()
        removes the last point of this PicSmoothPolygon. This is a convenience call to removePoint(polygonPts.size()-1)
      • getSmoothCoefficient

        public double getSmoothCoefficient​(int index)
        Parameters:
        index - Description of the Parameter
        Returns:
        smoothness smoothCoeff of the given control point
      • setSmoothCoefficient

        public void setSmoothCoefficient​(int index,
                                         double c)
        Parameters:
        index - index of point whose smoothCoeff is to be adjusted
        c - value of the smoothCoeff
      • setClosed

        public void setClosed​(boolean state)
        set close path state, then fires a changed-update.
        Overrides:
        setClosed in class AbstractCurve
        Parameters:
        state - The new closed value
      • getBoundingBox

        public java.awt.geom.Rectangle2D getBoundingBox​(java.awt.geom.Rectangle2D r)
        Returns the bounding box (ie the surrounding rectangle) in double precision This implementation compute the bb from the union of :
        • the bb as computed by super-class
        • and the smallest rectangle that encompasses all the polygon-points.
        Specified by:
        getBoundingBox in interface Element
        Overrides:
        getBoundingBox in class DefaultLeafElement
        Returns:
        the bounding box (i.e. the surrounding rectangle) in double precision Used e.g. to determine the arguments of the \\begin{picture} command. If r is null, allocate a new rectangle and returns it. Otherwise the source rectangle is modified and returned for convenience. [todo:reynal] this really need to be improved : this method would probably better be moved to the attached view, since the latter knows exactly what the TRUE bounding box is.
        Since:
        jpicedt 1.3.3
      • toString

        public java.lang.String toString()
        Used for debugging purpose.
        Overrides:
        toString in class AbstractCurve
      • createActions

        public PEAction[] createActions​(ActionDispatcher actionDispatcher,
                                        ActionLocalizer localizer,
                                        HitInfo hi)
        Create an array of Action's related to this object
        Specified by:
        createActions in interface ActionFactory
        Overrides:
        createActions in class AbstractCurve
        Parameters:
        actionDispatcher - dispatches events to the proper PECanvas
        localizer - i18n localizer for PEAction's
        hi - a HitInfo containing information related to the mouse-event which triggered the popup menu.