- From: SVG Working Group repository <cam@mcc.id.au>
- Date: Thu, 29 Nov 2012 11:07:23 -0800
- To: public-svg-wg@w3.org
details: https://svgwg.org/hg/svg2/rev/34d365211ba7 branches: changeset: 403:34d365211ba7 user: tbah <tavmjong@free.fr> date: Thu Nov 29 20:06:19 2012 +0100 description: Add new 'arcs' (extrapoloated) line join. diffstat: master/images/painting/linejoin-construction-arcs.png | 0 master/images/painting/linejoin-construction-arcs.svg | 55 ++ master/images/painting/linejoin-four.png | 0 master/images/painting/linejoin-four.svg | 40 + master/painting.html | 363 +++++++++++++++++- 5 files changed, 454 insertions(+), 4 deletions(-) diffs (1098 lines): diff --git a/master/images/painting/linejoin-construction-arcs.png b/master/images/painting/linejoin-construction-arcs.png new file mode 100644 index 0000000000000000000000000000000000000000..667f6ec130f5935044fb4b4825e3af8865abd1ba GIT binary patch literal 17580 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 C3b`2o diff --git a/master/images/painting/linejoin-construction-arcs.svg b/master/images/painting/linejoin-construction-arcs.svg new file mode 100644 --- /dev/null +++ b/master/images/painting/linejoin-construction-arcs.svg @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="500" height="200"> + <defs> + <g id="dot"> + <rect x="-3" y="-3" width="6" height="6" fill="white"/> + <rect x="-2" y="-2" width="4" height="4" fill="black"/> + </g> + </defs> + <g> + <!-- Dark gray stroke --> + <path + style="fill:none;stroke:#444;stroke-width:40" + d="m 286.4,79.3 c -14.2,24.8 -30.4,48.4 -47.4,71.11508 -6.0,7.8 -12.2,15.5 -18.6,23.0 M 89.8,116.8 c 67.0,1.9 134.1,-7.7 195.1,-36.9 0.47,-0.2 0.9,-0.4 1.4,-0.7" /> + <!-- Light gray path --> + <path + d="m 286.4,79.3 c -14.2,24.8 -30.4,48.4 -47.4,71.11508 -6.0,7.8 -12.2,15.5 -18.6,23.0 M 89.8,116.8 c 67.0,1.9 134.1,-7.7 195.1,-36.9 0.47,-0.2 0.9,-0.4 1.4,-0.7" + style="fill:none;stroke:#ccc;stroke-width:2" /> + </g> + <!-- Line join --> + <path + style="fill:deeppink" + d="m 277.5,61.6 8.5,17.5 17.7,10.2 c 7.8,-11.7 24.7,-49.2 29.9,-61.9 -19.8,14.2 -37.5,25.5 -56.1,34.2 z" /> + <!-- Path circles --> + <g style="fill:none;stroke:black;stroke-dasharray:3,3"> + <path + d="m 565,39 a 360,360 0 1 1 -720,0 360,360 0 1 1 720,0 z" + transform="translate(-73.9,-284.8)" /> + <path + transform="translate(-355.4,-203.7)" + d="M 705,39 A 500,500 0 1 1 -295,39 500,500 0 1 1 705,39 z" /> + </g> + <!-- Stroke edge circles --> + <g style="fill:none;stroke:#6a9100"> + <path + d="M 725,39 A 520,520 0 1 1 -315,39 520,520 0 1 1 725,39 z" + transform="translate(-355.4,-203.7)" /> + <path + transform="translate(-73.9,-284.8)" + d="m 545,39 a 340,340 0 1 1 -680,0 340,340 0 1 1 680,0 z" /> + </g> + <use y="79" x="286" xlink:href="#dot" /> + <use y="89" x="304" xlink:href="#dot" /> + <use y="62" x="278" xlink:href="#dot" /> + <use y="27" x="334" xlink:href="#dot" /> + <!-- Text --> + <g style="font-size:12px;font-family:sans-serif"> + <text style="text-anchor:middle;fill:#ccc" y="94" x="289">P</text> + <text style="text-anchor:end;fill:#444" y="61" x="272">P1</text> + <text style="fill:#444" y="103" x="304">P2</text> + <text style="text-anchor:middle;fill:#444" y="26" x="323">P4</text> + <text style="text-anchor:end" y="77" x="85">A<tspan style="font-size:10px" dy="2">outside</tspan></text> + <text style="text-anchor:end" y="186" x="295">B<tspan style="font-size:10px" dy="2">outside</tspan> + </text> + </g> +</svg> diff --git a/master/images/painting/linejoin-four.png b/master/images/painting/linejoin-four.png new file mode 100644 index 0000000000000000000000000000000000000000..9b58c96af61aa060c748a72a5183c845684155f8 GIT binary patch literal 11052 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 Nrkajw=^d+Q{|g;wu`B=p diff --git a/master/images/painting/linejoin-four.svg b/master/images/painting/linejoin-four.svg new file mode 100644 --- /dev/null +++ b/master/images/painting/linejoin-four.svg @@ -0,0 +1,40 @@ +<?xml version="1.0" standalone="no"?> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" + width="800" height="180" viewBox="0 0 800 180"> + <desc>Example linecap - demonstrates four stroke-linecap values</desc> + <style type="text/css"><![CDATA[ + .thick { stroke: black; stroke-width: 35px } + .thin { stroke: #ccc; stroke-width: 2px } + text { text-anchor: middle; font: 16px sans-serif } + circle { fill: #ccc; stroke: none } + ]]></style> + <defs> + <path id="path1" d="m 25,130 c 0,-40 50,-75 100,-75 -35,20 -50,50 -50,75" fill="none" /> + <circle id="circle1" cx="125" cy="55" r="4"/> + </defs> + <g transform="translate(0,0)"> + <use class="thick" xlink:href="#path1" stroke-linejoin="miter"/> + <use class="thin" xlink:href="#path1"/> + <use xlink:href="#circle1"/> + <text x="100" y="160">‘miter’ join</text> + </g> + <g transform="translate(200,0)"> + <use class="thick" xlink:href="#path1" stroke-linejoin="round"/> + <use class="thin" xlink:href="#path1"/> + <use xlink:href="#circle1"/> + <text x="100" y="160">‘round’ join</text> + </g> + <g transform="translate(400,0)"> + <use class="thick" xlink:href="#path1" stroke-linejoin="bevel"/> + <use class="thin" xlink:href="#path1"/> + <use xlink:href="#circle1"/> + <text x="100" y="160">‘bevel’ join</text> + </g> + <path id="join" d="m 724,37.5 c 18,0 41,3.6 65,17.7 C 769,55.6 750,60.7 733,70.6 Z"/> + <g transform="translate(600,0)"> + <use class="thick" xlink:href="#path1" stroke-linejoin="bevel"/> + <use class="thin" xlink:href="#path1"/> + <use xlink:href="#circle1"/> + <text x="100" y="160">‘arcs’ join</text> + </g> +</svg> diff --git a/master/painting.html b/master/painting.html --- a/master/painting.html +++ b/master/painting.html @@ -722,17 +722,17 @@ and <span class="property">'stroke-miter <table class="propdef"> <tr> <th>Name:</th> <td><dfn id="StrokeLinejoinProperty">stroke-linejoin</dfn></td> </tr> <tr> <th>Value:</th> - <td>miter | round | bevel</td> + <td>miter | round | bevel | arcs </td> </tr> <tr> <th>Initial:</th> <td>miter</td> </tr> <tr> <th>Applies to:</th> <td><a>shapes</a> and <a>text content elements</a></td> @@ -771,22 +771,43 @@ the <a href="implnote.html#PathElementIm <dt><span class='prop-value'>round</span></dt> <dd>This value indicates that a round corner is to be used to join path segments. The corner is a circular sector centered on the join point.</dd> <dt><span class='prop-value'>bevel</span></dt> <dd>This value indicates that a bevelled corner is to be used to join path segments. The bevel shape is a triangle that fills the area between the two stroked segments.</dd> + + <dt><span class='prop-value'>arcs</span></dt> + <dd>This value indicates that an arcs corner is to be used to join + path segments. The arcs shape is formed by extending the outer + edges of the stroke at the join point with arcs that have the same + curvature as the outer edges at the join point.</dd> </dl> +<p class="issue">Is there a better name than <i>arcs</i> for this property value? +I (Tav) prefer <i>talon</i> (as in bird claw). The term <i>arc</i> has other uses +in SVG and in graphics in general. The term <i>talon</i> would be unique as well +as fit in with the existing property value names for line-join.</p> + +<p class="issue">How does the miter limit apply? (It's hard to get really +long joins.) Do you fall back to miter or bevel? (Probably miter as it is +more in the style.)</p> + +<p class="note">The <span class='prop-value'>arcs</span> value is new in SVG 2. +It was added to provide a better looking join when the path segments at the +join are curved.</p> + +<p class="annotation">Adding new line join was approved at <a href="http://www.w3.org/2012/09/19-svg-minutes.html#item08">Rigi Kaltbad group meeting</a>.</p> + <div class="figure"> - <img class="bordered" src="images/painting/linejoin.svg" - alt="Image showing three paths, each with a different line join."/> - <p class="caption">The three types of line joins.</p> + <img class="bordered" src="images/painting/linejoin-four.svg" + alt="Image showing four paths, each with a different line join."/> + <p class="caption">The four types of line joins.</p> </div> <table class="propdef"> <tr> <th>Name:</th> <td><dfn id="StrokeMiterlimitProperty">stroke-miterlimit</dfn></td> </tr> <tr> @@ -826,16 +847,18 @@ the <a href="implnote.html#PathElementIm <p>When two line segments meet at a sharp angle and <span class='prop-value'>miter</span> joins have been specified for <a>'stroke-linejoin'</a>, it is possible for the miter to extend far beyond the thickness of the line stroking the path. The <a>'stroke-miterlimit'</a> imposes a limit on the ratio of the miter length to the <a>'stroke-width'</a>. When the limit is exceeded, the join is converted from a miter to a bevel.</p> +<p class="issue">How should this apply to arcs line-joins?</p> + <dl> <dt><span class='prop-value'><number></span></dt> <dd>The limit on the ratio of the miter length to the <a>'stroke-width'</a>. The value of <span class='prop-value'><miterlimit></span> must be a <a><number></a> greater than or equal to 1. Any other value is an error (see <a href="implnote.html#ErrorProcessing">Error processing</a>).</dd> </dl> @@ -1270,16 +1293,33 @@ a subpath is determined as follows:</p> <var>P</var>, <var>P</var><sub>1</sub> and <var>P</var><sub>2</sub>.</li> <li>If <a>'stroke-linejoin'</a> is <span class="prop-value">round</span>, then return the union of <var>bevel</var> and a circular sector of radius <a>'stroke-width'</a>, centered on <var>P</var>, and which has <var>P</var><sub>1</sub> and <var>P</var><sub>2</sub> as the two endpoints of the arc.</li> + <li>If <a>'stroke-linejoin'</a> is <span class="prop-value">arcs</span>, + then find the circles that are tangent to the stroke edges at + <var>P</var><sub>1</sub> and <var>P</var><sub>2</sub> with the + same curvature as the edges at those points (see below). If both + curvatures are zero fall through to <span class="prop-value">miter</span>. + Extend the stroke edges using these circles (or a line, in the case + of zero curvature). If the two circles (or circle and line) + intersect, return the area inside the region defined by the lines + that connect <var>P</var> with <var>P</var><sub>1</sub> + and <var>P</var><sub>2</sub> and the arcs defined by the circles + (or arc and line) between the closest intersection point + to <var>P</var>, and <var>P</var><sub>1</sub> and + <var>P</var><sub>2</sub>. If the two circles (or circle and line) + do not intersect, fall through to <span class="prop-value">miter</span>. + Note that the curvatures are calculated in user-space before any + transforms are applied.</li> + <li>Let <var>θ</var> be the angle between <var>A</var> and <var>B</var>.</li> <li>If <a>'stroke-linejoin'</a> is <span class="prop-value">miter</span> and 1 / sin(<var>θ</var> / 2) ≤ <a>'stroke-miterlimit'</a>, then return the union of <var>bevel</var> and the triangle formed from the three points <var>P</var><sub>1</sub>, <var>P</var><sub>2</sub> and <var>P</var><sub>3</sub>.</li> <li>Return <var>bevel</var>.</li> @@ -1288,16 +1328,331 @@ a subpath is determined as follows:</p> <div class="figure"> <img class="bordered" src="images/painting/linejoin-construction.svg" alt="Image showing the lines and points computed to construct a round line join."/> <p class="caption">Construction of a round line join shape, shown in pink. The white line is the original path, which has two segments that come to a point, and the gray region is the stroke.</p> </div> +<div class="figure"> + <img class="bordered" src="images/painting/linejoin-construction-arcs.svg" + alt="Image showing the lines and points computed to construct an arcs line join."/> + <p class="caption">Construction of an arcs line join shape, shown in + pink. The white line is the original path, which has two segments + that come to a point, and the gray region is the stroke. The + dashed lines show circles that are tangent to and have the + curvature of the segments at the join. The olive-green circles + (concentric with the dashed circles) define the join shape.</p> +</div> + +<h3 id="CurvatureCalculation">Computing the circles for the <span class="prop-value">arcs</span> +'stroke-linejoin'</h3> + +<p>The <span class="prop-value">arcs</span> <a>'stroke-linejoin'</a> + requires finding circles that are both tangent to and have the same + curvatures as the outer stroke edges at the ends of path + segments. To find one of these circles, first calculate the + curvature <var>κ</var> of the path segment at its end (see + below). Next, find the radius of a circle corresponding to this + curvature: <var>r</var> = 1/<var>κ</var>. Increase or + decrease the radius by one half of the stroke width to account for + the stroke: <var>r<sub>c</sub></var> = <var>r</var> ± ½ + stroke-width. The center of the circle will be on a line normal to + the path end a distance of <var>r<sub>c</sub></var> away from the + outer stroke edge at the end.</p> + +<p>For a line: the curvature is infinite. Extend the outer stroke edge by a line.</p> + +<p>For an elliptical arc:</p> +<p class="issue">Need to do. This isn't as trivial as it first looks since we have to deal + with rx != ry and an arbitrary rotation.</p> + +<p>For a quadratic Bézier: + + <div role="math" aria-describedby="math-quadratic-start"> + <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> + <mi>κ<!-- κ --></mi> + <mo stretchy="false">(</mo> + <mn>0</mn> + <mo stretchy="false">)</mo> + <mo>=</mo> + <mrow class="MJX-TeXAtom-ORD"> + <mfrac> + <mn>1</mn> + <mn>2</mn> + </mfrac> + </mrow> + <mrow class="MJX-TeXAtom-ORD"> + <mfrac> + <mrow> + <mo stretchy="false">(</mo> + <msub> + <mi>P</mi> + <mn>1</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>0</mn> + </msub> + <mo stretchy="false">)</mo> + <mo>×<!-- × --></mo> + <mo stretchy="false">(</mo> + <msub> + <mi>P</mi> + <mn>2</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>1</mn> + </msub> + <mo stretchy="false">)</mo> + </mrow> + <mrow> + <mrow class="MJX-TeXAtom-ORD"> + <mo stretchy="false">|</mo> + </mrow> + <msub> + <mi>P</mi> + <mn>1</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>0</mn> + </msub> + <msup> + <mrow class="MJX-TeXAtom-ORD"> + <mo stretchy="false">|</mo> + </mrow> + <mn>3</mn> + </msup> + </mrow> + </mfrac> + </mrow> + </math> + <pre id="math-quadratic-start">$$\kappa(0) = {2\over3}{(P_1-P_0)\times((P_0-P_1)+(P_2-P_1))\over|P_1-P_0|^3}$$</pre> + </div> + + <div role="math" aria-describedby="math-quadratic-end"> + <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> + <mi>κ<!-- κ --></mi> + <mo stretchy="false">(</mo> + <mn>1</mn> + <mo stretchy="false">)</mo> + <mo>=</mo> + <mrow class="MJX-TeXAtom-ORD"> + <mfrac> + <mn>1</mn> + <mn>2</mn> + </mfrac> + </mrow> + <mrow class="MJX-TeXAtom-ORD"> + <mfrac> + <mrow> + <mo stretchy="false">(</mo> + <msub> + <mi>P</mi> + <mn>2</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>1</mn> + </msub> + <mo stretchy="false">)</mo> + <mo>×<!-- × --></mo> + <mo stretchy="false">(</mo> + <msub> + <mi>P</mi> + <mn>0</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>1</mn> + </msub> + <mo stretchy="false">)</mo> + </mrow> + <mrow> + <mrow class="MJX-TeXAtom-ORD"> + <mo stretchy="false">|</mo> + </mrow> + <msub> + <mi>P</mi> + <mn>2</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>1</mn> + </msub> + <msup> + <mrow class="MJX-TeXAtom-ORD"> + <mo stretchy="false">|</mo> + </mrow> + <mn>3</mn> + </msup> + </mrow> + </mfrac> + </mrow> + </math> + <pre id="math-quadratic-start">$$\kappa(0) = {2\over3}{(P_1-P_0)\times((P_0-P_1)+(P_2-P_1))\over|P_1-P_0|^3}$$</pre> + </div> + + Where <var>κ(0)</var> and <var>κ(1)</var> are the + signed curvatures at the start and end of the path segment + respectively, and the <var>P</var>'s are the three points that + define the quadratic Bézier.</p> + +<p>For a cubic Bézier: + + <div role="math" aria-describedby="math-cubic-start"> + <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> + <mi>κ<!-- κ --></mi> + <mo stretchy="false">(</mo> + <mn>0</mn> + <mo stretchy="false">)</mo> + <mo>=</mo> + <mrow class="MJX-TeXAtom-ORD"> + <mfrac> + <mn>2</mn> + <mn>3</mn> + </mfrac> + </mrow> + <mrow class="MJX-TeXAtom-ORD"> + <mfrac> + <mrow> + <mo stretchy="false">(</mo> + <msub> + <mi>P</mi> + <mn>1</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>0</mn> + </msub> + <mo stretchy="false">)</mo> + <mo>×<!-- × --></mo> + <mo stretchy="false">(</mo> + <msub> + <mi>P</mi> + <mn>2</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>1</mn> + </msub> + <mo stretchy="false">)</mo> + </mrow> + <mrow> + <mrow class="MJX-TeXAtom-ORD"> + <mo stretchy="false">|</mo> + </mrow> + <msub> + <mi>P</mi> + <mn>1</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>0</mn> + </msub> + <msup> + <mrow class="MJX-TeXAtom-ORD"> + <mo stretchy="false">|</mo> + </mrow> + <mn>3</mn> + </msup> + </mrow> + </mfrac> + </mrow> + </math> + <pre id="math-cubic-start">$$\kappa(0) = {2\over3}{(P_1-P_0)\times((P_0-P_1)+(P_2-P_1))\over|P_1-P_0|^3}$$</pre> + </div> + + <div role="math" aria-describedby="math-cubic-end"> + <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> + <mi>κ<!-- κ --></mi> + <mo stretchy="false">(</mo> + <mn>1</mn> + <mo stretchy="false">)</mo> + <mo>=</mo> + <mrow class="MJX-TeXAtom-ORD"> + <mfrac> + <mn>2</mn> + <mn>3</mn> + </mfrac> + </mrow> + <mrow class="MJX-TeXAtom-ORD"> + <mfrac> + <mrow> + <mo stretchy="false">(</mo> + <msub> + <mi>P</mi> + <mn>3</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>2</mn> + </msub> + <mo stretchy="false">)</mo> + <mo>×<!-- × --></mo> + <mo stretchy="false">(</mo> + <msub> + <mi>P</mi> + <mn>1</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>2</mn> + </msub> + <mo stretchy="false">)</mo> + </mrow> + <mrow> + <mrow class="MJX-TeXAtom-ORD"> + <mo stretchy="false">|</mo> + </mrow> + <msub> + <mi>P</mi> + <mn>3</mn> + </msub> + <mo>−<!-- − --></mo> + <msub> + <mi>P</mi> + <mn>2</mn> + </msub> + <msup> + <mrow class="MJX-TeXAtom-ORD"> + <mo stretchy="false">|</mo> + </mrow> + <mn>3</mn> + </msup> + </mrow> + </mfrac> + </mrow> + </math> + <pre id="math-cubic-end">$$\kappa(1) = {2\over3}{(P_3-P_2)\times((P_1-P_2)+(P_3-P_2))\over|P_3-P_2|^3}$$</pre> + </div> + + Where <var>κ(0)</var> and <var>κ(1)</var> are the + signed curvatures at the start and end of the path segment + respectively, and the <var>P</var>'s are the four points that define + the cubic Bézier. Note, if + <var>P<sub>0</sub></var> and <var>P<sub>1</sub></var>, or + <var>P<sub>2</sub></var> and <var>P<sub>3</sub></var> are degenerate, the + curvature will be infinite and a line should be used in constructing the join.</p> + + <h2 id="VisibilityControl">Controlling visibility: the effect of the <span class="property">'display'</span> and <span class="property">'visibility'</span> properties</h2> <p class="note">See the CSS 2.1 specification for the definitions of <a>'display'</a> and <a>'visibility'</a>. [<a href="refs.html#ref-CSS21">CSS21</a>]</p>
Received on Thursday, 29 November 2012 19:08:42 UTC