Class CurveTo
- java.lang.Object
-
- com.itextpdf.svg.renderers.path.impl.AbstractPathShape
-
- com.itextpdf.svg.renderers.path.impl.CurveTo
-
- All Implemented Interfaces:
IControlPointCurve,IPathShape
- Direct Known Subclasses:
SmoothSCurveTo
public class CurveTo extends AbstractPathShape implements IControlPointCurve
Implements curveTo(C) attribute of SVG's path element.
-
-
Field Summary
Fields Modifier and Type Field Description (package private) static intARGUMENT_SIZEprivate static doubleZERO_EPSILON-
Fields inherited from class com.itextpdf.svg.renderers.path.impl.AbstractPathShape
context, coordinates, copier, properties, relative
-
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private static voidaddTValueToList(double t, java.util.List<java.lang.Double> tValuesList)Check that t is in the range [0, 1] and add it to listprivate static doublecalculateExtremeCoordinate(double t, double p0, double p1, double p2, double p3)private static java.util.List<java.lang.Double>calculateTValues(double p0, double p1, double p2, double p3)Calculate the quadratic function 3a*t^2 + 2b*t + c = 0 to obtain the values of tvoiddraw()Draws this instruction to a canvas object.private static double[]getBezierMinMaxPoints(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3)Initial function of cubic bezier is f(t) = (t-1)^3*P0 + 3*(1-t)^2*t*P1 + 3*(1-t)*t^2*P2 + t^3*P3, where 0 <= t <= 1 After opening brackets it can be reduced to f(t) = a*t^3 + b*t^2 + c*t + d, where a = P3-3*P2+3*P1-P0 b = 3*P2-6*P1+3*P0 c = 3*P1-3*P0 d = P0 First we must find the values of t at which the function reaches its extreme points.private PointgetFirstControlPoint()PointgetLastControlPoint()Returns coordinates of the last control point (the one closest to the ending point) in the Bezier curve, in SVG space coordinatesRectanglegetPathShapeRectangle(Point lastPoint)Get bounding rectangle of the current path shape.private static double[]getTValuesInExtremePoints(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3)Calculate values of t at which the function reaches its extreme points.voidsetCoordinates(java.lang.String[] inputCoordinates, Point startPoint)This method sets the coordinates for the path painting operator and does internal preprocessing, if necessary-
Methods inherited from class com.itextpdf.svg.renderers.path.impl.AbstractPathShape
applyTransform, createPoint, draw, getEndingPoint, isRelative, parseHorizontalLength, parseVerticalLength, setContext, setParent, setTransform
-
-
-
-
Field Detail
-
ARGUMENT_SIZE
static final int ARGUMENT_SIZE
- See Also:
- Constant Field Values
-
ZERO_EPSILON
private static final double ZERO_EPSILON
- See Also:
- Constant Field Values
-
-
Constructor Detail
-
CurveTo
public CurveTo()
Creates newCurveToinstance.
-
CurveTo
public CurveTo(boolean relative)
Creates newCurveToinstance.- Parameters:
relative-truein case it is a relative operator,falseif it is an absolute operator
-
CurveTo
public CurveTo(boolean relative, IOperatorConverter copier)Creates newCurveToinstance.- Parameters:
relative-truein case it is a relative operator,falseif it is an absolute operatorcopier-IOperatorConvertercopier for converting relative coordinates to absolute coordinates
-
-
Method Detail
-
draw
public void draw()
Description copied from class:AbstractPathShapeDraws this instruction to a canvas object.- Specified by:
drawin classAbstractPathShape
-
setCoordinates
public void setCoordinates(java.lang.String[] inputCoordinates, Point startPoint)Description copied from interface:IPathShapeThis method sets the coordinates for the path painting operator and does internal preprocessing, if necessary- Specified by:
setCoordinatesin interfaceIPathShape- Parameters:
inputCoordinates- an array containing point values for path coordinatesstartPoint- the ending point of the previous operator, or, in broader terms, the point that the coordinates should be absolutized against, for relative operators
-
getLastControlPoint
public Point getLastControlPoint()
Description copied from interface:IControlPointCurveReturns coordinates of the last control point (the one closest to the ending point) in the Bezier curve, in SVG space coordinates- Specified by:
getLastControlPointin interfaceIControlPointCurve- Returns:
- coordinates of the last control point in SVG space coordinates
-
getPathShapeRectangle
public Rectangle getPathShapeRectangle(Point lastPoint)
Description copied from class:AbstractPathShapeGet bounding rectangle of the current path shape.- Specified by:
getPathShapeRectanglein interfaceIPathShape- Overrides:
getPathShapeRectanglein classAbstractPathShape- Parameters:
lastPoint- start point for this shape- Returns:
- calculated rectangle
-
getFirstControlPoint
private Point getFirstControlPoint()
-
getBezierMinMaxPoints
private static double[] getBezierMinMaxPoints(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3)Initial function of cubic bezier is f(t) = (t-1)^3*P0 + 3*(1-t)^2*t*P1 + 3*(1-t)*t^2*P2 + t^3*P3, where 0 <= t <= 1 After opening brackets it can be reduced to f(t) = a*t^3 + b*t^2 + c*t + d, where a = P3-3*P2+3*P1-P0 b = 3*P2-6*P1+3*P0 c = 3*P1-3*P0 d = P0 First we must find the values of t at which the function reaches its extreme points. This happens in the methodgetTValuesInExtremePoints(double, double, double, double, double, double, double, double). Next we get x and y values in extremes and compare it with the start and ending points coordinates to get the borders of the bounding box.- Parameters:
x0- x coordinate of the starting pointy0- y coordinate of the starting pointx1- x coordinate of the first control pointy1- y coordinate of the first control pointx2- x coordinate of the second control pointy2- y coordinate of the second control pointx3- x coordinate of the ending pointy3- y coordinate of the ending point- Returns:
- array of {xMin, yMin, xMax, yMax} values
-
getTValuesInExtremePoints
private static double[] getTValuesInExtremePoints(double x0, double y0, double x1, double y1, double x2, double y2, double x3, double y3)Calculate values of t at which the function reaches its extreme points. To do this, we get the derivative of the function and equate it to 0: f'(t) = 3a*t^2 + 2b*t + c. This is parabola and for finding we calculate the discriminant. t can only be in the range [0, 1] and it discarded otherwise.- Parameters:
x0- x coordinate of the starting pointy0- y coordinate of the starting pointx1- x coordinate of the first control pointy1- y coordinate of the first control pointx2- x coordinate of the second control pointy2- y coordinate of the second control pointx3- x coordinate of the ending pointy3- y coordinate of the ending point- Returns:
- array of theta values corresponding to extreme points
-
calculateTValues
private static java.util.List<java.lang.Double> calculateTValues(double p0, double p1, double p2, double p3)Calculate the quadratic function 3a*t^2 + 2b*t + c = 0 to obtain the values of t- Parameters:
p0- coordinate of the starting pointp1- coordinate of the first control pointp2- coordinate of the second control pointp3- coordinate of the ending point- Returns:
- list of t values. t should be in range [0, 1]
-
addTValueToList
private static void addTValueToList(double t, java.util.List<java.lang.Double> tValuesList)Check that t is in the range [0, 1] and add it to list- Parameters:
t- value of ttValuesList- list storing t values
-
calculateExtremeCoordinate
private static double calculateExtremeCoordinate(double t, double p0, double p1, double p2, double p3)
-
-