http://www.jpicedt.org

jpicedt.graphic.model
Class PicSmoothPolygon

java.lang.Object
  extended by jpicedt.graphic.model.AbstractElement
      extended by jpicedt.graphic.model.AbstractCurve
          extended by jpicedt.graphic.model.PicSmoothPolygon
All Implemented Interfaces:
Element, PicMultiCurveConvertable, ActionFactory, CustomizerFactory

public class PicSmoothPolygon
extends AbstractCurve
implements ActionFactory, CustomizerFactory, PicMultiCurveConvertable

A multicurve, either closed or not, the geometry of which 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.35 2013/03/27 07:01:18 vincentb1 Exp $
Author:
Vincent Guirardel

Nested Class Summary
 
Nested classes/interfaces inherited from class jpicedt.graphic.model.AbstractCurve
AbstractCurve.CtrlPtSubsetAbstractCurve, AbstractCurve.CurveToSegment, AbstractCurve.EndSegment, AbstractCurve.LineToSegment, AbstractCurve.PointType, AbstractCurve.Segment
 
Field Summary
protected static int COEF_SLIDER_MAX
          Max value of smoothness coefficient accessible to Jslider in the geometry editor
protected static int COEF_SLIDER_MIN
          Min value of smoothness coefficient accessible to JSlider in the geometry editor
protected static double DEFAULT_SMOOTH_COEFF
          The default value for the smoothness coefficient on startup.
protected  ArrayList<PicPoint> polygonPts
          An array of PicPoint's backing the geometry of the polygon.
protected  ArrayList<Double> smoothCoeff
          The following array contains one Double per polygon point, specifying how close to polygon points the curve should go along.
 
Fields inherited from class jpicedt.graphic.model.AbstractCurve
bezierPts, isClosed
 
Fields inherited from class jpicedt.graphic.model.AbstractElement
attributeSet, name, parent, view
 
Constructor Summary
PicSmoothPolygon()
          Create a new empty open smooth polygon, with a default attribute set.
PicSmoothPolygon(boolean closed)
          Create a new empty smooth polygon, open or closed, with a default attribute set bound to it.
PicSmoothPolygon(boolean closed, PicAttributeSet set)
          Create a new empty smooth polygon with the given attribute set.
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.
PicSmoothPolygon(PicPoint[] polyPts, boolean closed, double smoothCoeff, PicAttributeSet set)
          Create a new smooth polygon initialized from the given array of PicPoint's.
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.
PicSmoothPolygon(PicSmoothPolygon poly)
          "cloning" constructor (to be used by clone())
 
Method Summary
 void addPoint(int ptIndex, PicPoint pt)
          Add the given polygon point at the given position, shifting ensuing point indices to the right.
 void addPoint(int ptIndex, PicPoint pt, double smoothCoeff)
          Add the given polygon point at the given position, shifting ensuing point indices to the right.
 void addPoint(PicPoint pt)
          Add the given point at the end of this PicSmoothPolygon.
 void addPoint(PicPoint pt, double smoothCoeff)
          Add the given point with the given smoothness-coefficient at the end of this PicSmoothPolygon.
 PicSmoothPolygon clone()
          Overide Object.clone() method
 PicMultiCurve convertToMultiCurve()
          Convert this PicSmoothPolygon to a PicMultiCurve, by simply relying on the appropriate constructor in class PicMultiCurve.
 ArrayList<PEAction> createActions(ActionDispatcher actionDispatcher, ActionLocalizer localizer, HitInfo hi)
          Create an array of Action's related to this object
 AbstractCustomizer createCustomizer()
          Returns a Customizer for geometry editing
 Rectangle2D getBoundingBox(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.
 PicPoint getCtrlPt(int numPoint, PicPoint dest)
          Return the user-controlled point (ie a polygon point, not a bezier point) having the given index.
 CtrlPtSubset getCtrlPtSubset(ConvexZoneGroup csg, BitSet czExtension)
          Renvoie un la partie des points de contrôle qui satisfont à l'un des deux critères suivants: ceux compris dans l'ensemble de zones convexes csg, et ceux en relation avec les points de contrôle satisfaisant au première critère selon une relation définies par czExtension
 String getDefaultName()
           
 int getFirstPointIndex()
          Returns the index of the first user-controlled point that can be retrieved by getCtrlPt().
 int getLastPointIndex()
          Returns the index of the last user-controlled point that can be retrieved by getCtrlPt().
protected  PicPoint getPolygonPt(int numPoint)
          Return a reference to the polygon point with the given index.
 double getSmoothCoefficient(int index)
           
 void mirror(PicPoint ptOrg, PicVector normalVector)
          Effectue une réflexion sur this relativement à l'axe défini par ptOrg et normalVector.
 void removeLastPoint()
          Remove the last point of this PicSmoothPolygon.
 void removePoint(int pos)
          Remove a point at the given position from this PicSmoothPolygon, then fire a changed-update.
 void rotate(PicPoint ptOrg, double angle)
          Rotate this Element by the given angle along the given point
 void scale(double ptOrgX, double ptOrgY, double sx, double sy, UserConfirmationCache ucc)
          Scale this object by (sx,sy) using (ptOrgX,ptOrgY) as the origin.
 void setClosed(boolean state)
          Set close path state, then fires a changed-update.
 void setCtrlPt(int index, PicPoint pt, EditPointConstraint constraint)
          Set the user-controlled point with the given index to the given value.
 void setSmoothCoefficient(int index, double c)
           
 void shear(PicPoint ptOrg, double shx, double shy, UserConfirmationCache ucc)
          Shear this Element by the given params wrt to the given origin
 int splitSegment(int segIdx, PicPoint pt)
          Split the given polygon segment (starting from 0), by inserting a new polygon point at the appropriate position.
 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.
 String toString()
          Used for debugging purpose.
 void translate(double dx, double dy)
          Translate this Element by (dx,dy) ; this implementation translates the specification-points, then fires a changed-update event.
 
Methods inherited from class jpicedt.graphic.model.AbstractCurve
createShape, curveTo, diff1CurveTo, diff2CurveTo, getAlternateControlPoint, getBezierPt, getBezierPt, getBezierPtsCount, getBezierPtX, getBezierPtY, getIncomingTangent, getMiminalSegmentList, getNearestSubdivisionPoint, getNumberOfSubdivisionPoints, getOutgoingTangent, getPBCBezierIndex, getPBCSegmentIndex, getPointType, getSegmentCount, getShapeBounds2D, hasValidSize, isClosed, isControlPoint, isPolygon, isSmooth, isStraight, isSymmetric, isValidBezierIndex, isValidSegmentIndex, lineTo, pointToSegmentIndex, removeLastSubdivisionPoint, removeSubdivisionPoint, segmentToPointIndex, setBezierPt, splitSegment, syncArrowGeometry
 
Methods inherited from class jpicedt.graphic.model.AbstractElement
anchorPointsIterator, fireChangedUpdate, getAttribute, getAttributeSet, getDrawing, getName, getParent, getView, pullOutOfGroup, removeView, replaceBy, scale, scale, scale, setAttribute, setAttributeSet, setCtrlPt, setName, setParent, setViewFromFactory, shear
 
Methods inherited from class java.lang.Object
equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface jpicedt.graphic.model.Element
anchorPointsIterator, createShape, getAttribute, getAttributeSet, getDrawing, getName, getParent, getView, removeView, replaceBy, scale, scale, scale, setAttribute, setAttributeSet, setCtrlPt, setParent, setViewFromFactory, shear, syncArrowGeometry
 

Field Detail

polygonPts

protected ArrayList<PicPoint> polygonPts
An array of PicPoint's backing the geometry of the polygon. Aka caching mechanism holding a list of user-controlled points.
Note: now, inherited bezierPts array obviously acts as an array of specification points only.


smoothCoeff

protected ArrayList<Double> 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
smoothCoeffs - 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 PicSmoothPolygon clone()
Overide Object.clone() method

Specified by:
clone in interface Element
Specified by:
clone in class AbstractElement
Returns:
Description of the Return Value
Since:
PicEdt 1.1

getDefaultName

public String getDefaultName()
Specified by:
getDefaultName in class AbstractElement
Returns:
a localised string that represents this object's name

getFirstPointIndex

public int getFirstPointIndex()
Returns the index of the first user-controlled point that can be retrieved by getCtrlPt(). This implementation returns 0.

Specified by:
getFirstPointIndex in interface Element

getLastPointIndex

public int getLastPointIndex()
Returns the index of the last user-controlled point that can be retrieved by getCtrlPt(). This default implementation returns the number of polygon-points minus one.

Specified by:
getLastPointIndex in interface Element

getCtrlPt

public PicPoint getCtrlPt(int numPoint,
                          PicPoint dest)
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 setCtrlPt method.
Overriden so as to return a "polygon" point instead of a bezier-point (which act as specification-point here).

Specified by:
getCtrlPt in interface Element
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 dest is null, allocates a new PicPoint and return it, otherwise directly modifies dest and returns it as well for convenience.

getPolygonPt

protected final PicPoint getPolygonPt(int numPoint)
Return a reference to the polygon point with the given index. This is equivalent to calling getCtrlPt(int,PicPoint), except that a mere reference is returned.


setCtrlPt

public void setCtrlPt(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:
setCtrlPt in interface Element
Overrides:
setCtrlPt in class AbstractCurve
Parameters:
constraint - not used so far

addPoint

public void addPoint(PicPoint pt)
Add the given point at the end of this PicSmoothPolygon.

Specified by:
addPoint in class AbstractCurve

addPoint

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


addPoint

public void addPoint(int ptIndex,
                     PicPoint pt)
Add 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)
Add 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/getCtrlPt(). This may for instance allow a receiver to control the "new" segment shape by calling setCtrlPt() 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()
Remove the last point of this PicSmoothPolygon. This is a convenience call to removePoint(polygonPts.size()-1)


convertToMultiCurve

public PicMultiCurve convertToMultiCurve()
Convert this PicSmoothPolygon to a PicMultiCurve, by simply relying on the appropriate constructor in class PicMultiCurve.

Specified by:
convertToMultiCurve in interface PicMultiCurveConvertable

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
See Also:
AbstractCurve.isClosed()

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 AbstractCurve
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,
                  UserConfirmationCache ucc)
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 AbstractCurve
ucc - une valeur UserConfirmationCache permettant de demander à l'utilisateur confirmation, de se souvenir de la dernière confirmation qu'il a donné, ou de ses préférences.

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 AbstractCurve
Parameters:
angle - rotation angle in radians

mirror

public void mirror(PicPoint ptOrg,
                   PicVector normalVector)
Effectue une réflexion sur this relativement à l'axe défini par ptOrg et normalVector.

Specified by:
mirror in interface Element
Overrides:
mirror in class AbstractCurve
Parameters:
ptOrg - le PicPoint par lequel passe l'axe de réflexion.
normalVector - le PicVector normal à l'axe de réflexion.

shear

public void shear(PicPoint ptOrg,
                  double shx,
                  double shy,
                  UserConfirmationCache ucc)
Shear this Element by the given params wrt to the given origin

Specified by:
shear in interface Element
Overrides:
shear in class AbstractCurve
ucc - une valeur UserConfirmationCache permettant de demander à l'utilisateur confirmation, de se souvenir de la dernière confirmation qu'il a donné, ou de ses préférences.

getCtrlPtSubset

public CtrlPtSubset getCtrlPtSubset(ConvexZoneGroup csg,
                                    BitSet czExtension)
Description copied from interface: Element
Renvoie un la partie des points de contrôle qui satisfont à l'un des deux critères suivants:
  1. ceux compris dans l'ensemble de zones convexes csg, et
  2. ceux en relation avec les points de contrôle satisfaisant au première critère selon une relation définies par czExtension

Specified by:
getCtrlPtSubset in interface Element
Overrides:
getCtrlPtSubset in class AbstractCurve
Parameters:
csg - l'ensemble de zones convexes ConvexZoneGroup auquel on teste l'appartenance des points de contrôle.
czExtension - cet argument est ignoré
Returns:
a CtrlPtSubset value
Since:
jPicEdt 1.6
See Also:
jpicedt.graphic.model

getBoundingBox

public Rectangle2D getBoundingBox(Rectangle2D r)
Returns the bounding box (ie the surrounding rectangle) in double precision This implementation compute the bb from the union of :

Specified by:
getBoundingBox in interface Element
Overrides:
getBoundingBox in class AbstractCurve
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 String toString()
Used for debugging purpose.

Overrides:
toString in class AbstractCurve

createActions

public ArrayList<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 - une HitInfo contenant les informations relatives à l'évènement-souris qui a déclencher le menu contextuel.

createCustomizer

public AbstractCustomizer createCustomizer()
Description copied from class: AbstractCurve
Returns a Customizer for geometry editing

Specified by:
createCustomizer in interface CustomizerFactory
Overrides:
createCustomizer in class AbstractCurve
Returns:
A Customizer for geometry editing.

http://www.jpicedt.org

Submit a bug : syd@jpicedt.org