svg2: Add new 'arcs' (extrapoloated) line join.

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'>&lt;number&gt;</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'>&lt;miterlimit&gt;</span> must be a
   <a>&lt;number&gt;</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>&#x03BA;</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>&#x03BA;</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> &#x00b1; &#xbd;
+  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>&#x03BA;<!-- κ --></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>&#x2212;<!-- − --></mo>
+            <msub>
+              <mi>P</mi>
+              <mn>0</mn>
+            </msub>
+            <mo stretchy="false">)</mo>
+            <mo>&#x00D7;<!-- × --></mo>
+            <mo stretchy="false">(</mo>
+            <msub>
+              <mi>P</mi>
+              <mn>2</mn>
+            </msub>
+            <mo>&#x2212;<!-- − --></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>&#x2212;<!-- − --></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>&#x03BA;<!-- κ --></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>&#x2212;<!-- − --></mo>
+            <msub>
+              <mi>P</mi>
+              <mn>1</mn>
+            </msub>
+            <mo stretchy="false">)</mo>
+            <mo>&#x00D7;<!-- × --></mo>
+            <mo stretchy="false">(</mo>
+            <msub>
+              <mi>P</mi>
+              <mn>0</mn>
+            </msub>
+            <mo>&#x2212;<!-- − --></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>&#x2212;<!-- − --></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>&#x03BA;(0)</var> and <var>&#x03BA;(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>&#x03BA;<!-- κ --></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>&#x2212;<!-- − --></mo>
+            <msub>
+              <mi>P</mi>
+              <mn>0</mn>
+            </msub>
+            <mo stretchy="false">)</mo>
+            <mo>&#x00D7;<!-- × --></mo>
+            <mo stretchy="false">(</mo>
+            <msub>
+              <mi>P</mi>
+              <mn>2</mn>
+            </msub>
+            <mo>&#x2212;<!-- − --></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>&#x2212;<!-- − --></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>&#x03BA;<!-- κ --></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>&#x2212;<!-- − --></mo>
+            <msub>
+              <mi>P</mi>
+              <mn>2</mn>
+            </msub>
+            <mo stretchy="false">)</mo>
+            <mo>&#x00D7;<!-- × --></mo>
+            <mo stretchy="false">(</mo>
+            <msub>
+              <mi>P</mi>
+              <mn>1</mn>
+            </msub>
+            <mo>&#x2212;<!-- − --></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>&#x2212;<!-- − --></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>&#x03BA;(0)</var> and <var>&#x03BA;(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