Class GeneralPath

java.lang.Object
com.codename1.ui.geom.GeneralPath
All Implemented Interfaces:
Shape

public final class GeneralPath extends Object implements Shape

A general geometric path, consisting of any number of subpaths constructed out of straight lines and cubic or quadratic Bezier curves. The inside of the curve is defined for drawing purposes by a winding rule. Either the #WIND_EVEN_ODD or #WIND_NON_ZERO winding rule can be chosen.

A drawing of a GeneralPath

The #WIND_EVEN_ODD winding rule defines a point as inside a path if: A ray from the point towards infinity in an arbitrary direction intersects the path an odd number of times. Points A and C in the image are considered to be outside the path. (both intersect twice) Point B intersects once, and is inside.

The #WIND_NON_ZERO winding rule defines a point as inside a path if: The path intersects the ray in an equal number of opposite directions. Point A in the image is outside (one intersection in the 'up' direction, one in the 'down' direction) Point B in the image is inside (one intersection 'down') Point C in the image is inside (two intersections in the 'down' direction)

Form hi = new Form("Shape");

// We create a 50 x 100 shape, this is arbitrary since we can scale it easily
GeneralPath path = new GeneralPath();
path.moveTo(20,0);
path.lineTo(30, 0);
path.lineTo(30, 100);
path.lineTo(20, 100);
path.lineTo(20, 15);
path.lineTo(5, 40);
path.lineTo(5, 25);
path.lineTo(20,0);

hi.getContentPane().getUnselectedStyle().setBgPainter((Graphics g, Rectangle rect) -> {
    g.setColor(0xff);
    float widthRatio = ((float)rect.getWidth()) / 50f;
    float heightRatio = ((float)rect.getHeight()) / 100f;
    g.scale(widthRatio, heightRatio);
    g.translate((int)(((float)rect.getX()) / widthRatio), (int)(((float)rect.getY()) / heightRatio));
    g.fillShape(path);
    g.resetAffine();
});

hi.show();

Note: This description and image were copied from the GNU classpath docs). License here http://www.gnu.org/licenses/licenses.html#FDL

  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final int
    Same constant as PathIterator#WIND_EVEN_ODD
    static final int
    Same constant as PathIterator#WIND_NON_ZERO
  • Constructor Summary

    Constructors
    Constructor
    Description
    Constructs a GeneralPath with the default (#WIND_NON_ZERO) winding rule and initial capacity (10).
    GeneralPath(int rule)
    Constructs a GeneralPath with a specific winding rule and the default initial capacity (10).
    GeneralPath(int rule, int initialCapacity)
    Constructs a GeneralPath with a specific winding rule and the initial capacity.
    Constructs a GeneralPath from an arbitrary shape object.
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    append(PathIterator path, boolean connect)
    Appends the segments of a PathIterator to this GeneralPath.
    void
    append(Shape shape, boolean connect)
    Appends the segments of a Shape to the path.
    void
    arc(double x, double y, double w, double h, double startAngle, double sweepAngle)
    Draws an elliptical arc on the path given the provided bounds.
    void
    arc(double x, double y, double w, double h, double startAngle, double sweepAngle, boolean joinPath)
    Draws an elliptical arc on the path given the provided bounds.
    void
    arc(float x, float y, float w, float h, float startAngle, float sweepAngle)
    Draws an elliptical arc on the path given the provided bounds.
    void
    arc(float x, float y, float w, float h, float startAngle, float sweepAngle, boolean joinPath)
    Draws an elliptical arc on the path given the provided bounds.
    void
    arcTo(double cX, double cY, double endX, double endY)
    Adds an arc to the path.
    void
    arcTo(double cX, double cY, double endX, double endY, boolean clockwise)
    Adds an arc to the path.
    void
    arcTo(float cX, float cY, float endX, float endY)
    Adds an arc to the path.
    void
    arcTo(float cX, float cY, float endX, float endY, boolean clockwise)
    Adds an arc to the path.
    void
    Closes the current subpath by drawing a line back to the point of the last moveTo, unless the path is already closed.
    boolean
    contains(float x, float y)
    Checks if the given point is contained in the current shape.
    boolean
    contains(int x, int y)
    {Checks if the shape contains the given point.
    Creates a new GeneralPath from an object Pool.
    Returns a shape formed by transforming the current shape with the provided transform.
    void
    curveTo(double x1, double y1, double x2, double y2, double x3, double y3)
     
    void
    curveTo(float x1, float y1, float x2, float y2, float x3, float y3)
    Appends a cubic Bezier curve to the current path.
    boolean
    equals(Shape shape, Transform t)
     
    Returns the path's bounding box.
    void
    Sets the coordinates of the provided rectangle to the bounding box of this path.
    float[]
    Returns the path's bounding box, in float precision.
    void
    getBounds2D(float[] out)
    Sets the 4-element array to the bounding box coordinates of the path.
    float[]
    Returns the current appending point of the path.
    void
    getCurrentPoint(float[] point)
    Sets the coordinates of the given point to the current point in the path.
    {Gets an iterator to walk all of the path segments of the shape.
    {Gets an iterator where all points are transformed by the provided transform.
    void
    getPoints(float[] out)
    Returns a copy of the points in this path.
    int
    Returns the number of points in this path.
    void
    getTypes(byte[] out)
    Returns a copy of the types (aka path commands) in this path.
    int
    Returns the number of path commands in this path.
    int
    Returns the path's current winding rule.
    boolean
    intersect(int x, int y, int w, int h)
     
    boolean
    Sets the current path to the intersection of itself and the provided rectangle.
    void
    Resets this path to be the intersection of itself with the given shape.
    {Returns the shape formed by the intersection of this shape and the provided rectangle.
    static boolean
    isConvexPolygon(float[] xPoints, float[] yPoints)
    Checks to see if the set of points form a convex polygon.
    static boolean
    isConvexPolygon(int[] xPoints, int[] yPoints)
     
    boolean
    Checks to see if this path forms a polygon.
    boolean
    Checks to see if this path is a rectangle.
    void
    lineTo(double x, double y)
     
    void
    lineTo(float x, float y)
    Appends a straight line to the current path.
    void
    moveTo(double x, double y)
     
    void
    moveTo(float x, float y)
    Adds a new point to a path.
    void
    quadTo(double x1, double y1, double x2, double y2)
     
    void
    quadTo(float x1, float y1, float x2, float y2)
    Appends a quadratic Bezier curve to the current path.
    static void
    Returns a GeneralPath to the reusable object pool for GeneralPaths.
    void
    Resets the path.
    void
    Sets this path to be identical to the provided path p with the given Transform t applied to it.
    void
    Sets this path to be a rectangle with the provided bounds, but with the given transform applied to it.
    void
    Sets this path to be a copy of the provided shape, but with the provided transform applied to it.
    void
    setWindingRule(int rule)
    Sets the path's winding rule, which controls which areas are considered 'inside' or 'outside' the path on drawing.
     
    void
    Transforms the current path in place using the given transform.

    Methods inherited from class Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • Field Details

    • WIND_EVEN_ODD

      public static final int WIND_EVEN_ODD
      Same constant as PathIterator#WIND_EVEN_ODD
      See Also:
    • WIND_NON_ZERO

      public static final int WIND_NON_ZERO
      Same constant as PathIterator#WIND_NON_ZERO
      See Also:
  • Constructor Details

    • GeneralPath

      public GeneralPath()
      Constructs a GeneralPath with the default (#WIND_NON_ZERO) winding rule and initial capacity (10).
    • GeneralPath

      public GeneralPath(int rule)

      Constructs a GeneralPath with a specific winding rule and the default initial capacity (10).

      Parameters
      • rule: @param rule The winding rule. One of #WIND_NON_ZERO and #WIND_EVEN_ODD
      See also
      • #WIND_NON_ZERO

      • #WIND_EVEN_ODD

    • GeneralPath

      public GeneralPath(int rule, int initialCapacity)

      Constructs a GeneralPath with a specific winding rule and the initial capacity. The initial capacity should be the approximate number of path segments to be used.

      Parameters
      • rule: @param rule The winding rule. (#WIND_NON_ZERO or #WIND_EVEN_ODD).

      • initialCapacity: the inital capacity, in path segments

    • GeneralPath

      public GeneralPath(Shape shape)

      Constructs a GeneralPath from an arbitrary shape object. The Shapes PathIterator path and winding rule will be used.

      Parameters
      • shape
  • Method Details

    • recycle

      public static void recycle(GeneralPath p)

      Returns a GeneralPath to the reusable object pool for GeneralPaths.

      Parameters
      • p: The path to recycle.
      See also
      • #createFromPool()
    • createFromPool

      public static GeneralPath createFromPool()

      Creates a new GeneralPath from an object Pool. This is useful if you need to create a temporary General path that you wish to dispose of after using.

      You should return this object back to the pool when you are done using the #recycle(com.codename1.ui.geom.GeneralPath) method.

    • isConvexPolygon

      public static boolean isConvexPolygon(float[] xPoints, float[] yPoints)

      Checks to see if the set of points form a convex polygon. if

      Parameters
      • xPoints: The x coordinates of the polygon.

      • yPoints: The y coordinates of the polygon.

      Returns

      True if the points comprise a convex polygon.

    • isConvexPolygon

      public static boolean isConvexPolygon(int[] xPoints, int[] yPoints)
    • isPolygon

      public boolean isPolygon()

      Checks to see if this path forms a polygon.

      Returns

      True if the path is a polygon.

    • getTypesSize

      public int getTypesSize()

      Returns the number of path commands in this path.

      Returns

      The number of path commands in this path.

    • getPointsSize

      public int getPointsSize()

      Returns the number of points in this path.

      Returns

      The number of points in this path.

    • getTypes

      public void getTypes(byte[] out)

      Returns a copy of the types (aka path commands) in this path.

      Parameters
      • out: An array to copy the path commands into.
    • getPoints

      public void getPoints(float[] out)

      Returns a copy of the points in this path.

      Parameters
      • out: An array to copy the points into.
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • equals

      public boolean equals(Shape shape, Transform t)
    • getWindingRule

      public int getWindingRule()

      Returns the path's current winding rule.

      Returns

      #WIND_NON_ZERO or #WIND_EVEN_ODD

    • setWindingRule

      public void setWindingRule(int rule)

      Sets the path's winding rule, which controls which areas are considered 'inside' or 'outside' the path on drawing. Valid rules are #WIND_EVEN_ODD for an even-odd winding rule, or #WIND_NON_ZERO for a non-zero winding rule.

      Parameters
      • rule: the rule. (#WIND_NON_ZERO or #WIND_EVEN_ODD).
    • moveTo

      public void moveTo(double x, double y)
    • moveTo

      public void moveTo(float x, float y)

      Adds a new point to a path.

      Parameters
      • x: the x-coordinate.

      • y: the y-coordinate.

    • lineTo

      public void lineTo(double x, double y)
    • lineTo

      public void lineTo(float x, float y)

      Appends a straight line to the current path.

      Parameters
      • x: x coordinate of the line endpoint.

      • y: y coordinate of the line endpoint.

    • quadTo

      public void quadTo(double x1, double y1, double x2, double y2)
    • quadTo

      public void quadTo(float x1, float y1, float x2, float y2)

      Appends a quadratic Bezier curve to the current path.

      Parameters
      • x1: x coordinate of the control point

      • y1: y coordinate of the control point

      • x2: x coordinate of the curve endpoint.

      • y2: y coordinate of the curve endpoint.

    • curveTo

      public void curveTo(double x1, double y1, double x2, double y2, double x3, double y3)
    • curveTo

      public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3)

      Appends a cubic Bezier curve to the current path.

      Parameters
      • x1: x coordinate of the first control point

      • y1: y coordinate of the first control point

      • x2: x coordinate of the second control point

      • y2: y coordinate of the second control point

      • x3: x coordinate of the curve endpoint.

      • y3: y coordinate of the curve endpoint.

    • arc

      public void arc(float x, float y, float w, float h, float startAngle, float sweepAngle)

      Draws an elliptical arc on the path given the provided bounds.

      Parameters
      • x: Left x coord of bounding rect.

      • y: Top y coordof bounding rect.

      • w: Width of bounding rect.

      • h: Height of bounding rect.

      • startAngle: Start angle on ellipse in radians. Counter-clockwise from 3-o'clock.

      • sweepAngle: Sweep angle in radians. Counter-clockwise.

    • arc

      public void arc(float x, float y, float w, float h, float startAngle, float sweepAngle, boolean joinPath)

      Draws an elliptical arc on the path given the provided bounds.

      Parameters
      • x: Left x coord of bounding rect.

      • y: Top y coordof bounding rect.

      • w: Width of bounding rect.

      • h: Height of bounding rect.

      • startAngle: Start angle on ellipse in radians. Counter-clockwise from 3-o'clock.

      • sweepAngle: Sweep angle in radians. Counter-clockwise.

      • joinPath: If true, then this will join the arc to the existing path with a line.

    • arc

      public void arc(double x, double y, double w, double h, double startAngle, double sweepAngle)

      Draws an elliptical arc on the path given the provided bounds.

      Parameters
      • x: Left x coord of bounding rect.

      • y: Top y coordof bounding rect.

      • w: Width of bounding rect.

      • h: Height of bounding rect.

      • startAngle: Start angle on ellipse in radians. Counter-clockwise from 3-o'clock.

      • sweepAngle: Sweep angle in radians. Counter-clockwise.

    • arc

      public void arc(double x, double y, double w, double h, double startAngle, double sweepAngle, boolean joinPath)

      Draws an elliptical arc on the path given the provided bounds.

      Parameters
      • x: Left x coord of bounding rect.

      • y: Top y coordof bounding rect.

      • w: Width of bounding rect.

      • h: Height of bounding rect.

      • startAngle: Start angle on ellipse in radians. Counter-clockwise from 3-o'clock.

      • sweepAngle: Sweep angle in radians. Counter-clockwise.

      • joinPath: If true then this will join the arc to the existing path with a line.

    • arcTo

      public void arcTo(float cX, float cY, float endX, float endY)

      Adds an arc to the path. This method uses an approximation of an arc using a cubic path. It is not a precise arc.

      Note: The arc is drawn counter-clockwise around the center point. See double, double, double, boolean) to draw clockwise.

      Parameters
      • cX: The x-coordinate of the oval center.

      • cY: The y-coordinate of the oval center.

      • endX: The end X coordinate.

      • endY: The end Y coordinate.

    • arcTo

      public void arcTo(float cX, float cY, float endX, float endY, boolean clockwise)

      Adds an arc to the path. This method uses an approximation of an arc using a cubic path. It is not a precise arc.

      Parameters
      • cX: The x-coordinate of the oval center.

      • cY: The y-coordinate of the oval center.

      • endX: The end X coordinate.

      • endY: The end Y coordinate.

      • clockwise: If true, the arc is drawn clockwise around the center point.

    • arcTo

      public void arcTo(double cX, double cY, double endX, double endY)

      Adds an arc to the path. This method uses an approximation of an arc using a cubic path. It is not a precise arc.

      Note: The arc is drawn counter-clockwise around the center point. See double, double, double, boolean) to draw clockwise.

      Parameters
      • cX: The x-coordinate of the oval center.

      • cY: The y-coordinate of the oval center.

      • endX: The end X coordinate.

      • endY: The end Y coordinate.

    • arcTo

      public void arcTo(double cX, double cY, double endX, double endY, boolean clockwise)

      Adds an arc to the path. This method uses an approximation of an arc using a cubic path. It is not a precise arc.

      Parameters
      • cX: The x-coordinate of the oval center.

      • cY: The y-coordinate of the oval center.

      • endX: The end X coordinate.

      • endY: The end Y coordinate.

      • clockwise: If true, the arc is drawn clockwise around the center point.

    • closePath

      public void closePath()
      Closes the current subpath by drawing a line back to the point of the last moveTo, unless the path is already closed.
    • append

      public void append(Shape shape, boolean connect)

      Appends the segments of a Shape to the path. If connect is true, the new path segments are connected to the existing one with a line. The winding rule of the Shape is ignored.

      Parameters
      • shape: the shape (null not permitted).

      • connect: whether to connect the new shape to the existing path.

    • append

      public void append(PathIterator path, boolean connect)

      Appends the segments of a PathIterator to this GeneralPath. Optionally, the initial PathIterator#SEG_MOVETO segment of the appended path is changed into a PathIterator#SEG_LINETO segment.

      Parameters
      • path: @param path the PathIterator specifying which segments shall be appended (null not permitted).

      • connect: @param connect true for substituting the initial PathIterator#SEG_MOVETO segment by a PathIterator#SEG_LINETO, or false for not performing any substitution. If this GeneralPath is currently empty, connect is assumed to be false, thus leaving the initial PathIterator#SEG_MOVETO unchanged.

    • getCurrentPoint

      public float[] getCurrentPoint()

      Returns the current appending point of the path.

      Returns
      Returns:
      2-element array of the form [x,y] representing x and y coordinate of the current appending point of the path..
    • getCurrentPoint

      public void getCurrentPoint(float[] point)

      Sets the coordinates of the given point to the current point in the path.

      Parameters
      • point: Out parameter. Will be filled with the coords of the current point.
    • reset

      public void reset()
      Resets the path. All points and segments are destroyed.
    • getBounds2D

      public float[] getBounds2D()

      Returns the path's bounding box, in float precision.

      Returns

      4-element array of the form [x, y, width, height].

      Specified by:
      getBounds2D in interface Shape
    • getBounds2D

      public void getBounds2D(float[] out)

      Sets the 4-element array to the bounding box coordinates of the path. x, y, width, height.

      Parameters
      • out: 4-element float[] array.
    • getBounds

      public Rectangle getBounds()

      Returns the path's bounding box.

      Returns

      The bounding box of the path.

      Specified by:
      getBounds in interface Shape
    • getBounds

      public void getBounds(Rectangle out)

      Sets the coordinates of the provided rectangle to the bounding box of this path.

      Parameters
      • out
    • isRectangle

      public boolean isRectangle()

      Checks to see if this path is a rectangle.

      Returns

      True if this path forms a rectangle. False otherwise.

      Specified by:
      isRectangle in interface Shape
    • getPathIterator

      public PathIterator getPathIterator()

      {

      Gets an iterator to walk all of the path segments of the shape.

      Returns

      A PathIterator that can iterate over the path segments of the shape.

      }
      Specified by:
      getPathIterator in interface Shape
    • getPathIterator

      public PathIterator getPathIterator(Transform m)

      {

      Gets an iterator where all points are transformed by the provided transform.

      Note: If com.codename1.ui.Transform#isSupported() is false, then using this iterator will throw a Runtime Exception.

      Parameters
      • transform
      Returns

      A PathIterator where points are transformed by the provided transform.

      }
      Specified by:
      getPathIterator in interface Shape
    • createTransformedShape

      public Shape createTransformedShape(Transform m)

      Returns a shape formed by transforming the current shape with the provided transform.

      Note: If com.codename1.ui.Transform#isSupported is false, this may throw a RuntimeException.

      Parameters
      • m: The transform to be used to transform the shape.
      Returns

      The transformed shape.

    • setPath

      public void setPath(GeneralPath p, Transform t)

      Sets this path to be identical to the provided path p with the given Transform t applied to it.

      Parameters
      • p: The path to copy.

      • t: The transform to apply to all points in the path.

    • setRect

      public void setRect(Rectangle r, Transform t)

      Sets this path to be a rectangle with the provided bounds, but with the given transform applied to it.

      Parameters
      • r: Rectangle to copy.

      • t: The transform to apply to the points in in r.

    • setShape

      public void setShape(Shape s, Transform t)

      Sets this path to be a copy of the provided shape, but with the provided transform applied to it.

      Parameters
      • s: The shape to copy.

      • t: The transform to apply to all points in the shape.

    • intersect

      public boolean intersect(Rectangle rect)

      Sets the current path to the intersection of itself and the provided rectangle.

      Parameters
      • rect: The rectangle to intersect with this path.
      Returns
      Returns:
      True if rect intersects the current path. False otherwise. If there is no intersection, the path will be reset to be empty.
    • intersect

      public boolean intersect(int x, int y, int w, int h)
    • transform

      public void transform(Transform m)

      Transforms the current path in place using the given transform.

      Parameters
      • m: The transform to apply to the path.
    • intersect

      public void intersect(Shape shape)

      Resets this path to be the intersection of itself with the given shape. Note that only com.codename1.ui.geom.Rectangles are current supported. If you pass any other shape, it will throw a RuntimeException.

      Note: If com.codename1.ui.TransformisSupported is false, this will throw a Runtime Exception

      Parameters
      • shape: The shape to intersect with the current shape.
    • intersection

      public Shape intersection(Rectangle rect)

      {

      Returns the shape formed by the intersection of this shape and the provided rectangle.

      Parameters
      • rect: A rectangle with which to form an intersection.
      Returns

      The shape formed by intersecting the current shape with the provided rectangle.

      }
      Specified by:
      intersection in interface Shape
    • contains

      public boolean contains(float x, float y)

      Checks if the given point is contained in the current shape.

      Parameters
      • x: The x coordinate to check

      • y: The y coordinate to check

      Returns

      True if the point is inside the shape.

    • contains

      public boolean contains(int x, int y)

      {

      Checks if the shape contains the given point.

      Parameters
      • x: The x-coordinate of the point to test.

      • y: The y-coordinate of the point to test.

      Returns

      True if (x, y) is inside the shape.

      }
      Specified by:
      contains in interface Shape