The following notes describe algorithms and other strategieswhich can be used by software developers when converting contentto and from the formats required by features in the SVG language.
To be consistent with other path segment notation,arcs in SVG paths are defined in terms of start and end points on the curve.
This parameterization of elliptical arcs will be referred toasendpoint parameterization. One of theadvantages of endpoint parameterization is that it permits aconsistent path syntax in which all path commands end in thecoordinates of the new "current point".
However, this is not the only way of describing arc geometryused in software or mathematics.This section describes the alternative center parameterization,and how to convert it from and to SVG's endpoint parameterization.
An elliptical arc, as represented in the SVG path command,is described by the following parameters in order:
(x1, y1) are the absolute coordinates of thecurrent point on the path, obtained from the last twoparameters of the previous path command.
rxandryare the radii of the ellipse (also known as its semi-major andsemi-minor axes).
φ is the angle from the x-axis of the current coordinatesystem to the x-axis of the ellipse.
fA isthe large arc flag, and is 0if an arc spanning less than or equal to 180 degrees is chosen, or 1if an arc spanning greater than 180 degrees is chosen.
fS isthe sweep flag, and is 0 ifthe line joining center to arc sweeps through decreasingangles, or 1 if it sweepsthrough increasing angles.
(x2, y2) are the absolute coordinates of thefinal point of the arc.
An arbitrary point (x, y) on the ellipticalarc can be described by the 2-dimensional matrix equation:
(eq. 3.1)x = rx*cos(θ)*cos(φ) - ry*sin(θ)*sin(φ) + cx y = rx*cos(θ)*sin(φ) + ry*sin(θ)*cos(φ) + cy
(cx, cy) arethe coordinates of the center of the ellipse.
rx andryare the radii of the ellipse (also known as its semi-major andsemi-minor axes).
φ is the angle from thex-axis of the current coordinate system to the x-axis of theellipse.
θ is the angle around the arc that the point(x, y) lies at, and ranges from:
If one thinks of an ellipse as a circle that has beenstretched and then rotated, thenθ1,θ2 and Δθare the start angle, end angle and sweep angle, respectivelyof the arc prior to the stretch and rotate operations.This leads to an alternate parameterization which is commonamong graphics APIs, which will be referred to ascenterparameterization. In the next sections, formulas aregiven for mapping in both directions between centerparameterization and endpoint parameterization.
Given the following variables:
cxcyrxryφθ1 Δθ
the task is to find:
x1y1x2y2fAfS
This can be achieved using the following formulas:
(eq. 4.1) | |
(eq. 4.2) | |
(eq. 4.3) | |
(eq. 4.4) |
Given the following variables:
x1y1x2y2fAfSrxryφ
the task is to find:
cxcyθ1 Δθ
The equations simplify after a translation whichplaces the origin at the midpoint of the line joining(x1, y1) to(x2, y2), followed bya rotation to line up the coordinate axes with the axes of the ellipse.All transformed coordinates will be written with primes. They arecomputed as intermediate values on the way toward finding the requiredcenter parameterization variables. This procedure consists of thefollowing steps:
Step 1: Compute (x1′, y1′)
(eq. 5.1) |
Step 2: Compute (cx′, cy′)
(eq. 5.2) |
where the + sign is chosen iffA ≠ fS, and the − sign is chosen iffA = fS.
Step 3: Compute (cx, cy)from (cx′, cy′)
(eq. 5.3) |
Step 4: Computeθ1 and Δθ
In general, the angle between two vectors (ux, uy) and (vx, vy) can be computed as
(eq. 5.4) |
where the ± sign appearing here is the sign ofux vy − uy vx.
This angle function can be used to expressθ1 and Δθ as follows:
(eq. 5.5) | |
(eq. 5.6) |
where Δθ is fixed in the range −360° < Δθ < 360° such that:
iffS = 0, then Δθ < 0,
else iffS = 1, then Δθ > 0.
In other words, iffS = 0 and the right side of (eq. 5.6) is greater than 0, then subtract 360°, whereas iffS = 1 and the right side of (eq. 5.6) is less than 0, then add 360°. In all other cases leave it as is.
This section describes the mathematical adjustments required for out-of-rangerx andry,as described in thePath implementation notes.Algorithmically these adjustments consist of the followingsteps:
Step 1: Ensure radii are non-zero
Ifrx = 0 orry = 0, then treat this as a straight line from (x1, y1) to (x2, y2) and stop. Otherwise,
Step 2: Ensure radii are positive
Take the absolute value ofrx andry:
(eq. 6.1) |
Step 3: Ensure radii are large enough
Using the primed coordinate values of equation (eq. 5.1), compute
(eq. 6.2) |
If the result of the above equation is less than or equal to 1, then no further change need be made torx andry. If the result of the above equation is greater than 1, then make the replacements
(eq. 6.3) |
Step 4: Proceed with computations
Proceed with the remaining elliptical arc computations, such as those in theConversion from endpoint to center parameterization algorithm. Note: As a consequence of the radii corrections in this section, the equation (5.2) for the center of the ellipse always has at least one solution (i.e. the radicand is never negative). In the case that the radii are scaled up using equation (eq. 6.3), the radicand of (eq. 5.2) is zero and there is exactly one solution for the center of the ellipse.
This section is informative.
Thereal number precision of SVG issingle-precision.conforming SVG generators handling technical datawhere expression of information exceeding single precision is desired,such as maps and technical drawings,are encouraged to follow the process outlined in this sectionto ensure consistent display inconforming SVG viewers.
Presentation with an effective precision higher thansingle-precision may be obtained by taking advantageof the fact that at least double-precision floating point must be usedwhen generating a CTM (See CTM generation processing in theConforming SVG Viewers section).The steps for generating content that takes advantage of this are:
Before Splitting | After Splitting | |
---|---|---|
![]() | ![]() |
Step 1 : Splitting content | Step 5 : Arranging tiles with smaller effective digits and appropriate translate | |
---|---|---|
![]() | ![]() | |
This example provides the significant figure of eight digits using tiles with the user coordinate system of seven digits. |