mirror of
https://github.com/reanimate/reanimate.git
synced 2026-09-15 10:02:45 +00:00
Deploying to gh-pages from @ efa551d26d 🚀
This commit is contained in:
parent
cdd614545f
commit
1b57faba84
14 changed files with 1068 additions and 700 deletions
12
haddock.txt
12
haddock.txt
|
|
@ -2,6 +2,7 @@
|
|||
100% ( 55 / 55) in 'Reanimate.Svg.Constructors'
|
||||
100% ( 41 / 41) in 'Reanimate.Animation'
|
||||
100% ( 40 / 40) in 'Reanimate.GeoProjection'
|
||||
100% ( 25 / 25) in 'Reanimate.PolyShape'
|
||||
100% ( 22 / 22) in 'Reanimate.Effect'
|
||||
100% ( 17 / 17) in 'Reanimate.Parameters'
|
||||
100% ( 14 / 14) in 'Reanimate.Raster'
|
||||
|
|
@ -17,29 +18,26 @@
|
|||
100% ( 5 / 5) in 'Reanimate.Transform'
|
||||
100% ( 4 / 4) in 'Reanimate.Svg.BoundingBox'
|
||||
100% ( 3 / 3) in 'Reanimate.Blender'
|
||||
100% ( 2 / 2) in 'Reanimate.Builtin.CirclePlot'
|
||||
88% ( 7 / 8) in 'Reanimate.Transition'
|
||||
86% ( 98 /114) in 'Reanimate.Scene'
|
||||
75% ( 3 / 4) in 'Reanimate.Svg.Unuse'
|
||||
62% ( 23 / 37) in 'Reanimate.Internal.CubicBezier'
|
||||
62% ( 23 / 37) in 'Geom2D.CubicBezier.Linear'
|
||||
56% ( 10 / 18) in 'Reanimate.Svg'
|
||||
50% ( 1 / 2) in 'Reanimate.Builtin.CirclePlot'
|
||||
44% ( 4 / 9) in 'Reanimate.LaTeX'
|
||||
31% ( 4 / 13) in 'Reanimate.Render'
|
||||
25% ( 1 / 4) in 'Reanimate.Builtin.Slide'
|
||||
12% ( 2 / 17) in 'Reanimate.Math.SSSP'
|
||||
10% ( 3 / 30) in 'Reanimate.PolyShape'
|
||||
7% ( 2 / 29) in 'Reanimate.Math.Common'
|
||||
10% ( 3 / 29) in 'Reanimate.Math.Common'
|
||||
6% ( 5 / 84) in 'Reanimate.Math.Polygon'
|
||||
6% ( 1 / 18) in 'Reanimate.Svg.LineCommand'
|
||||
0% ( 0 / 13) in 'Reanimate.Morph.Common'
|
||||
0% ( 0 / 10) in 'Reanimate.ColorSpace'
|
||||
0% ( 0 / 8) in 'Reanimate.Misc'
|
||||
0% ( 0 / 7) in 'Reanimate.Morph.Linear'
|
||||
0% ( 0 / 6) in 'Reanimate.Math.Triangulate'
|
||||
0% ( 0 / 6) in 'Reanimate.Math.EarClip'
|
||||
0% ( 0 / 7) in 'Reanimate.Math.Triangulate'
|
||||
0% ( 0 / 5) in 'Reanimate.Builtin.Flip'
|
||||
0% ( 0 / 4) in 'Reanimate.Debug'
|
||||
0% ( 0 / 3) in 'Reanimate.Morph.Rotational'
|
||||
0% ( 0 / 3) in 'Reanimate.Memo'
|
||||
0% ( 0 / 3) in 'Reanimate.Math.Balloon'
|
||||
0% ( 0 / 2) in 'Reanimate.Morph.Cache'
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
{ "schemaVersion": 1, "label": "api docs", "message": "71%", "color": "success" }
|
||||
{ "schemaVersion": 1, "label": "api docs", "message": "77%", "color": "success" }
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
{ "schemaVersion": 1, "label": "api tests", "message": "30%", "color": "success" }
|
||||
{ "schemaVersion": 1, "label": "api tests", "message": "31%", "color": "success" }
|
||||
|
|
|
|||
|
|
@ -7,6 +7,9 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
</style>
|
||||
</head><body><table class="dashboard" width="100%" border=1>
|
||||
<tr><th rowspan=2><a href="hpc_index.html">module</a></th><th colspan=3><a href="hpc_index_fun.html">Top Level Definitions</a></th><th colspan=3><a href="hpc_index_alt.html">Alternatives</a></th><th colspan=3><a href="hpc_index_exp.html">Expressions</a></th></tr><tr><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th><th>%</th><th colspan=2>covered / total</th></tr><tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Geom2D.CubicBezier.Linear.hs.html">reanimate-0.4.1.0-inplace/Geom2D.CubicBezier.Linear</a></tt></td>
|
||||
<td align="right">23%</td><td>20/86</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="23%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>2/26</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>102/337</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Paths_reanimate.hs.html">reanimate-0.4.1.0-inplace/Paths_reanimate</a></tt></td>
|
||||
<td align="right">20%</td><td>3/15</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="20%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">20%</td><td>12/58</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="20%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
|
|
@ -58,18 +61,12 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Effect.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Effect</a></tt></td>
|
||||
<td align="right">52%</td><td>9/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="52%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">66%</td><td>4/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="66%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">53%</td><td>67/125</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="53%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Internal.CubicBezier.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Internal.CubicBezier</a></tt></td>
|
||||
<td align="right">23%</td><td>20/86</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="23%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>2/26</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>102/337</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.LaTeX.hs.html">reanimate-0.4.1.0-inplace/Reanimate.LaTeX</a></tt></td>
|
||||
<td align="right">33%</td><td>4/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">11%</td><td>1/9</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="11%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>12/167</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.Common.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.Common</a></tt></td>
|
||||
<td align="right">0%</td><td>0/26</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/407</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.EarClip.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.EarClip</a></tt></td>
|
||||
<td align="right">0%</td><td>0/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/260</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.Polygon.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.Polygon</a></tt></td>
|
||||
<td align="right">8%</td><td>7/82</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="8%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">5%</td><td>4/79</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="5%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">2%</td><td>58/2494</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="2%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
|
|
@ -77,7 +74,7 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td align="right">0%</td><td>0/16</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/43</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/854</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.Triangulate.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.Triangulate</a></tt></td>
|
||||
<td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/104</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<td align="right">0%</td><td>0/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/139</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Misc.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Misc</a></tt></td>
|
||||
<td align="right">0%</td><td>0/7</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/162</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
|
|
@ -95,7 +92,7 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td align="right">15%</td><td>3/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">14%</td><td>7/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="14%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.PolyShape.hs.html">reanimate-0.4.1.0-inplace/Reanimate.PolyShape</a></tt></td>
|
||||
<td align="right">21%</td><td>8/38</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="21%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">23%</td><td>13/55</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="23%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">15%</td><td>127/794</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<td align="right">22%</td><td>8/35</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="22%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">27%</td><td>13/48</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>127/691</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Raster.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Raster</a></tt></td>
|
||||
<td align="right">15%</td><td>2/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">11%</td><td>52/443</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="11%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
|
|
@ -128,5 +125,5 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td align="right">100%</td><td>6/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">50%</td><td>1/2</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="50%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">95%</td><td>43/45</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="95%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr></tr><tr style="background: #e0e0e0">
|
||||
<th align=left> Program Coverage Total</tt></th>
|
||||
<td align="right">30%</td><td>247/801</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">15%</td><td>131/829</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4647/15845</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<td align="right">31%</td><td>247/787</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4647/15517</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
</table></body></html>
|
||||
|
|
|
|||
|
|
@ -37,12 +37,12 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Transform.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Transform</a></tt></td>
|
||||
<td align="right">83%</td><td>5/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="83%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">33%</td><td>4/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">45%</td><td>76/166</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="45%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.PolyShape.hs.html">reanimate-0.4.1.0-inplace/Reanimate.PolyShape</a></tt></td>
|
||||
<td align="right">22%</td><td>8/35</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="22%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">27%</td><td>13/48</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>127/691</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Builtin.Images.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Builtin.Images</a></tt></td>
|
||||
<td align="right">57%</td><td>4/7</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="57%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">25%</td><td>1/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="25%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">48%</td><td>24/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="48%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.PolyShape.hs.html">reanimate-0.4.1.0-inplace/Reanimate.PolyShape</a></tt></td>
|
||||
<td align="right">21%</td><td>8/38</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="21%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">23%</td><td>13/55</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="23%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">15%</td><td>127/794</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Svg.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Svg</a></tt></td>
|
||||
<td align="right">38%</td><td>5/13</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="38%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>15/80</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">41%</td><td>323/777</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="41%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
|
|
@ -55,7 +55,7 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.LaTeX.hs.html">reanimate-0.4.1.0-inplace/Reanimate.LaTeX</a></tt></td>
|
||||
<td align="right">33%</td><td>4/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">11%</td><td>1/9</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="11%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>12/167</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Internal.CubicBezier.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Internal.CubicBezier</a></tt></td>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Geom2D.CubicBezier.Linear.hs.html">reanimate-0.4.1.0-inplace/Geom2D.CubicBezier.Linear</a></tt></td>
|
||||
<td align="right">23%</td><td>20/86</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="23%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>2/26</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>102/337</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.Polygon.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.Polygon</a></tt></td>
|
||||
|
|
@ -85,9 +85,6 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.Common.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.Common</a></tt></td>
|
||||
<td align="right">0%</td><td>0/26</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/407</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.EarClip.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.EarClip</a></tt></td>
|
||||
<td align="right">0%</td><td>0/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/260</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.SSSP.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.SSSP</a></tt></td>
|
||||
<td align="right">0%</td><td>0/16</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/43</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/854</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
|
|
@ -122,11 +119,11 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.Triangulate.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.Triangulate</a></tt></td>
|
||||
<td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/104</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<td align="right">0%</td><td>0/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/139</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Parameters.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Parameters</a></tt></td>
|
||||
<td align="right">15%</td><td>3/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">14%</td><td>7/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="14%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr></tr><tr style="background: #e0e0e0">
|
||||
<th align=left> Program Coverage Total</tt></th>
|
||||
<td align="right">30%</td><td>247/801</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">15%</td><td>131/829</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4647/15845</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<td align="right">31%</td><td>247/787</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4647/15517</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
</table></body></html>
|
||||
|
|
|
|||
|
|
@ -49,12 +49,12 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Scene.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Scene</a></tt></td>
|
||||
<td align="right">30%</td><td>40/130</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>15/25</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="60%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">36%</td><td>545/1483</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="36%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Geom2D.CubicBezier.Linear.hs.html">reanimate-0.4.1.0-inplace/Geom2D.CubicBezier.Linear</a></tt></td>
|
||||
<td align="right">23%</td><td>20/86</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="23%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>2/26</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>102/337</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Builtin.Slide.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Builtin.Slide</a></tt></td>
|
||||
<td align="right">33%</td><td>1/3</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="33%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">30%</td><td>18/60</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Internal.CubicBezier.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Internal.CubicBezier</a></tt></td>
|
||||
<td align="right">23%</td><td>20/86</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="23%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>2/26</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>102/337</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Morph.Linear.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Morph.Linear</a></tt></td>
|
||||
<td align="right">50%</td><td>3/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="50%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>1/6</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">27%</td><td>23/84</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
|
|
@ -67,12 +67,12 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Paths_reanimate.hs.html">reanimate-0.4.1.0-inplace/Paths_reanimate</a></tt></td>
|
||||
<td align="right">20%</td><td>3/15</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="20%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">20%</td><td>12/58</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="20%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.PolyShape.hs.html">reanimate-0.4.1.0-inplace/Reanimate.PolyShape</a></tt></td>
|
||||
<td align="right">22%</td><td>8/35</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="22%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">27%</td><td>13/48</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>127/691</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Constants.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Constants</a></tt></td>
|
||||
<td align="right">37%</td><td>3/8</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="37%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">16%</td><td>3/18</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.PolyShape.hs.html">reanimate-0.4.1.0-inplace/Reanimate.PolyShape</a></tt></td>
|
||||
<td align="right">21%</td><td>8/38</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="21%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">23%</td><td>13/55</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="23%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">15%</td><td>127/794</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Parameters.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Parameters</a></tt></td>
|
||||
<td align="right">15%</td><td>3/20</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">14%</td><td>7/49</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="14%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
|
|
@ -112,14 +112,11 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.Common.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.Common</a></tt></td>
|
||||
<td align="right">0%</td><td>0/26</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/407</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.EarClip.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.EarClip</a></tt></td>
|
||||
<td align="right">0%</td><td>0/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/260</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.SSSP.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.SSSP</a></tt></td>
|
||||
<td align="right">0%</td><td>0/16</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/43</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/854</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.Triangulate.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.Triangulate</a></tt></td>
|
||||
<td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/104</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<td align="right">0%</td><td>0/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/139</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Misc.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Misc</a></tt></td>
|
||||
<td align="right">0%</td><td>0/7</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/162</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
|
|
@ -128,5 +125,5 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/61</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr></tr><tr style="background: #e0e0e0">
|
||||
<th align=left> Program Coverage Total</tt></th>
|
||||
<td align="right">30%</td><td>247/801</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">15%</td><td>131/829</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4647/15845</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<td align="right">31%</td><td>247/787</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4647/15517</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
</table></body></html>
|
||||
|
|
|
|||
|
|
@ -67,11 +67,11 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Scene.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Scene</a></tt></td>
|
||||
<td align="right">30%</td><td>40/130</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">60%</td><td>15/25</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="60%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">36%</td><td>545/1483</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="36%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Internal.CubicBezier.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Internal.CubicBezier</a></tt></td>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Geom2D.CubicBezier.Linear.hs.html">reanimate-0.4.1.0-inplace/Geom2D.CubicBezier.Linear</a></tt></td>
|
||||
<td align="right">23%</td><td>20/86</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="23%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">7%</td><td>2/26</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="7%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">30%</td><td>102/337</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.PolyShape.hs.html">reanimate-0.4.1.0-inplace/Reanimate.PolyShape</a></tt></td>
|
||||
<td align="right">21%</td><td>8/38</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="21%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">23%</td><td>13/55</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="23%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">15%</td><td>127/794</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<td align="right">22%</td><td>8/35</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="22%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">27%</td><td>13/48</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="27%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">18%</td><td>127/691</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="18%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Paths_reanimate.hs.html">reanimate-0.4.1.0-inplace/Paths_reanimate</a></tt></td>
|
||||
<td align="right">20%</td><td>3/15</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="20%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">20%</td><td>12/58</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="20%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
|
|
@ -112,14 +112,11 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.Common.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.Common</a></tt></td>
|
||||
<td align="right">0%</td><td>0/26</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/407</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.EarClip.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.EarClip</a></tt></td>
|
||||
<td align="right">0%</td><td>0/12</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/17</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/260</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.SSSP.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.SSSP</a></tt></td>
|
||||
<td align="right">0%</td><td>0/16</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/43</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/854</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Math.Triangulate.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Math.Triangulate</a></tt></td>
|
||||
<td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/104</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<td align="right">0%</td><td>0/5</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">- </td><td>0/0</td><td width=100> </td><td align="right">0%</td><td>0/139</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr>
|
||||
<td> <tt>module <a href="reanimate-0.4.1.0-inplace/Reanimate.Misc.hs.html">reanimate-0.4.1.0-inplace/Reanimate.Misc</a></tt></td>
|
||||
<td align="right">0%</td><td>0/7</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/14</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/162</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
|
|
@ -128,5 +125,5 @@ table.dashboard { border-collapse: collapse ; border: solid 1px black }
|
|||
<td align="right">0%</td><td>0/1</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/4</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td><td align="right">0%</td><td>0/61</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="100%"><tr><td height=12 class="invbar"></td></tr></table></td></tr></table></td></tr>
|
||||
<tr></tr><tr style="background: #e0e0e0">
|
||||
<th align=left> Program Coverage Total</tt></th>
|
||||
<td align="right">30%</td><td>247/801</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="30%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">15%</td><td>131/829</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="15%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4647/15845</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
<td align="right">31%</td><td>247/787</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="31%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">16%</td><td>131/805</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="16%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td><td align="right">29%</td><td>4647/15517</td><td width=100><table cellpadding=0 cellspacing=0 width="100" class="bar"><tr><td><table cellpadding=0 cellspacing=0 width="29%"><tr><td height=12 class="bar"></td></tr></table></td></tr></table></td></tr>
|
||||
</table></body></html>
|
||||
|
|
|
|||
|
|
@ -9,4 +9,4 @@ const snippets = [{"title": "Hello World","url": "https://reanimate.clozecards.c
|
|||
,{"title": "Object Positions","url": "https://reanimate.clozecards.com/IAQhjO0Ke7h/195.svg","code": "env =\n addStatic (mkBackground \"white\") .\n mapA (withStrokeColor \"black\")\n\nanimation :: Animation\nanimation = env $\n sceneAnimation $ do\n -- Configure objects\n txt <- newText \"Center\"\n top <- newText \"Top\"\n oModifyS top $ \n oTopY .= screenTop\n topR <- newText \"Top right\"\n oModifyS topR $ do\n oTopY .= screenTop\n oRightX .= screenRight\n botR <- newText \"Bottom right\"\n oModifyS botR $ do\n oBottomY .= screenBottom\n oRightX .= screenRight\n botL <- newText \"Bottom left\"\n oModifyS botL $ do\n oBottomY .= screenBottom\n oLeftX .= screenLeft\n topL <- newText \"Top left\"\n oModifyS topL $ do\n oTopY .= screenTop\n oLeftX .= screenLeft\n -- Show objects\n oShow txt\n wait 1\n switchTo txt top\n switchTo top topR\n switchTo topR botR\n switchTo botR botL\n switchTo botL topL\n switchTo topL txt\n\nswitchTo src dst = do\n fork $ oFadeOut src 1\n oModify dst $ oOpacity .~ 1\n oFadeIn dst 1\n wait 1\n\nnewText txt =\n newObject $ scale 1.5 $ center $ latex txt\n"}
|
||||
,{"title": "Camera","url": "https://reanimate.clozecards.com/CD5Bg7AwVkF/150.svg","code": "animation :: Animation\nanimation = docEnv $ mapA (withFillOpacity 1) $ sceneAnimation $ do\n cam <- newObject Camera\n\n txt <- newObject $ center $ latex \"Fixed (non-cam)\"\n oModifyS txt $ do\n oTopY .= screenTop \n oZIndex .= 2\n\n circle <- newObject $ Circle 1\n cameraAttach cam circle\n oModify circle $ oContext .~ withFillColor \"blue\"\n circleRight <- oRead circle oRightX\n\n box <- newObject $ Rectangle 2 2\n cameraAttach cam box\n oModify box $ oContext .~ withFillColor \"green\"\n oModify box $ oLeftX .~ circleRight\n boxCenter <- oRead box oCenterXY\n\n small <- newObject $ center $ latex \"This text is very small\"\n cameraAttach cam small\n oModifyS small $ do\n oCenterXY .= boxCenter\n oScale .= 0.1\n \n oShow txt\n oShow small\n oShow circle\n oShow box\n\n wait 1\n\n cameraFocus cam boxCenter\n waitOn $ do\n fork $ cameraPan cam 3 boxCenter\n fork $ cameraZoom cam 3 15\n \n wait 2\n cameraZoom cam 3 1\n cameraPan cam 1 (0,0)\n"}
|
||||
];
|
||||
const playgroundVersion = "2020-08-25 (5eade)";
|
||||
const playgroundVersion = "2020-08-26 (efa55)";
|
||||
|
|
|
|||
325
reanimate-0.4.1.0-inplace/Geom2D.CubicBezier.Linear.hs.html
Normal file
325
reanimate-0.4.1.0-inplace/Geom2D.CubicBezier.Linear.hs.html
Normal file
|
|
@ -0,0 +1,325 @@
|
|||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<style type="text/css">
|
||||
span.lineno { color: white; background: #aaaaaa; border-right: solid white 12px }
|
||||
span.nottickedoff { background: yellow}
|
||||
span.istickedoff { background: white }
|
||||
span.tickonlyfalse { margin: -1px; border: 1px solid #f20913; background: #f20913 }
|
||||
span.tickonlytrue { margin: -1px; border: 1px solid #60de51; background: #60de51 }
|
||||
span.funcount { font-size: small; color: orange; z-index: 2; position: absolute; right: 20 }
|
||||
span.decl { font-weight: bold }
|
||||
span.spaces { background: white }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<pre>
|
||||
<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span>
|
||||
</pre>
|
||||
<pre>
|
||||
<span class="lineno"> 1 </span>{-# LANGUAGE FunctionalDependencies #-}
|
||||
<span class="lineno"> 2 </span>{-# LANGUAGE MultiParamTypeClasses #-}
|
||||
<span class="lineno"> 3 </span>{-# LANGUAGE UndecidableInstances #-}
|
||||
<span class="lineno"> 4 </span>{-|
|
||||
<span class="lineno"> 5 </span>Module : Geom2D.CubicBezier.Linear
|
||||
<span class="lineno"> 6 </span>Copyright : Written by David Himmelstrup
|
||||
<span class="lineno"> 7 </span>License : Unlicense
|
||||
<span class="lineno"> 8 </span>Maintainer : lemmih@gmail.com
|
||||
<span class="lineno"> 9 </span>Stability : experimental
|
||||
<span class="lineno"> 10 </span>Portability : POSIX
|
||||
<span class="lineno"> 11 </span>
|
||||
<span class="lineno"> 12 </span>Convenience wrapper around 'Geom2D.CubicBezier'
|
||||
<span class="lineno"> 13 </span>
|
||||
<span class="lineno"> 14 </span>-}
|
||||
<span class="lineno"> 15 </span>module Geom2D.CubicBezier.Linear
|
||||
<span class="lineno"> 16 </span> ( AnyBezier(..)
|
||||
<span class="lineno"> 17 </span> , CubicBezier(..)
|
||||
<span class="lineno"> 18 </span> , QuadBezier(..)
|
||||
<span class="lineno"> 19 </span> , OpenPath(..)
|
||||
<span class="lineno"> 20 </span> , ClosedPath(..)
|
||||
<span class="lineno"> 21 </span> , PathJoin(..)
|
||||
<span class="lineno"> 22 </span> , ClosedMetaPath(..)
|
||||
<span class="lineno"> 23 </span> , OpenMetaPath(..)
|
||||
<span class="lineno"> 24 </span> , MetaJoin(..)
|
||||
<span class="lineno"> 25 </span> , MetaNodeType(..)
|
||||
<span class="lineno"> 26 </span> , C.GenericBezier(..)
|
||||
<span class="lineno"> 27 </span> , C.FillRule(..)
|
||||
<span class="lineno"> 28 </span> , C.Tension(..)
|
||||
<span class="lineno"> 29 </span> , quadToCubic
|
||||
<span class="lineno"> 30 </span> , arcLength
|
||||
<span class="lineno"> 31 </span> , arcLengthParam
|
||||
<span class="lineno"> 32 </span> , C.splitBezier
|
||||
<span class="lineno"> 33 </span> , colinear
|
||||
<span class="lineno"> 34 </span> , evalBezier
|
||||
<span class="lineno"> 35 </span> , evalBezierDeriv
|
||||
<span class="lineno"> 36 </span> , bezierHoriz
|
||||
<span class="lineno"> 37 </span> , bezierVert
|
||||
<span class="lineno"> 38 </span> , C.bezierSubsegment
|
||||
<span class="lineno"> 39 </span> , C.reorient
|
||||
<span class="lineno"> 40 </span> , closedPathCurves
|
||||
<span class="lineno"> 41 </span> , openPathCurves
|
||||
<span class="lineno"> 42 </span> , curvesToClosed
|
||||
<span class="lineno"> 43 </span> , closest
|
||||
<span class="lineno"> 44 </span> , unmetaOpen
|
||||
<span class="lineno"> 45 </span> , unmetaClosed
|
||||
<span class="lineno"> 46 </span> , union
|
||||
<span class="lineno"> 47 </span> , bezierIntersection
|
||||
<span class="lineno"> 48 </span> , interpolateVector
|
||||
<span class="lineno"> 49 </span> , vectorDistance
|
||||
<span class="lineno"> 50 </span> , findBezierInflection
|
||||
<span class="lineno"> 51 </span> , findBezierCusp
|
||||
<span class="lineno"> 52 </span> ) where
|
||||
<span class="lineno"> 53 </span>
|
||||
<span class="lineno"> 54 </span>import qualified Data.Vector.Unboxed as V
|
||||
<span class="lineno"> 55 </span>import qualified Geom2D.CubicBezier as C
|
||||
<span class="lineno"> 56 </span>import Linear.V2
|
||||
<span class="lineno"> 57 </span>
|
||||
<span class="lineno"> 58 </span>------------------------------------------------------------
|
||||
<span class="lineno"> 59 </span>-- Data types
|
||||
<span class="lineno"> 60 </span>
|
||||
<span class="lineno"> 61 </span>-- | A bezier curve of any degree.
|
||||
<span class="lineno"> 62 </span>newtype AnyBezier a = AnyBezier (V.Vector (V2 a))
|
||||
<span class="lineno"> 63 </span>
|
||||
<span class="lineno"> 64 </span>-- | A cubic bezier curve.
|
||||
<span class="lineno"> 65 </span>data CubicBezier a = CubicBezier
|
||||
<span class="lineno"> 66 </span> { <span class="nottickedoff"><span class="decl"><span class="nottickedoff">cubicC0</span></span></span> :: !(V2 a)
|
||||
<span class="lineno"> 67 </span> , <span class="nottickedoff"><span class="decl"><span class="nottickedoff">cubicC1</span></span></span> :: !(V2 a)
|
||||
<span class="lineno"> 68 </span> , <span class="nottickedoff"><span class="decl"><span class="nottickedoff">cubicC2</span></span></span> :: !(V2 a)
|
||||
<span class="lineno"> 69 </span> , <span class="nottickedoff"><span class="decl"><span class="nottickedoff">cubicC3</span></span></span> :: !(V2 a)
|
||||
<span class="lineno"> 70 </span> } deriving (<span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>)
|
||||
<span class="lineno"> 71 </span>
|
||||
<span class="lineno"> 72 </span>-- | A quadratic bezier curve.
|
||||
<span class="lineno"> 73 </span>data QuadBezier a = QuadBezier
|
||||
<span class="lineno"> 74 </span> { <span class="nottickedoff"><span class="decl"><span class="nottickedoff">quadC0</span></span></span> :: !(V2 a)
|
||||
<span class="lineno"> 75 </span> , <span class="nottickedoff"><span class="decl"><span class="nottickedoff">quadC1</span></span></span> :: !(V2 a)
|
||||
<span class="lineno"> 76 </span> , <span class="nottickedoff"><span class="decl"><span class="nottickedoff">quadC2</span></span></span> :: !(V2 a)
|
||||
<span class="lineno"> 77 </span> } deriving (<span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>)
|
||||
<span class="lineno"> 78 </span>
|
||||
<span class="lineno"> 79 </span>data OpenPath a = OpenPath [(V2 a, PathJoin a)] (V2 a)
|
||||
<span class="lineno"> 80 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>)
|
||||
<span class="lineno"> 81 </span>data ClosedPath a = ClosedPath [(V2 a, PathJoin a)]
|
||||
<span class="lineno"> 82 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>)
|
||||
<span class="lineno"> 83 </span>
|
||||
<span class="lineno"> 84 </span>data PathJoin a
|
||||
<span class="lineno"> 85 </span> = JoinLine
|
||||
<span class="lineno"> 86 </span> | JoinCurve (V2 a) (V2 a)
|
||||
<span class="lineno"> 87 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>)
|
||||
<span class="lineno"> 88 </span>
|
||||
<span class="lineno"> 89 </span>data ClosedMetaPath a = ClosedMetaPath [(V2 a, MetaJoin a)]
|
||||
<span class="lineno"> 90 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>)
|
||||
<span class="lineno"> 91 </span>data OpenMetaPath a = OpenMetaPath [(V2 a, MetaJoin a)] (V2 a)
|
||||
<span class="lineno"> 92 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>)
|
||||
<span class="lineno"> 93 </span>
|
||||
<span class="lineno"> 94 </span>data MetaJoin a
|
||||
<span class="lineno"> 95 </span> = MetaJoin
|
||||
<span class="lineno"> 96 </span> { <span class="nottickedoff"><span class="decl"><span class="nottickedoff">metaTypeL</span></span></span> :: MetaNodeType a
|
||||
<span class="lineno"> 97 </span> , <span class="nottickedoff"><span class="decl"><span class="nottickedoff">tensionL</span></span></span> :: C.Tension a
|
||||
<span class="lineno"> 98 </span> , <span class="nottickedoff"><span class="decl"><span class="nottickedoff">tensionR</span></span></span> :: C.Tension a
|
||||
<span class="lineno"> 99 </span> , <span class="nottickedoff"><span class="decl"><span class="nottickedoff">metaTypeR</span></span></span> :: MetaNodeType a
|
||||
<span class="lineno"> 100 </span> }
|
||||
<span class="lineno"> 101 </span> | Controls (V2 a) (V2 a)
|
||||
<span class="lineno"> 102 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>)
|
||||
<span class="lineno"> 103 </span>
|
||||
<span class="lineno"> 104 </span>data MetaNodeType a
|
||||
<span class="lineno"> 105 </span> = Open
|
||||
<span class="lineno"> 106 </span> | Curl { <span class="nottickedoff"><span class="decl"><span class="nottickedoff">curlgamma</span></span></span> :: a }
|
||||
<span class="lineno"> 107 </span> | Direction { <span class="nottickedoff"><span class="decl"><span class="nottickedoff">nodedir</span></span></span> :: V2 a }
|
||||
<span class="lineno"> 108 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>, <span class="decl"><span class="nottickedoff">Eq</span></span>)
|
||||
<span class="lineno"> 109 </span>
|
||||
<span class="lineno"> 110 </span>------------------------------------------------------------
|
||||
<span class="lineno"> 111 </span>-- Methods
|
||||
<span class="lineno"> 112 </span>
|
||||
<span class="lineno"> 113 </span>-- | Convert a quadratic bezier to a cubic bezier.
|
||||
<span class="lineno"> 114 </span>quadToCubic :: Fractional a => QuadBezier a -> CubicBezier a
|
||||
<span class="lineno"> 115 </span><span class="decl"><span class="istickedoff">quadToCubic = upCast . C.quadToCubic . downCast</span></span>
|
||||
<span class="lineno"> 116 </span>
|
||||
<span class="lineno"> 117 </span>-- | @arcLength c t tol@ finds the arclength of the bezier @c@ at @t@,
|
||||
<span class="lineno"> 118 </span>-- within given tolerance @tol@.
|
||||
<span class="lineno"> 119 </span>arcLength :: CubicBezier Double -> Double -> Double -> Double
|
||||
<span class="lineno"> 120 </span><span class="decl"><span class="istickedoff">arcLength bezier t tol = C.arcLength (downCast bezier) t tol</span></span>
|
||||
<span class="lineno"> 121 </span>
|
||||
<span class="lineno"> 122 </span>-- | @arcLengthParam c len tol@ finds the parameter where the curve @c@
|
||||
<span class="lineno"> 123 </span>-- has the arclength @len@, within tolerance @tol@.
|
||||
<span class="lineno"> 124 </span>arcLengthParam :: CubicBezier Double -> Double -> Double -> Double
|
||||
<span class="lineno"> 125 </span><span class="decl"><span class="nottickedoff">arcLengthParam bezier t tol = C.arcLengthParam (downCast bezier) t tol</span></span>
|
||||
<span class="lineno"> 126 </span>
|
||||
<span class="lineno"> 127 </span>-- | Return @False@ if some points fall outside a line with a thickness of the given tolerance.
|
||||
<span class="lineno"> 128 </span>colinear :: CubicBezier Double -> Double -> Bool
|
||||
<span class="lineno"> 129 </span><span class="decl"><span class="istickedoff">colinear bezier tol = C.colinear (downCast bezier) tol</span></span>
|
||||
<span class="lineno"> 130 </span>
|
||||
<span class="lineno"> 131 </span>-- | Calculate a value on the bezier curve.
|
||||
<span class="lineno"> 132 </span>evalBezier :: (C.GenericBezier b, V.Unbox a, Fractional a) => b a -> a -> V2 a
|
||||
<span class="lineno"> 133 </span><span class="decl"><span class="istickedoff">evalBezier c p = upCast $ C.evalBezier c p</span></span>
|
||||
<span class="lineno"> 134 </span>
|
||||
<span class="lineno"> 135 </span>-- | Calculate a value and the first derivative on the curve.
|
||||
<span class="lineno"> 136 </span>evalBezierDeriv :: (V.Unbox a, Fractional a,C.GenericBezier b) => b a -> a -> (V2 a, V2 a)
|
||||
<span class="lineno"> 137 </span><span class="decl"><span class="nottickedoff">evalBezierDeriv c p = upCast $ C.evalBezierDeriv c p</span></span>
|
||||
<span class="lineno"> 138 </span>
|
||||
<span class="lineno"> 139 </span>-- | Find the parameter where the bezier curve is horizontal.
|
||||
<span class="lineno"> 140 </span>bezierHoriz :: CubicBezier Double -> [Double]
|
||||
<span class="lineno"> 141 </span><span class="decl"><span class="nottickedoff">bezierHoriz = C.bezierHoriz . downCast</span></span>
|
||||
<span class="lineno"> 142 </span>
|
||||
<span class="lineno"> 143 </span>-- | Find the parameter where the bezier curve is vertical.
|
||||
<span class="lineno"> 144 </span>bezierVert :: CubicBezier Double -> [Double]
|
||||
<span class="lineno"> 145 </span><span class="decl"><span class="nottickedoff">bezierVert = C.bezierVert . downCast</span></span>
|
||||
<span class="lineno"> 146 </span>
|
||||
<span class="lineno"> 147 </span>-- | Create a normal path from a metapath.
|
||||
<span class="lineno"> 148 </span>unmetaOpen :: OpenMetaPath Double -> OpenPath Double
|
||||
<span class="lineno"> 149 </span><span class="decl"><span class="nottickedoff">unmetaOpen = upCast . C.unmetaOpen . downCast</span></span>
|
||||
<span class="lineno"> 150 </span>
|
||||
<span class="lineno"> 151 </span>unmetaClosed :: ClosedMetaPath Double -> ClosedPath Double
|
||||
<span class="lineno"> 152 </span><span class="decl"><span class="nottickedoff">unmetaClosed = upCast . C.unmetaClosed . downCast</span></span>
|
||||
<span class="lineno"> 153 </span>
|
||||
<span class="lineno"> 154 </span>-- | `O((n+m)*log(n+m))`, for n segments and m intersections.
|
||||
<span class="lineno"> 155 </span>-- Union of paths, removing overlap and rounding to the given tolerance.
|
||||
<span class="lineno"> 156 </span>union :: [ClosedPath Double] -> C.FillRule -> Double -> [ClosedPath Double]
|
||||
<span class="lineno"> 157 </span><span class="decl"><span class="nottickedoff">union p fill tol = upCast (C.union (downCast p) fill tol)</span></span>
|
||||
<span class="lineno"> 158 </span>
|
||||
<span class="lineno"> 159 </span>-- | Find the intersections between two Bezier curves, using the Bezier Clip algorithm.
|
||||
<span class="lineno"> 160 </span>-- Returns the parameters for both curves.
|
||||
<span class="lineno"> 161 </span>bezierIntersection :: CubicBezier Double -> CubicBezier Double -> Double -> [(Double, Double)]
|
||||
<span class="lineno"> 162 </span><span class="decl"><span class="nottickedoff">bezierIntersection a b t = C.bezierIntersection (downCast a) (downCast b) t</span></span>
|
||||
<span class="lineno"> 163 </span>
|
||||
<span class="lineno"> 164 </span>-- | Find the closest value on the bezier to the given point, within tolerance.
|
||||
<span class="lineno"> 165 </span>-- Return the first value found.
|
||||
<span class="lineno"> 166 </span>closest :: CubicBezier Double -> V2 Double -> Double -> Double
|
||||
<span class="lineno"> 167 </span><span class="decl"><span class="nottickedoff">closest c p t = C.closest (downCast c) (downCast p) t</span></span>
|
||||
<span class="lineno"> 168 </span>
|
||||
<span class="lineno"> 169 </span>-- | Return the closed path as a list of curves.
|
||||
<span class="lineno"> 170 </span>closedPathCurves :: Fractional a => ClosedPath a -> [CubicBezier a]
|
||||
<span class="lineno"> 171 </span><span class="decl"><span class="istickedoff">closedPathCurves = upCast . C.closedPathCurves . downCast</span></span>
|
||||
<span class="lineno"> 172 </span>
|
||||
<span class="lineno"> 173 </span>-- | Return the open path as a list of curves.
|
||||
<span class="lineno"> 174 </span>openPathCurves :: Fractional a => OpenPath a -> [CubicBezier a]
|
||||
<span class="lineno"> 175 </span><span class="decl"><span class="nottickedoff">openPathCurves = upCast . C.openPathCurves . downCast</span></span>
|
||||
<span class="lineno"> 176 </span>
|
||||
<span class="lineno"> 177 </span>-- | Make an open path from a list of curves. The last control point of each curve is ignored.
|
||||
<span class="lineno"> 178 </span>curvesToClosed :: [CubicBezier a] -> ClosedPath a
|
||||
<span class="lineno"> 179 </span><span class="decl"><span class="nottickedoff">curvesToClosed = upCast . C.curvesToClosed . downCast</span></span>
|
||||
<span class="lineno"> 180 </span>
|
||||
<span class="lineno"> 181 </span>-- | Interpolate between two vectors.
|
||||
<span class="lineno"> 182 </span>interpolateVector :: Num a => V2 a -> V2 a -> a -> V2 a
|
||||
<span class="lineno"> 183 </span><span class="decl"><span class="nottickedoff">interpolateVector a b p = upCast $ C.interpolateVector (downCast a) (downCast b) p</span></span>
|
||||
<span class="lineno"> 184 </span>
|
||||
<span class="lineno"> 185 </span>-- | Distance between two vectors.
|
||||
<span class="lineno"> 186 </span>vectorDistance :: Floating a => V2 a -> V2 a -> a
|
||||
<span class="lineno"> 187 </span><span class="decl"><span class="nottickedoff">vectorDistance a b = C.vectorDistance (downCast a) (downCast b)</span></span>
|
||||
<span class="lineno"> 188 </span>
|
||||
<span class="lineno"> 189 </span>-- | Find inflection points on the curve.
|
||||
<span class="lineno"> 190 </span>findBezierInflection :: CubicBezier Double -> [Double]
|
||||
<span class="lineno"> 191 </span><span class="decl"><span class="nottickedoff">findBezierInflection = C.findBezierInflection . downCast</span></span>
|
||||
<span class="lineno"> 192 </span>
|
||||
<span class="lineno"> 193 </span>-- | Find the cusps of a bezier.
|
||||
<span class="lineno"> 194 </span>findBezierCusp :: CubicBezier Double -> [Double]
|
||||
<span class="lineno"> 195 </span><span class="decl"><span class="nottickedoff">findBezierCusp = C.findBezierCusp . downCast</span></span>
|
||||
<span class="lineno"> 196 </span>
|
||||
<span class="lineno"> 197 </span>------------------------------------------------------------
|
||||
<span class="lineno"> 198 </span>-- Instances
|
||||
<span class="lineno"> 199 </span>
|
||||
<span class="lineno"> 200 </span>instance C.GenericBezier QuadBezier where
|
||||
<span class="lineno"> 201 </span> <span class="decl"><span class="nottickedoff">degree = C.degree . downCast</span></span>
|
||||
<span class="lineno"> 202 </span> <span class="decl"><span class="istickedoff">toVector = C.toVector . downCast</span></span>
|
||||
<span class="lineno"> 203 </span> <span class="decl"><span class="nottickedoff">unsafeFromVector = upCast . C.unsafeFromVector</span></span>
|
||||
<span class="lineno"> 204 </span>
|
||||
<span class="lineno"> 205 </span>instance C.GenericBezier CubicBezier where
|
||||
<span class="lineno"> 206 </span> <span class="decl"><span class="nottickedoff">degree = C.degree . downCast</span></span>
|
||||
<span class="lineno"> 207 </span> <span class="decl"><span class="istickedoff">toVector = C.toVector . downCast</span></span>
|
||||
<span class="lineno"> 208 </span> <span class="decl"><span class="istickedoff">unsafeFromVector = upCast . C.unsafeFromVector</span></span>
|
||||
<span class="lineno"> 209 </span>
|
||||
<span class="lineno"> 210 </span>instance C.GenericBezier AnyBezier where
|
||||
<span class="lineno"> 211 </span> <span class="decl"><span class="nottickedoff">degree = C.degree . downCast</span></span>
|
||||
<span class="lineno"> 212 </span> <span class="decl"><span class="istickedoff">toVector = C.toVector . downCast</span></span>
|
||||
<span class="lineno"> 213 </span> <span class="decl"><span class="istickedoff">unsafeFromVector = upCast . C.unsafeFromVector</span></span>
|
||||
<span class="lineno"> 214 </span>
|
||||
<span class="lineno"> 215 </span>------------------------------------------------------------
|
||||
<span class="lineno"> 216 </span>-- Casting
|
||||
<span class="lineno"> 217 </span>
|
||||
<span class="lineno"> 218 </span>class Cast a b | a -> b, b -> a where
|
||||
<span class="lineno"> 219 </span> downCast :: a -> b
|
||||
<span class="lineno"> 220 </span> upCast :: b -> a
|
||||
<span class="lineno"> 221 </span>
|
||||
<span class="lineno"> 222 </span>instance Cast a b => Cast [a] [b] where
|
||||
<span class="lineno"> 223 </span> <span class="decl"><span class="nottickedoff">downCast = map downCast</span></span>
|
||||
<span class="lineno"> 224 </span> <span class="decl"><span class="istickedoff">upCast = map upCast</span></span>
|
||||
<span class="lineno"> 225 </span>
|
||||
<span class="lineno"> 226 </span>instance (Cast a a', Cast b b') => Cast (a,b) (a',b') where
|
||||
<span class="lineno"> 227 </span> <span class="decl"><span class="nottickedoff">downCast (a, b) = (downCast a, downCast b)</span></span>
|
||||
<span class="lineno"> 228 </span> <span class="decl"><span class="nottickedoff">upCast (a, b) = (upCast a, upCast b)</span></span>
|
||||
<span class="lineno"> 229 </span>
|
||||
<span class="lineno"> 230 </span>instance Cast (V2 a) (C.Point a) where
|
||||
<span class="lineno"> 231 </span> <span class="decl"><span class="istickedoff">downCast (V2 a b) = C.Point a b</span></span>
|
||||
<span class="lineno"> 232 </span> <span class="decl"><span class="istickedoff">upCast (C.Point a b) = V2 a b</span></span>
|
||||
<span class="lineno"> 233 </span>
|
||||
<span class="lineno"> 234 </span>instance Cast (CubicBezier a) (C.CubicBezier a) where
|
||||
<span class="lineno"> 235 </span> <span class="decl"><span class="istickedoff">downCast (CubicBezier a b c d) = C.CubicBezier</span>
|
||||
<span class="lineno"> 236 </span><span class="spaces"> </span><span class="istickedoff">(downCast a) (downCast b) (downCast c) (downCast d)</span></span>
|
||||
<span class="lineno"> 237 </span> <span class="decl"><span class="istickedoff">upCast (C.CubicBezier a b c d) = CubicBezier</span>
|
||||
<span class="lineno"> 238 </span><span class="spaces"> </span><span class="istickedoff">(upCast a) (upCast b) (upCast c) (upCast d)</span></span>
|
||||
<span class="lineno"> 239 </span>
|
||||
<span class="lineno"> 240 </span>instance Cast (QuadBezier a) (C.QuadBezier a) where
|
||||
<span class="lineno"> 241 </span> <span class="decl"><span class="istickedoff">downCast (QuadBezier a b c) = C.QuadBezier</span>
|
||||
<span class="lineno"> 242 </span><span class="spaces"> </span><span class="istickedoff">(downCast a) (downCast b) (downCast c)</span></span>
|
||||
<span class="lineno"> 243 </span> <span class="decl"><span class="nottickedoff">upCast (C.QuadBezier a b c)= QuadBezier</span>
|
||||
<span class="lineno"> 244 </span><span class="spaces"> </span><span class="nottickedoff">(upCast a) (upCast b) (upCast c)</span></span>
|
||||
<span class="lineno"> 245 </span>
|
||||
<span class="lineno"> 246 </span>instance V.Unbox a => Cast (AnyBezier a) (C.AnyBezier a) where
|
||||
<span class="lineno"> 247 </span> <span class="decl"><span class="istickedoff">downCast (AnyBezier arr) = C.AnyBezier $</span>
|
||||
<span class="lineno"> 248 </span><span class="spaces"> </span><span class="istickedoff">V.map (\(V2 a b) -> (a,b)) arr</span></span>
|
||||
<span class="lineno"> 249 </span> <span class="decl"><span class="istickedoff">upCast (C.AnyBezier arr) = AnyBezier $</span>
|
||||
<span class="lineno"> 250 </span><span class="spaces"> </span><span class="istickedoff">V.map (\(a, b) -> V2 a b) arr</span></span>
|
||||
<span class="lineno"> 251 </span>
|
||||
<span class="lineno"> 252 </span>instance Cast (MetaNodeType a) (C.MetaNodeType a) where
|
||||
<span class="lineno"> 253 </span> <span class="decl"><span class="nottickedoff">downCast Open = C.Open</span>
|
||||
<span class="lineno"> 254 </span><span class="spaces"> </span><span class="nottickedoff">downCast (Curl gamma) = C.Curl gamma</span>
|
||||
<span class="lineno"> 255 </span><span class="spaces"> </span><span class="nottickedoff">downCast (Direction dir) = C.Direction (downCast dir)</span></span>
|
||||
<span class="lineno"> 256 </span> <span class="decl"><span class="nottickedoff">upCast C.Open = Open</span>
|
||||
<span class="lineno"> 257 </span><span class="spaces"> </span><span class="nottickedoff">upCast (C.Curl gamma) = Curl gamma</span>
|
||||
<span class="lineno"> 258 </span><span class="spaces"> </span><span class="nottickedoff">upCast (C.Direction dir) = Direction (upCast dir)</span></span>
|
||||
<span class="lineno"> 259 </span>
|
||||
<span class="lineno"> 260 </span>instance Cast (MetaJoin a) (C.MetaJoin a) where
|
||||
<span class="lineno"> 261 </span> <span class="decl"><span class="nottickedoff">downCast (MetaJoin tyL tL tR tyR) = C.MetaJoin (downCast tyL) tL tR (downCast tyR)</span>
|
||||
<span class="lineno"> 262 </span><span class="spaces"> </span><span class="nottickedoff">downCast (Controls p1 p2) = C.Controls (downCast p1) (downCast p2)</span></span>
|
||||
<span class="lineno"> 263 </span> <span class="decl"><span class="nottickedoff">upCast (C.MetaJoin tyL tL tR tyR) = MetaJoin (upCast tyL) tL tR (upCast tyR)</span>
|
||||
<span class="lineno"> 264 </span><span class="spaces"> </span><span class="nottickedoff">upCast (C.Controls p1 p2) = Controls (upCast p1) (upCast p2)</span></span>
|
||||
<span class="lineno"> 265 </span>
|
||||
<span class="lineno"> 266 </span>instance Cast (PathJoin a) (C.PathJoin a) where
|
||||
<span class="lineno"> 267 </span> <span class="decl"><span class="istickedoff">downCast JoinLine = C.JoinLine</span>
|
||||
<span class="lineno"> 268 </span><span class="spaces"> </span><span class="istickedoff">downCast (JoinCurve a b) = C.JoinCurve (downCast a) (downCast b)</span></span>
|
||||
<span class="lineno"> 269 </span> <span class="decl"><span class="nottickedoff">upCast C.JoinLine = JoinLine</span>
|
||||
<span class="lineno"> 270 </span><span class="spaces"> </span><span class="nottickedoff">upCast (C.JoinCurve a b) = JoinCurve (upCast a) (upCast b)</span></span>
|
||||
<span class="lineno"> 271 </span>
|
||||
<span class="lineno"> 272 </span>instance Cast (OpenMetaPath a) (C.OpenMetaPath a) where
|
||||
<span class="lineno"> 273 </span> <span class="decl"><span class="nottickedoff">downCast (OpenMetaPath lst end) = C.OpenMetaPath</span>
|
||||
<span class="lineno"> 274 </span><span class="spaces"> </span><span class="nottickedoff">[ (downCast p, downCast j)</span>
|
||||
<span class="lineno"> 275 </span><span class="spaces"> </span><span class="nottickedoff">| (p, j) <- lst ] (downCast end)</span></span>
|
||||
<span class="lineno"> 276 </span> <span class="decl"><span class="nottickedoff">upCast (C.OpenMetaPath lst end) = OpenMetaPath</span>
|
||||
<span class="lineno"> 277 </span><span class="spaces"> </span><span class="nottickedoff">[ (upCast p, upCast j)</span>
|
||||
<span class="lineno"> 278 </span><span class="spaces"> </span><span class="nottickedoff">| (p, j) <- lst ] (upCast end)</span></span>
|
||||
<span class="lineno"> 279 </span>
|
||||
<span class="lineno"> 280 </span>instance Cast (ClosedMetaPath a) (C.ClosedMetaPath a) where
|
||||
<span class="lineno"> 281 </span> <span class="decl"><span class="nottickedoff">downCast (ClosedMetaPath lst) = C.ClosedMetaPath</span>
|
||||
<span class="lineno"> 282 </span><span class="spaces"> </span><span class="nottickedoff">[ (downCast p, downCast j)</span>
|
||||
<span class="lineno"> 283 </span><span class="spaces"> </span><span class="nottickedoff">| (p, j) <- lst ]</span></span>
|
||||
<span class="lineno"> 284 </span> <span class="decl"><span class="nottickedoff">upCast (C.ClosedMetaPath lst) = ClosedMetaPath</span>
|
||||
<span class="lineno"> 285 </span><span class="spaces"> </span><span class="nottickedoff">[ (upCast p, upCast j)</span>
|
||||
<span class="lineno"> 286 </span><span class="spaces"> </span><span class="nottickedoff">| (p, j) <- lst ]</span></span>
|
||||
<span class="lineno"> 287 </span>
|
||||
<span class="lineno"> 288 </span>instance Cast (OpenPath a) (C.OpenPath a) where
|
||||
<span class="lineno"> 289 </span> <span class="decl"><span class="nottickedoff">downCast (OpenPath lst end) = C.OpenPath</span>
|
||||
<span class="lineno"> 290 </span><span class="spaces"> </span><span class="nottickedoff">[ (downCast p, downCast j)</span>
|
||||
<span class="lineno"> 291 </span><span class="spaces"> </span><span class="nottickedoff">| (p, j) <- lst ] (downCast end)</span></span>
|
||||
<span class="lineno"> 292 </span> <span class="decl"><span class="nottickedoff">upCast (C.OpenPath lst end) = OpenPath</span>
|
||||
<span class="lineno"> 293 </span><span class="spaces"> </span><span class="nottickedoff">[ (upCast p, upCast j)</span>
|
||||
<span class="lineno"> 294 </span><span class="spaces"> </span><span class="nottickedoff">| (p, j) <- lst ] (upCast end)</span></span>
|
||||
<span class="lineno"> 295 </span>
|
||||
<span class="lineno"> 296 </span>instance Cast (ClosedPath a) (C.ClosedPath a) where
|
||||
<span class="lineno"> 297 </span> <span class="decl"><span class="istickedoff">downCast (ClosedPath lst) = C.ClosedPath</span>
|
||||
<span class="lineno"> 298 </span><span class="spaces"> </span><span class="istickedoff">[ (downCast p, downCast j)</span>
|
||||
<span class="lineno"> 299 </span><span class="spaces"> </span><span class="istickedoff">| (p, j) <- lst ]</span></span>
|
||||
<span class="lineno"> 300 </span> <span class="decl"><span class="nottickedoff">upCast (C.ClosedPath lst) = ClosedPath</span>
|
||||
<span class="lineno"> 301 </span><span class="spaces"> </span><span class="nottickedoff">[ (upCast p, upCast j)</span>
|
||||
<span class="lineno"> 302 </span><span class="spaces"> </span><span class="nottickedoff">| (p, j) <- lst ]</span></span>
|
||||
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -19,189 +19,197 @@ span.spaces { background: white }
|
|||
<pre>
|
||||
<span class="lineno"> 1 </span>{-# LANGUAGE FlexibleInstances #-}
|
||||
<span class="lineno"> 2 </span>{-# OPTIONS_GHC -Wno-orphans #-}
|
||||
<span class="lineno"> 3 </span>module Reanimate.Math.Common
|
||||
<span class="lineno"> 4 </span> ( -- * Ring
|
||||
<span class="lineno"> 5 </span> Ring(..)
|
||||
<span class="lineno"> 6 </span> , ringSize -- :: Ring a -> Int
|
||||
<span class="lineno"> 7 </span> , ringAccess -- :: Ring a -> Int -> V2 a
|
||||
<span class="lineno"> 8 </span> , ringClamp -- :: Ring a -> Int -> Int
|
||||
<span class="lineno"> 9 </span> , ringUnpack -- :: Ring a -> Vector (V2 a)
|
||||
<span class="lineno"> 10 </span> , ringPack -- :: Vector (V2 a) -> Ring a
|
||||
<span class="lineno"> 11 </span> , ringMap -- :: (V2 a -> V2 b) -> Ring a -> Ring b
|
||||
<span class="lineno"> 12 </span> , ringRayIntersect -- :: Ring Rational -> (Int, Int) -> (Int,Int) -> Maybe (V2 Rational)
|
||||
<span class="lineno"> 13 </span> -- * Math
|
||||
<span class="lineno"> 14 </span> , area -- :: Fractional a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 15 </span> , area2X -- :: Fractional a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 16 </span> , isLeftTurn -- :: (Num a, Ord a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 17 </span> , isLeftTurnOrLinear -- :: (Num a, Ord a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 18 </span> , isRightTurn -- :: (Num a, Ord a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 19 </span> , isRightTurnOrLinear -- :: (Num a, Ord a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 20 </span> , direction -- :: Num a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 21 </span> , isInside -- :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 22 </span> , isInsideStrict -- :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 23 </span> , barycentricCoords -- :: Fractional a => V2 a -> V2 a -> V2 a -> V2 a -> (a, a, a)
|
||||
<span class="lineno"> 24 </span> , rayIntersect -- :: (Fractional a, Ord a) => (V2 a,V2 a) -> (V2 a,V2 a) -> Maybe (V2 a)
|
||||
<span class="lineno"> 25 </span> , isBetween -- :: (Ord a, Fractional a) => V2 a -> (V2 a, V2 a) -> Bool
|
||||
<span class="lineno"> 26 </span> , lineIntersect -- :: (Ord a, Fractional a) => (V2 a, V2 a) -> (V2 a, V2 a) -> Maybe (V2 a)
|
||||
<span class="lineno"> 27 </span> , distSquared -- :: (Fractional a) => V2 a -> V2 a -> a
|
||||
<span class="lineno"> 28 </span> , approxDist -- :: (Real a, Fractional a) => V2 a -> V2 a -> a
|
||||
<span class="lineno"> 29 </span> , distance' -- :: (Real a, Fractional a) => V2 a -> V2 a -> Double
|
||||
<span class="lineno"> 30 </span> , triangleAngles -- :: V2 Double -> V2 Double -> V2 Double -> (Double, Double, Double)
|
||||
<span class="lineno"> 31 </span> , Epsilon(..)
|
||||
<span class="lineno"> 32 </span> ) where
|
||||
<span class="lineno"> 33 </span>
|
||||
<span class="lineno"> 34 </span>import Data.Vector (Vector)
|
||||
<span class="lineno"> 35 </span>import qualified Data.Vector as V
|
||||
<span class="lineno"> 36 </span>import Linear.Matrix (det33)
|
||||
<span class="lineno"> 37 </span>import Linear.Metric
|
||||
<span class="lineno"> 38 </span>import Linear.V2
|
||||
<span class="lineno"> 39 </span>import Linear.V3
|
||||
<span class="lineno"> 40 </span>import Linear.Vector
|
||||
<span class="lineno"> 41 </span>import Linear.Epsilon
|
||||
<span class="lineno"> 42 </span>
|
||||
<span class="lineno"> 43 </span>instance Epsilon Rational where
|
||||
<span class="lineno"> 44 </span> <span class="decl"><span class="nottickedoff">nearZero r = r==0</span></span>
|
||||
<span class="lineno"> 45 </span>
|
||||
<span class="lineno"> 46 </span>newtype Ring a = Ring (Vector (V2 a))
|
||||
<span class="lineno"> 47 </span>
|
||||
<span class="lineno"> 48 </span>ringSize :: Ring a -> Int
|
||||
<span class="lineno"> 49 </span><span class="decl"><span class="nottickedoff">ringSize (Ring v) = length v</span></span>
|
||||
<span class="lineno"> 3 </span>{-|
|
||||
<span class="lineno"> 4 </span>Module : Reanimate.Math.Common
|
||||
<span class="lineno"> 5 </span>Copyright : Written by David Himmelstrup
|
||||
<span class="lineno"> 6 </span>License : Unlicense
|
||||
<span class="lineno"> 7 </span>Maintainer : lemmih@gmail.com
|
||||
<span class="lineno"> 8 </span>Stability : experimental
|
||||
<span class="lineno"> 9 </span>Portability : POSIX
|
||||
<span class="lineno"> 10 </span>-}
|
||||
<span class="lineno"> 11 </span>module Reanimate.Math.Common
|
||||
<span class="lineno"> 12 </span> ( -- * Ring
|
||||
<span class="lineno"> 13 </span> Ring(..)
|
||||
<span class="lineno"> 14 </span> , ringSize -- :: Ring a -> Int
|
||||
<span class="lineno"> 15 </span> , ringAccess -- :: Ring a -> Int -> V2 a
|
||||
<span class="lineno"> 16 </span> , ringClamp -- :: Ring a -> Int -> Int
|
||||
<span class="lineno"> 17 </span> , ringUnpack -- :: Ring a -> Vector (V2 a)
|
||||
<span class="lineno"> 18 </span> , ringPack -- :: Vector (V2 a) -> Ring a
|
||||
<span class="lineno"> 19 </span> , ringMap -- :: (V2 a -> V2 b) -> Ring a -> Ring b
|
||||
<span class="lineno"> 20 </span> , ringRayIntersect -- :: Ring Rational -> (Int, Int) -> (Int,Int) -> Maybe (V2 Rational)
|
||||
<span class="lineno"> 21 </span> -- * Math
|
||||
<span class="lineno"> 22 </span> , area -- :: Fractional a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 23 </span> , area2X -- :: Fractional a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 24 </span> , isLeftTurn -- :: (Num a, Ord a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 25 </span> , isLeftTurnOrLinear -- :: (Num a, Ord a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 26 </span> , isRightTurn -- :: (Num a, Ord a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 27 </span> , isRightTurnOrLinear -- :: (Num a, Ord a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 28 </span> , direction -- :: Num a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 29 </span> , isInside -- :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 30 </span> , isInsideStrict -- :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 31 </span> , barycentricCoords -- :: Fractional a => V2 a -> V2 a -> V2 a -> V2 a -> (a, a, a)
|
||||
<span class="lineno"> 32 </span> , rayIntersect -- :: (Fractional a, Ord a) => (V2 a,V2 a) -> (V2 a,V2 a) -> Maybe (V2 a)
|
||||
<span class="lineno"> 33 </span> , isBetween -- :: (Ord a, Fractional a) => V2 a -> (V2 a, V2 a) -> Bool
|
||||
<span class="lineno"> 34 </span> , lineIntersect -- :: (Ord a, Fractional a) => (V2 a, V2 a) -> (V2 a, V2 a) -> Maybe (V2 a)
|
||||
<span class="lineno"> 35 </span> , distSquared -- :: (Fractional a) => V2 a -> V2 a -> a
|
||||
<span class="lineno"> 36 </span> , approxDist -- :: (Real a, Fractional a) => V2 a -> V2 a -> a
|
||||
<span class="lineno"> 37 </span> , distance' -- :: (Real a, Fractional a) => V2 a -> V2 a -> Double
|
||||
<span class="lineno"> 38 </span> , triangleAngles -- :: V2 Double -> V2 Double -> V2 Double -> (Double, Double, Double)
|
||||
<span class="lineno"> 39 </span> , Epsilon(..)
|
||||
<span class="lineno"> 40 </span> ) where
|
||||
<span class="lineno"> 41 </span>
|
||||
<span class="lineno"> 42 </span>import Data.Vector (Vector)
|
||||
<span class="lineno"> 43 </span>import qualified Data.Vector as V
|
||||
<span class="lineno"> 44 </span>import Linear.Matrix (det33)
|
||||
<span class="lineno"> 45 </span>import Linear.Metric
|
||||
<span class="lineno"> 46 </span>import Linear.V2
|
||||
<span class="lineno"> 47 </span>import Linear.V3
|
||||
<span class="lineno"> 48 </span>import Linear.Vector
|
||||
<span class="lineno"> 49 </span>import Linear.Epsilon
|
||||
<span class="lineno"> 50 </span>
|
||||
<span class="lineno"> 51 </span>ringAccess :: Ring a -> Int -> V2 a
|
||||
<span class="lineno"> 52 </span><span class="decl"><span class="nottickedoff">ringAccess (Ring v) i = v V.! mod i (length v)</span></span>
|
||||
<span class="lineno"> 51 </span>instance Epsilon Rational where
|
||||
<span class="lineno"> 52 </span> <span class="decl"><span class="nottickedoff">nearZero r = r==0</span></span>
|
||||
<span class="lineno"> 53 </span>
|
||||
<span class="lineno"> 54 </span>ringClamp :: Ring a -> Int -> Int
|
||||
<span class="lineno"> 55 </span><span class="decl"><span class="nottickedoff">ringClamp (Ring v) i = mod i (length v)</span></span>
|
||||
<span class="lineno"> 56 </span>
|
||||
<span class="lineno"> 57 </span>ringUnpack :: Ring a -> Vector (V2 a)
|
||||
<span class="lineno"> 58 </span><span class="decl"><span class="nottickedoff">ringUnpack (Ring v) = v</span></span>
|
||||
<span class="lineno"> 59 </span>
|
||||
<span class="lineno"> 60 </span>ringPack :: Vector (V2 a) -> Ring a
|
||||
<span class="lineno"> 61 </span><span class="decl"><span class="nottickedoff">ringPack = Ring</span></span>
|
||||
<span class="lineno"> 62 </span>
|
||||
<span class="lineno"> 63 </span>ringMap :: (V2 a -> V2 b) -> Ring a -> Ring b
|
||||
<span class="lineno"> 64 </span><span class="decl"><span class="nottickedoff">ringMap fn (Ring v) = Ring (V.map fn v)</span></span>
|
||||
<span class="lineno"> 65 </span>
|
||||
<span class="lineno"> 66 </span>ringRayIntersect :: Ring Rational -> (Int, Int) -> (Int,Int) -> Maybe (V2 Rational)
|
||||
<span class="lineno"> 67 </span><span class="decl"><span class="nottickedoff">ringRayIntersect p (a,b) (c,d) =</span>
|
||||
<span class="lineno"> 68 </span><span class="spaces"> </span><span class="nottickedoff">rayIntersect (ringAccess p a, ringAccess p b) (ringAccess p c, ringAccess p d)</span></span>
|
||||
<span class="lineno"> 69 </span>
|
||||
<span class="lineno"> 54 </span>newtype Ring a = Ring (Vector (V2 a))
|
||||
<span class="lineno"> 55 </span>
|
||||
<span class="lineno"> 56 </span>ringSize :: Ring a -> Int
|
||||
<span class="lineno"> 57 </span><span class="decl"><span class="nottickedoff">ringSize (Ring v) = length v</span></span>
|
||||
<span class="lineno"> 58 </span>
|
||||
<span class="lineno"> 59 </span>ringAccess :: Ring a -> Int -> V2 a
|
||||
<span class="lineno"> 60 </span><span class="decl"><span class="nottickedoff">ringAccess (Ring v) i = v V.! mod i (length v)</span></span>
|
||||
<span class="lineno"> 61 </span>
|
||||
<span class="lineno"> 62 </span>ringClamp :: Ring a -> Int -> Int
|
||||
<span class="lineno"> 63 </span><span class="decl"><span class="nottickedoff">ringClamp (Ring v) i = mod i (length v)</span></span>
|
||||
<span class="lineno"> 64 </span>
|
||||
<span class="lineno"> 65 </span>ringUnpack :: Ring a -> Vector (V2 a)
|
||||
<span class="lineno"> 66 </span><span class="decl"><span class="nottickedoff">ringUnpack (Ring v) = v</span></span>
|
||||
<span class="lineno"> 67 </span>
|
||||
<span class="lineno"> 68 </span>ringPack :: Vector (V2 a) -> Ring a
|
||||
<span class="lineno"> 69 </span><span class="decl"><span class="nottickedoff">ringPack = Ring</span></span>
|
||||
<span class="lineno"> 70 </span>
|
||||
<span class="lineno"> 71 </span>area :: Fractional a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 72 </span><span class="decl"><span class="nottickedoff">area a b c = 1/2 * area2X a b c</span></span>
|
||||
<span class="lineno"> 71 </span>ringMap :: (V2 a -> V2 b) -> Ring a -> Ring b
|
||||
<span class="lineno"> 72 </span><span class="decl"><span class="nottickedoff">ringMap fn (Ring v) = Ring (V.map fn v)</span></span>
|
||||
<span class="lineno"> 73 </span>
|
||||
<span class="lineno"> 74 </span>area2X :: Fractional a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 75 </span><span class="decl"><span class="nottickedoff">area2X (V2 a1 a2) (V2 b1 b2) (V2 c1 c2) =</span>
|
||||
<span class="lineno"> 76 </span><span class="spaces"> </span><span class="nottickedoff">det33 (V3 (V3 a1 a2 1)</span>
|
||||
<span class="lineno"> 77 </span><span class="spaces"> </span><span class="nottickedoff">(V3 b1 b2 1)</span>
|
||||
<span class="lineno"> 78 </span><span class="spaces"> </span><span class="nottickedoff">(V3 c1 c2 1))</span></span>
|
||||
<span class="lineno"> 79 </span>
|
||||
<span class="lineno"> 80 </span>compareEpsZero :: (Ord a, Fractional a, Epsilon a) => a -> Ordering
|
||||
<span class="lineno"> 81 </span><span class="decl"><span class="nottickedoff">compareEpsZero val</span>
|
||||
<span class="lineno"> 82 </span><span class="spaces"> </span><span class="nottickedoff">| nearZero val = EQ</span>
|
||||
<span class="lineno"> 83 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = compare val 0</span></span>
|
||||
<span class="lineno"> 84 </span>
|
||||
<span class="lineno"> 85 </span>{-# INLINE isLeftTurn #-}
|
||||
<span class="lineno"> 86 </span>-- Left turn.
|
||||
<span class="lineno"> 87 </span>isLeftTurn :: (Fractional a, Ord a, Epsilon a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 88 </span><span class="decl"><span class="nottickedoff">isLeftTurn p1 p2 p3 =</span>
|
||||
<span class="lineno"> 89 </span><span class="spaces"> </span><span class="nottickedoff">case compareEpsZero (direction p1 p2 p3) of</span>
|
||||
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="nottickedoff">LT -> True</span>
|
||||
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="nottickedoff">EQ -> False -- colinear</span>
|
||||
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="nottickedoff">GT -> False</span></span>
|
||||
<span class="lineno"> 93 </span>
|
||||
<span class="lineno"> 94 </span>{-# INLINE isLeftTurnOrLinear #-}
|
||||
<span class="lineno"> 95 </span>isLeftTurnOrLinear :: (Fractional a, Ord a, Epsilon a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 96 </span><span class="decl"><span class="nottickedoff">isLeftTurnOrLinear p1 p2 p3 =</span>
|
||||
<span class="lineno"> 74 </span>ringRayIntersect :: Ring Rational -> (Int, Int) -> (Int,Int) -> Maybe (V2 Rational)
|
||||
<span class="lineno"> 75 </span><span class="decl"><span class="nottickedoff">ringRayIntersect p (a,b) (c,d) =</span>
|
||||
<span class="lineno"> 76 </span><span class="spaces"> </span><span class="nottickedoff">rayIntersect (ringAccess p a, ringAccess p b) (ringAccess p c, ringAccess p d)</span></span>
|
||||
<span class="lineno"> 77 </span>
|
||||
<span class="lineno"> 78 </span>
|
||||
<span class="lineno"> 79 </span>area :: Fractional a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 80 </span><span class="decl"><span class="nottickedoff">area a b c = 1/2 * area2X a b c</span></span>
|
||||
<span class="lineno"> 81 </span>
|
||||
<span class="lineno"> 82 </span>area2X :: Fractional a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 83 </span><span class="decl"><span class="nottickedoff">area2X (V2 a1 a2) (V2 b1 b2) (V2 c1 c2) =</span>
|
||||
<span class="lineno"> 84 </span><span class="spaces"> </span><span class="nottickedoff">det33 (V3 (V3 a1 a2 1)</span>
|
||||
<span class="lineno"> 85 </span><span class="spaces"> </span><span class="nottickedoff">(V3 b1 b2 1)</span>
|
||||
<span class="lineno"> 86 </span><span class="spaces"> </span><span class="nottickedoff">(V3 c1 c2 1))</span></span>
|
||||
<span class="lineno"> 87 </span>
|
||||
<span class="lineno"> 88 </span>compareEpsZero :: (Ord a, Fractional a, Epsilon a) => a -> Ordering
|
||||
<span class="lineno"> 89 </span><span class="decl"><span class="nottickedoff">compareEpsZero val</span>
|
||||
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="nottickedoff">| nearZero val = EQ</span>
|
||||
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = compare val 0</span></span>
|
||||
<span class="lineno"> 92 </span>
|
||||
<span class="lineno"> 93 </span>{-# INLINE isLeftTurn #-}
|
||||
<span class="lineno"> 94 </span>-- Left turn.
|
||||
<span class="lineno"> 95 </span>isLeftTurn :: (Fractional a, Ord a, Epsilon a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 96 </span><span class="decl"><span class="nottickedoff">isLeftTurn p1 p2 p3 =</span>
|
||||
<span class="lineno"> 97 </span><span class="spaces"> </span><span class="nottickedoff">case compareEpsZero (direction p1 p2 p3) of</span>
|
||||
<span class="lineno"> 98 </span><span class="spaces"> </span><span class="nottickedoff">LT -> True</span>
|
||||
<span class="lineno"> 99 </span><span class="spaces"> </span><span class="nottickedoff">EQ -> True -- colinear</span>
|
||||
<span class="lineno"> 99 </span><span class="spaces"> </span><span class="nottickedoff">EQ -> False -- colinear</span>
|
||||
<span class="lineno"> 100 </span><span class="spaces"> </span><span class="nottickedoff">GT -> False</span></span>
|
||||
<span class="lineno"> 101 </span>
|
||||
<span class="lineno"> 102 </span>{-# INLINE isRightTurn #-}
|
||||
<span class="lineno"> 103 </span>isRightTurn :: (Fractional a, Ord a, Epsilon a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 104 </span><span class="decl"><span class="nottickedoff">isRightTurn a b c = not (isLeftTurnOrLinear a b c)</span></span>
|
||||
<span class="lineno"> 105 </span>
|
||||
<span class="lineno"> 106 </span>{-# INLINE isRightTurnOrLinear #-}
|
||||
<span class="lineno"> 107 </span>isRightTurnOrLinear :: (Fractional a, Ord a, Epsilon a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 108 </span><span class="decl"><span class="nottickedoff">isRightTurnOrLinear a b c = not (isLeftTurn a b c)</span></span>
|
||||
<span class="lineno"> 102 </span>{-# INLINE isLeftTurnOrLinear #-}
|
||||
<span class="lineno"> 103 </span>isLeftTurnOrLinear :: (Fractional a, Ord a, Epsilon a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 104 </span><span class="decl"><span class="nottickedoff">isLeftTurnOrLinear p1 p2 p3 =</span>
|
||||
<span class="lineno"> 105 </span><span class="spaces"> </span><span class="nottickedoff">case compareEpsZero (direction p1 p2 p3) of</span>
|
||||
<span class="lineno"> 106 </span><span class="spaces"> </span><span class="nottickedoff">LT -> True</span>
|
||||
<span class="lineno"> 107 </span><span class="spaces"> </span><span class="nottickedoff">EQ -> True -- colinear</span>
|
||||
<span class="lineno"> 108 </span><span class="spaces"> </span><span class="nottickedoff">GT -> False</span></span>
|
||||
<span class="lineno"> 109 </span>
|
||||
<span class="lineno"> 110 </span>{-# INLINE direction #-}
|
||||
<span class="lineno"> 111 </span>direction :: Num a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 112 </span><span class="decl"><span class="nottickedoff">direction p1 p2 p3 = crossZ (p3-p1) (p2-p1)</span></span>
|
||||
<span class="lineno"> 110 </span>{-# INLINE isRightTurn #-}
|
||||
<span class="lineno"> 111 </span>isRightTurn :: (Fractional a, Ord a, Epsilon a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 112 </span><span class="decl"><span class="nottickedoff">isRightTurn a b c = not (isLeftTurnOrLinear a b c)</span></span>
|
||||
<span class="lineno"> 113 </span>
|
||||
<span class="lineno"> 114 </span>{-# INLINE isInside #-}
|
||||
<span class="lineno"> 115 </span>isInside :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 116 </span><span class="decl"><span class="nottickedoff">isInside a b c d =</span>
|
||||
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="nottickedoff">s >= 0 && s <= 1 && t >= 0 && t <= 1 && i >= 0 && i <= 1</span>
|
||||
<span class="lineno"> 118 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="nottickedoff">(s, t, i) = barycentricCoords a b c d</span></span>
|
||||
<span class="lineno"> 120 </span>
|
||||
<span class="lineno"> 121 </span>{-# INLINE isInsideStrict #-}
|
||||
<span class="lineno"> 122 </span>isInsideStrict :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 123 </span><span class="decl"><span class="nottickedoff">isInsideStrict a b c d =</span>
|
||||
<span class="lineno"> 124 </span><span class="spaces"> </span><span class="nottickedoff">s > 0 && s < 1 && t > 0 && t < 1 && i > 0 && i < 1</span>
|
||||
<span class="lineno"> 125 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 126 </span><span class="spaces"> </span><span class="nottickedoff">(s, t, i) = barycentricCoords a b c d</span></span>
|
||||
<span class="lineno"> 127 </span>
|
||||
<span class="lineno"> 128 </span>{-# INLINE barycentricCoords #-}
|
||||
<span class="lineno"> 129 </span>barycentricCoords :: Fractional a => V2 a -> V2 a -> V2 a -> V2 a -> (a, a, a)
|
||||
<span class="lineno"> 130 </span><span class="decl"><span class="nottickedoff">barycentricCoords (V2 x1 y1) (V2 x2 y2) (V2 x3 y3) (V2 x y) =</span>
|
||||
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="nottickedoff">(lam1, lam2, lam3)</span>
|
||||
<span class="lineno"> 132 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 133 </span><span class="spaces"> </span><span class="nottickedoff">lam1 = ((y2-y3)*(x-x3) + (x3 - x2)*(y-y3)) /</span>
|
||||
<span class="lineno"> 134 </span><span class="spaces"> </span><span class="nottickedoff">((y2-y3)*(x1-x3) + (x3-x2)*(y1-y3))</span>
|
||||
<span class="lineno"> 135 </span><span class="spaces"> </span><span class="nottickedoff">lam2 = ((y3-y1)*(x-x3) + (x1-x3)*(y-y3)) /</span>
|
||||
<span class="lineno"> 136 </span><span class="spaces"> </span><span class="nottickedoff">((y2-y3)*(x1-x3) + (x3-x2)*(y1-y3))</span>
|
||||
<span class="lineno"> 137 </span><span class="spaces"> </span><span class="nottickedoff">lam3 = 1 - lam1 - lam2</span></span>
|
||||
<span class="lineno"> 138 </span>
|
||||
<span class="lineno"> 139 </span>
|
||||
<span class="lineno"> 140 </span>{-# INLINE rayIntersect #-}
|
||||
<span class="lineno"> 141 </span>rayIntersect :: (Fractional a, Ord a) => (V2 a,V2 a) -> (V2 a,V2 a) -> Maybe (V2 a)
|
||||
<span class="lineno"> 142 </span><span class="decl"><span class="nottickedoff">rayIntersect (V2 x1 y1,V2 x2 y2) (V2 x3 y3, V2 x4 y4)</span>
|
||||
<span class="lineno"> 143 </span><span class="spaces"> </span><span class="nottickedoff">| yBot == 0 = Nothing</span>
|
||||
<span class="lineno"> 144 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = Just $</span>
|
||||
<span class="lineno"> 145 </span><span class="spaces"> </span><span class="nottickedoff">V2 (xTop/xBot) (yTop/yBot)</span>
|
||||
<span class="lineno"> 146 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="nottickedoff">xTop = (x1*y2 - y1*x2)*(x3-x4) - (x1 - x2)*(x3*y4-y3*x4)</span>
|
||||
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="nottickedoff">xBot = (x1-x2)*(y3-y4)-(y1-y2)*(x3-x4)</span>
|
||||
<span class="lineno"> 149 </span><span class="spaces"> </span><span class="nottickedoff">yTop = (x1*y2 - y1*x2)*(y3-y4) - (y1-y2)*(x3*y4-y3*x4)</span>
|
||||
<span class="lineno"> 150 </span><span class="spaces"> </span><span class="nottickedoff">yBot = (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4)</span></span>
|
||||
<span class="lineno"> 151 </span>
|
||||
<span class="lineno"> 152 </span>{-# INLINE isBetween #-}
|
||||
<span class="lineno"> 153 </span>isBetween :: (Ord a, Fractional a) => V2 a -> (V2 a, V2 a) -> Bool
|
||||
<span class="lineno"> 154 </span><span class="decl"><span class="nottickedoff">isBetween (V2 x y) (V2 x1 y1, V2 x2 y2) =</span>
|
||||
<span class="lineno"> 155 </span><span class="spaces"> </span><span class="nottickedoff">((y1 > y) /= (y2 > y) || y == y1 || y == y2) && -- y is between y1 and y2</span>
|
||||
<span class="lineno"> 156 </span><span class="spaces"> </span><span class="nottickedoff">((x1 > x) /= (x2 > x) || x == x1 || x == x2)</span></span>
|
||||
<span class="lineno"> 157 </span>
|
||||
<span class="lineno"> 158 </span>{-# INLINE lineIntersect #-}
|
||||
<span class="lineno"> 159 </span>lineIntersect :: (Ord a, Fractional a) => (V2 a, V2 a) -> (V2 a, V2 a) -> Maybe (V2 a)
|
||||
<span class="lineno"> 160 </span><span class="decl"><span class="nottickedoff">lineIntersect a b =</span>
|
||||
<span class="lineno"> 161 </span><span class="spaces"> </span><span class="nottickedoff">case rayIntersect a b of</span>
|
||||
<span class="lineno"> 162 </span><span class="spaces"> </span><span class="nottickedoff">Just u</span>
|
||||
<span class="lineno"> 163 </span><span class="spaces"> </span><span class="nottickedoff">| isBetween u a && isBetween u b -> Just u</span>
|
||||
<span class="lineno"> 164 </span><span class="spaces"> </span><span class="nottickedoff">_ -> Nothing</span></span>
|
||||
<span class="lineno"> 114 </span>{-# INLINE isRightTurnOrLinear #-}
|
||||
<span class="lineno"> 115 </span>isRightTurnOrLinear :: (Fractional a, Ord a, Epsilon a) => V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 116 </span><span class="decl"><span class="nottickedoff">isRightTurnOrLinear a b c = not (isLeftTurn a b c)</span></span>
|
||||
<span class="lineno"> 117 </span>
|
||||
<span class="lineno"> 118 </span>{-# INLINE direction #-}
|
||||
<span class="lineno"> 119 </span>direction :: Num a => V2 a -> V2 a -> V2 a -> a
|
||||
<span class="lineno"> 120 </span><span class="decl"><span class="nottickedoff">direction p1 p2 p3 = crossZ (p3-p1) (p2-p1)</span></span>
|
||||
<span class="lineno"> 121 </span>
|
||||
<span class="lineno"> 122 </span>{-# INLINE isInside #-}
|
||||
<span class="lineno"> 123 </span>isInside :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 124 </span><span class="decl"><span class="nottickedoff">isInside a b c d =</span>
|
||||
<span class="lineno"> 125 </span><span class="spaces"> </span><span class="nottickedoff">s >= 0 && s <= 1 && t >= 0 && t <= 1 && i >= 0 && i <= 1</span>
|
||||
<span class="lineno"> 126 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 127 </span><span class="spaces"> </span><span class="nottickedoff">(s, t, i) = barycentricCoords a b c d</span></span>
|
||||
<span class="lineno"> 128 </span>
|
||||
<span class="lineno"> 129 </span>{-# INLINE isInsideStrict #-}
|
||||
<span class="lineno"> 130 </span>isInsideStrict :: (Fractional a, Ord a) => V2 a -> V2 a -> V2 a -> V2 a -> Bool
|
||||
<span class="lineno"> 131 </span><span class="decl"><span class="nottickedoff">isInsideStrict a b c d =</span>
|
||||
<span class="lineno"> 132 </span><span class="spaces"> </span><span class="nottickedoff">s > 0 && s < 1 && t > 0 && t < 1 && i > 0 && i < 1</span>
|
||||
<span class="lineno"> 133 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 134 </span><span class="spaces"> </span><span class="nottickedoff">(s, t, i) = barycentricCoords a b c d</span></span>
|
||||
<span class="lineno"> 135 </span>
|
||||
<span class="lineno"> 136 </span>{-# INLINE barycentricCoords #-}
|
||||
<span class="lineno"> 137 </span>barycentricCoords :: Fractional a => V2 a -> V2 a -> V2 a -> V2 a -> (a, a, a)
|
||||
<span class="lineno"> 138 </span><span class="decl"><span class="nottickedoff">barycentricCoords (V2 x1 y1) (V2 x2 y2) (V2 x3 y3) (V2 x y) =</span>
|
||||
<span class="lineno"> 139 </span><span class="spaces"> </span><span class="nottickedoff">(lam1, lam2, lam3)</span>
|
||||
<span class="lineno"> 140 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 141 </span><span class="spaces"> </span><span class="nottickedoff">lam1 = ((y2-y3)*(x-x3) + (x3 - x2)*(y-y3)) /</span>
|
||||
<span class="lineno"> 142 </span><span class="spaces"> </span><span class="nottickedoff">((y2-y3)*(x1-x3) + (x3-x2)*(y1-y3))</span>
|
||||
<span class="lineno"> 143 </span><span class="spaces"> </span><span class="nottickedoff">lam2 = ((y3-y1)*(x-x3) + (x1-x3)*(y-y3)) /</span>
|
||||
<span class="lineno"> 144 </span><span class="spaces"> </span><span class="nottickedoff">((y2-y3)*(x1-x3) + (x3-x2)*(y1-y3))</span>
|
||||
<span class="lineno"> 145 </span><span class="spaces"> </span><span class="nottickedoff">lam3 = 1 - lam1 - lam2</span></span>
|
||||
<span class="lineno"> 146 </span>
|
||||
<span class="lineno"> 147 </span>
|
||||
<span class="lineno"> 148 </span>{-# INLINE rayIntersect #-}
|
||||
<span class="lineno"> 149 </span>rayIntersect :: (Fractional a, Ord a) => (V2 a,V2 a) -> (V2 a,V2 a) -> Maybe (V2 a)
|
||||
<span class="lineno"> 150 </span><span class="decl"><span class="nottickedoff">rayIntersect (V2 x1 y1,V2 x2 y2) (V2 x3 y3, V2 x4 y4)</span>
|
||||
<span class="lineno"> 151 </span><span class="spaces"> </span><span class="nottickedoff">| yBot == 0 = Nothing</span>
|
||||
<span class="lineno"> 152 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = Just $</span>
|
||||
<span class="lineno"> 153 </span><span class="spaces"> </span><span class="nottickedoff">V2 (xTop/xBot) (yTop/yBot)</span>
|
||||
<span class="lineno"> 154 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 155 </span><span class="spaces"> </span><span class="nottickedoff">xTop = (x1*y2 - y1*x2)*(x3-x4) - (x1 - x2)*(x3*y4-y3*x4)</span>
|
||||
<span class="lineno"> 156 </span><span class="spaces"> </span><span class="nottickedoff">xBot = (x1-x2)*(y3-y4)-(y1-y2)*(x3-x4)</span>
|
||||
<span class="lineno"> 157 </span><span class="spaces"> </span><span class="nottickedoff">yTop = (x1*y2 - y1*x2)*(y3-y4) - (y1-y2)*(x3*y4-y3*x4)</span>
|
||||
<span class="lineno"> 158 </span><span class="spaces"> </span><span class="nottickedoff">yBot = (x1-x2)*(y3-y4) - (y1-y2)*(x3-x4)</span></span>
|
||||
<span class="lineno"> 159 </span>
|
||||
<span class="lineno"> 160 </span>{-# INLINE isBetween #-}
|
||||
<span class="lineno"> 161 </span>isBetween :: (Ord a, Fractional a) => V2 a -> (V2 a, V2 a) -> Bool
|
||||
<span class="lineno"> 162 </span><span class="decl"><span class="nottickedoff">isBetween (V2 x y) (V2 x1 y1, V2 x2 y2) =</span>
|
||||
<span class="lineno"> 163 </span><span class="spaces"> </span><span class="nottickedoff">((y1 > y) /= (y2 > y) || y == y1 || y == y2) && -- y is between y1 and y2</span>
|
||||
<span class="lineno"> 164 </span><span class="spaces"> </span><span class="nottickedoff">((x1 > x) /= (x2 > x) || x == x1 || x == x2)</span></span>
|
||||
<span class="lineno"> 165 </span>
|
||||
<span class="lineno"> 166 </span>-- circleIntersect :: (Ord a, Fractional a) => (V2 a, V2 a) -> (V2 a, V2 a) -> [V2 a]
|
||||
<span class="lineno"> 167 </span>
|
||||
<span class="lineno"> 168 </span>distSquared :: (Num a) => V2 a -> V2 a -> a
|
||||
<span class="lineno"> 169 </span><span class="decl"><span class="nottickedoff">distSquared a b = quadrance (a ^-^ b)</span></span>
|
||||
<span class="lineno"> 170 </span>
|
||||
<span class="lineno"> 171 </span>approxDist :: (Real a, Fractional a) => V2 a -> V2 a -> a
|
||||
<span class="lineno"> 172 </span><span class="decl"><span class="nottickedoff">approxDist a b = realToFrac (sqrt (realToFrac (distSquared a b) :: Double))</span></span>
|
||||
<span class="lineno"> 166 </span>{-# INLINE lineIntersect #-}
|
||||
<span class="lineno"> 167 </span>lineIntersect :: (Ord a, Fractional a) => (V2 a, V2 a) -> (V2 a, V2 a) -> Maybe (V2 a)
|
||||
<span class="lineno"> 168 </span><span class="decl"><span class="nottickedoff">lineIntersect a b =</span>
|
||||
<span class="lineno"> 169 </span><span class="spaces"> </span><span class="nottickedoff">case rayIntersect a b of</span>
|
||||
<span class="lineno"> 170 </span><span class="spaces"> </span><span class="nottickedoff">Just u</span>
|
||||
<span class="lineno"> 171 </span><span class="spaces"> </span><span class="nottickedoff">| isBetween u a && isBetween u b -> Just u</span>
|
||||
<span class="lineno"> 172 </span><span class="spaces"> </span><span class="nottickedoff">_ -> Nothing</span></span>
|
||||
<span class="lineno"> 173 </span>
|
||||
<span class="lineno"> 174 </span>distance' :: (Real a, Fractional a) => V2 a -> V2 a -> Double
|
||||
<span class="lineno"> 175 </span><span class="decl"><span class="nottickedoff">distance' a b = sqrt (realToFrac (distSquared a b))</span></span>
|
||||
<span class="lineno"> 176 </span>
|
||||
<span class="lineno"> 177 </span>-- sum of angles is always pi.
|
||||
<span class="lineno"> 178 </span>triangleAngles :: V2 Double -> V2 Double -> V2 Double -> (Double, Double, Double)
|
||||
<span class="lineno"> 179 </span><span class="decl"><span class="nottickedoff">triangleAngles a b c =</span>
|
||||
<span class="lineno"> 180 </span><span class="spaces"> </span><span class="nottickedoff">(findAngle (b-a) (c-a)</span>
|
||||
<span class="lineno"> 181 </span><span class="spaces"> </span><span class="nottickedoff">,findAngle (c-b) (a-b)</span>
|
||||
<span class="lineno"> 182 </span><span class="spaces"> </span><span class="nottickedoff">,findAngle (a-c) (b-c))</span>
|
||||
<span class="lineno"> 183 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 184 </span><span class="spaces"> </span><span class="nottickedoff">findAngle v1 v2 = abs (atan2 (crossZ v1 v2) (dot v1 v2))</span></span>
|
||||
<span class="lineno"> 185 </span> -- findAngle v1 v2 = acos (dot v1 v2 / (norm v1 * norm v2))
|
||||
<span class="lineno"> 174 </span>-- circleIntersect :: (Ord a, Fractional a) => (V2 a, V2 a) -> (V2 a, V2 a) -> [V2 a]
|
||||
<span class="lineno"> 175 </span>
|
||||
<span class="lineno"> 176 </span>distSquared :: (Num a) => V2 a -> V2 a -> a
|
||||
<span class="lineno"> 177 </span><span class="decl"><span class="nottickedoff">distSquared a b = quadrance (a ^-^ b)</span></span>
|
||||
<span class="lineno"> 178 </span>
|
||||
<span class="lineno"> 179 </span>approxDist :: (Real a, Fractional a) => V2 a -> V2 a -> a
|
||||
<span class="lineno"> 180 </span><span class="decl"><span class="nottickedoff">approxDist a b = realToFrac (sqrt (realToFrac (distSquared a b) :: Double))</span></span>
|
||||
<span class="lineno"> 181 </span>
|
||||
<span class="lineno"> 182 </span>distance' :: (Real a, Fractional a) => V2 a -> V2 a -> Double
|
||||
<span class="lineno"> 183 </span><span class="decl"><span class="nottickedoff">distance' a b = sqrt (realToFrac (distSquared a b))</span></span>
|
||||
<span class="lineno"> 184 </span>
|
||||
<span class="lineno"> 185 </span>-- sum of angles is always pi.
|
||||
<span class="lineno"> 186 </span>triangleAngles :: V2 Double -> V2 Double -> V2 Double -> (Double, Double, Double)
|
||||
<span class="lineno"> 187 </span><span class="decl"><span class="nottickedoff">triangleAngles a b c =</span>
|
||||
<span class="lineno"> 188 </span><span class="spaces"> </span><span class="nottickedoff">(findAngle (b-a) (c-a)</span>
|
||||
<span class="lineno"> 189 </span><span class="spaces"> </span><span class="nottickedoff">,findAngle (c-b) (a-b)</span>
|
||||
<span class="lineno"> 190 </span><span class="spaces"> </span><span class="nottickedoff">,findAngle (a-c) (b-c))</span>
|
||||
<span class="lineno"> 191 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 192 </span><span class="spaces"> </span><span class="nottickedoff">findAngle v1 v2 = abs (atan2 (crossZ v1 v2) (dot v1 v2))</span></span>
|
||||
<span class="lineno"> 193 </span> -- findAngle v1 v2 = acos (dot v1 v2 / (norm v1 * norm v2))
|
||||
|
||||
</pre>
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -117,7 +117,7 @@ span.spaces { background: white }
|
|||
<span class="lineno"> 98 </span>import Linear.V2
|
||||
<span class="lineno"> 99 </span>import Linear.Vector
|
||||
<span class="lineno"> 100 </span>import Reanimate.Math.Common
|
||||
<span class="lineno"> 101 </span>import Reanimate.Math.EarClip
|
||||
<span class="lineno"> 101 </span>-- import Reanimate.Math.EarClip
|
||||
<span class="lineno"> 102 </span>import Reanimate.Math.SSSP
|
||||
<span class="lineno"> 103 </span>import Reanimate.Math.Triangulate
|
||||
<span class="lineno"> 104 </span>
|
||||
|
|
@ -164,7 +164,7 @@ span.spaces { background: white }
|
|||
<span class="lineno"> 145 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||
<span class="lineno"> 146 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">n = length points</span></span>
|
||||
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">ring = ringPack points</span></span>
|
||||
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">trig = earCut ring</span></span></span>
|
||||
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">trig = triangulate ring</span></span></span>
|
||||
<span class="lineno"> 149 </span> -- earClip ring
|
||||
<span class="lineno"> 150 </span>
|
||||
<span class="lineno"> 151 </span>castPolygon :: (PolyCtx a, PolyCtx b) => APolygon a -> APolygon b
|
||||
|
|
|
|||
|
|
@ -17,60 +17,90 @@ span.spaces { background: white }
|
|||
<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span>
|
||||
</pre>
|
||||
<pre>
|
||||
<span class="lineno"> 1 </span>module Reanimate.Math.Triangulate
|
||||
<span class="lineno"> 2 </span> ( Triangulation
|
||||
<span class="lineno"> 3 </span> , edgesToTriangulation
|
||||
<span class="lineno"> 4 </span> , edgesToTriangulationM
|
||||
<span class="lineno"> 5 </span> , trianglesToTriangulation
|
||||
<span class="lineno"> 6 </span> , trianglesToTriangulationM
|
||||
<span class="lineno"> 7 </span> )
|
||||
<span class="lineno"> 8 </span>where
|
||||
<span class="lineno"> 9 </span>
|
||||
<span class="lineno"> 10 </span>import Control.Monad
|
||||
<span class="lineno"> 11 </span>import qualified Data.IntSet as ISet
|
||||
<span class="lineno"> 12 </span>import qualified Data.Vector as V
|
||||
<span class="lineno"> 13 </span>import qualified Data.Vector.Mutable as MV
|
||||
<span class="lineno"> 14 </span>import Control.Monad.ST
|
||||
<span class="lineno"> 15 </span>
|
||||
<span class="lineno"> 16 </span>-- Max edges: n-2
|
||||
<span class="lineno"> 17 </span>-- Each edge is represented twice: 2n-4
|
||||
<span class="lineno"> 18 </span>-- Flat structure:
|
||||
<span class="lineno"> 19 </span>-- edges :: V.Vector Int -- max length (2n-4)
|
||||
<span class="lineno"> 20 </span>-- offsets :: V.Vector Int -- length n
|
||||
<span class="lineno"> 21 </span>-- Combine the two vectors? < n => offsets, >= n => edges?
|
||||
<span class="lineno"> 22 </span>type Triangulation = V.Vector [Int]
|
||||
<span class="lineno"> 23 </span>
|
||||
<span class="lineno"> 24 </span>-- FIXME: Move to Common or a Triangulation module
|
||||
<span class="lineno"> 25 </span>-- O(n)
|
||||
<span class="lineno"> 26 </span>edgesToTriangulation :: Int -> [(Int, Int)] -> Triangulation
|
||||
<span class="lineno"> 27 </span><span class="decl"><span class="nottickedoff">edgesToTriangulation size edges = runST $ do</span>
|
||||
<span class="lineno"> 28 </span><span class="spaces"> </span><span class="nottickedoff">v <- edgesToTriangulationM size edges</span>
|
||||
<span class="lineno"> 29 </span><span class="spaces"> </span><span class="nottickedoff">V.unsafeFreeze v</span></span>
|
||||
<span class="lineno"> 30 </span>
|
||||
<span class="lineno"> 31 </span>edgesToTriangulationM :: Int -> [(Int, Int)] -> ST s (V.MVector s [Int])
|
||||
<span class="lineno"> 32 </span><span class="decl"><span class="nottickedoff">edgesToTriangulationM size edges = do</span>
|
||||
<span class="lineno"> 33 </span><span class="spaces"> </span><span class="nottickedoff">v <- MV.replicate size []</span>
|
||||
<span class="lineno"> 34 </span><span class="spaces"> </span><span class="nottickedoff">forM_ edges $ \(e1, e2) -> do</span>
|
||||
<span class="lineno"> 35 </span><span class="spaces"> </span><span class="nottickedoff">MV.modify v (e1 :) e2</span>
|
||||
<span class="lineno"> 36 </span><span class="spaces"> </span><span class="nottickedoff">MV.modify v (e2 :) e1</span>
|
||||
<span class="lineno"> 37 </span><span class="spaces"> </span><span class="nottickedoff">forM_ [0 .. size - 1] $ \i -> MV.modify v (ISet.toList . ISet.fromList) i</span>
|
||||
<span class="lineno"> 38 </span><span class="spaces"> </span><span class="nottickedoff">return v</span></span>
|
||||
<span class="lineno"> 39 </span>
|
||||
<span class="lineno"> 40 </span>trianglesToTriangulation :: Int -> V.Vector (Int, Int, Int) -> Triangulation
|
||||
<span class="lineno"> 41 </span><span class="decl"><span class="nottickedoff">trianglesToTriangulation size edges = runST $ do</span>
|
||||
<span class="lineno"> 42 </span><span class="spaces"> </span><span class="nottickedoff">v <- trianglesToTriangulationM size edges</span>
|
||||
<span class="lineno"> 43 </span><span class="spaces"> </span><span class="nottickedoff">V.unsafeFreeze v</span></span>
|
||||
<span class="lineno"> 44 </span>
|
||||
<span class="lineno"> 45 </span>trianglesToTriangulationM
|
||||
<span class="lineno"> 46 </span> :: Int -> V.Vector (Int, Int, Int) -> ST s (V.MVector s [Int])
|
||||
<span class="lineno"> 47 </span><span class="decl"><span class="nottickedoff">trianglesToTriangulationM size trigs = do</span>
|
||||
<span class="lineno"> 48 </span><span class="spaces"> </span><span class="nottickedoff">v <- MV.replicate size []</span>
|
||||
<span class="lineno"> 49 </span><span class="spaces"> </span><span class="nottickedoff">forM_ (V.toList trigs) $ \(a, b, c) -> do</span>
|
||||
<span class="lineno"> 50 </span><span class="spaces"> </span><span class="nottickedoff">MV.modify v (\x -> b : c : x) a</span>
|
||||
<span class="lineno"> 51 </span><span class="spaces"> </span><span class="nottickedoff">MV.modify v (\x -> a : c : x) b</span>
|
||||
<span class="lineno"> 52 </span><span class="spaces"> </span><span class="nottickedoff">MV.modify v (\x -> a : b : x) c</span>
|
||||
<span class="lineno"> 53 </span><span class="spaces"> </span><span class="nottickedoff">forM_ [0 .. size - 1] $ \i -> MV.modify v (ISet.toList . ISet.fromList) i</span>
|
||||
<span class="lineno"> 54 </span><span class="spaces"> </span><span class="nottickedoff">return v</span></span>
|
||||
<span class="lineno"> 1 </span>{-# LANGUAGE DataKinds #-}
|
||||
<span class="lineno"> 2 </span>{-# LANGUAGE ScopedTypeVariables #-}
|
||||
<span class="lineno"> 3 </span>module Reanimate.Math.Triangulate
|
||||
<span class="lineno"> 4 </span> ( Triangulation
|
||||
<span class="lineno"> 5 </span> , edgesToTriangulation
|
||||
<span class="lineno"> 6 </span> , edgesToTriangulationM
|
||||
<span class="lineno"> 7 </span> , trianglesToTriangulation
|
||||
<span class="lineno"> 8 </span> , trianglesToTriangulationM
|
||||
<span class="lineno"> 9 </span> , triangulate
|
||||
<span class="lineno"> 10 </span> )
|
||||
<span class="lineno"> 11 </span>where
|
||||
<span class="lineno"> 12 </span>
|
||||
<span class="lineno"> 13 </span>import Algorithms.Geometry.PolygonTriangulation.Triangulate (triangulate')
|
||||
<span class="lineno"> 14 </span>import Algorithms.Geometry.PolygonTriangulation.Types
|
||||
<span class="lineno"> 15 </span>import Control.Lens
|
||||
<span class="lineno"> 16 </span>import Control.Monad
|
||||
<span class="lineno"> 17 </span>import Control.Monad.ST
|
||||
<span class="lineno"> 18 </span>import Data.Ext
|
||||
<span class="lineno"> 19 </span>import Data.Geometry.PlanarSubdivision (PolygonFaceData)
|
||||
<span class="lineno"> 20 </span>import Data.Geometry.Point
|
||||
<span class="lineno"> 21 </span>import Data.Geometry.Polygon
|
||||
<span class="lineno"> 22 </span>import qualified Data.IntSet as ISet
|
||||
<span class="lineno"> 23 </span>import qualified Data.PlaneGraph as Geo
|
||||
<span class="lineno"> 24 </span>import Data.Proxy
|
||||
<span class="lineno"> 25 </span>import qualified Data.Vector as V
|
||||
<span class="lineno"> 26 </span>import qualified Data.Vector.Mutable as MV
|
||||
<span class="lineno"> 27 </span>import Linear.V2
|
||||
<span class="lineno"> 28 </span>import Reanimate.Math.Common
|
||||
<span class="lineno"> 29 </span>-- Max edges: n-2
|
||||
<span class="lineno"> 30 </span>-- Each edge is represented twice: 2n-4
|
||||
<span class="lineno"> 31 </span>-- Flat structure:
|
||||
<span class="lineno"> 32 </span>-- edges :: V.Vector Int -- max length (2n-4)
|
||||
<span class="lineno"> 33 </span>-- offsets :: V.Vector Int -- length n
|
||||
<span class="lineno"> 34 </span>-- Combine the two vectors? < n => offsets, >= n => edges?
|
||||
<span class="lineno"> 35 </span>type Triangulation = V.Vector [Int]
|
||||
<span class="lineno"> 36 </span>
|
||||
<span class="lineno"> 37 </span>-- FIXME: Move to Common or a Triangulation module
|
||||
<span class="lineno"> 38 </span>-- O(n)
|
||||
<span class="lineno"> 39 </span>edgesToTriangulation :: Int -> [(Int, Int)] -> Triangulation
|
||||
<span class="lineno"> 40 </span><span class="decl"><span class="nottickedoff">edgesToTriangulation size edges = runST $ do</span>
|
||||
<span class="lineno"> 41 </span><span class="spaces"> </span><span class="nottickedoff">v <- edgesToTriangulationM size edges</span>
|
||||
<span class="lineno"> 42 </span><span class="spaces"> </span><span class="nottickedoff">V.unsafeFreeze v</span></span>
|
||||
<span class="lineno"> 43 </span>
|
||||
<span class="lineno"> 44 </span>edgesToTriangulationM :: Int -> [(Int, Int)] -> ST s (V.MVector s [Int])
|
||||
<span class="lineno"> 45 </span><span class="decl"><span class="nottickedoff">edgesToTriangulationM size edges = do</span>
|
||||
<span class="lineno"> 46 </span><span class="spaces"> </span><span class="nottickedoff">v <- MV.replicate size []</span>
|
||||
<span class="lineno"> 47 </span><span class="spaces"> </span><span class="nottickedoff">forM_ edges $ \(e1, e2) -> do</span>
|
||||
<span class="lineno"> 48 </span><span class="spaces"> </span><span class="nottickedoff">MV.modify v (e1 :) e2</span>
|
||||
<span class="lineno"> 49 </span><span class="spaces"> </span><span class="nottickedoff">MV.modify v (e2 :) e1</span>
|
||||
<span class="lineno"> 50 </span><span class="spaces"> </span><span class="nottickedoff">forM_ [0 .. size - 1] $ \i -> MV.modify v (ISet.toList . ISet.fromList) i</span>
|
||||
<span class="lineno"> 51 </span><span class="spaces"> </span><span class="nottickedoff">return v</span></span>
|
||||
<span class="lineno"> 52 </span>
|
||||
<span class="lineno"> 53 </span>trianglesToTriangulation :: Int -> V.Vector (Int, Int, Int) -> Triangulation
|
||||
<span class="lineno"> 54 </span><span class="decl"><span class="nottickedoff">trianglesToTriangulation size edges = runST $ do</span>
|
||||
<span class="lineno"> 55 </span><span class="spaces"> </span><span class="nottickedoff">v <- trianglesToTriangulationM size edges</span>
|
||||
<span class="lineno"> 56 </span><span class="spaces"> </span><span class="nottickedoff">V.unsafeFreeze v</span></span>
|
||||
<span class="lineno"> 57 </span>
|
||||
<span class="lineno"> 58 </span>trianglesToTriangulationM
|
||||
<span class="lineno"> 59 </span> :: Int -> V.Vector (Int, Int, Int) -> ST s (V.MVector s [Int])
|
||||
<span class="lineno"> 60 </span><span class="decl"><span class="nottickedoff">trianglesToTriangulationM size trigs = do</span>
|
||||
<span class="lineno"> 61 </span><span class="spaces"> </span><span class="nottickedoff">v <- MV.replicate size []</span>
|
||||
<span class="lineno"> 62 </span><span class="spaces"> </span><span class="nottickedoff">forM_ (V.toList trigs) $ \(a, b, c) -> do</span>
|
||||
<span class="lineno"> 63 </span><span class="spaces"> </span><span class="nottickedoff">MV.modify v (\x -> b : c : x) a</span>
|
||||
<span class="lineno"> 64 </span><span class="spaces"> </span><span class="nottickedoff">MV.modify v (\x -> a : c : x) b</span>
|
||||
<span class="lineno"> 65 </span><span class="spaces"> </span><span class="nottickedoff">MV.modify v (\x -> a : b : x) c</span>
|
||||
<span class="lineno"> 66 </span><span class="spaces"> </span><span class="nottickedoff">forM_ [0 .. size - 1] $ \i -> MV.modify v (ISet.toList . ISet.fromList) i</span>
|
||||
<span class="lineno"> 67 </span><span class="spaces"> </span><span class="nottickedoff">return v</span></span>
|
||||
<span class="lineno"> 68 </span>
|
||||
<span class="lineno"> 69 </span>
|
||||
<span class="lineno"> 70 </span>triangulate :: forall a. (Fractional a, Ord a) => Ring a -> Triangulation
|
||||
<span class="lineno"> 71 </span><span class="decl"><span class="nottickedoff">triangulate r = edgesToTriangulation (ringSize r) ds</span>
|
||||
<span class="lineno"> 72 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 73 </span><span class="spaces"> </span><span class="nottickedoff">ds :: [(Int,Int)]</span>
|
||||
<span class="lineno"> 74 </span><span class="spaces"> </span><span class="nottickedoff">ds =</span>
|
||||
<span class="lineno"> 75 </span><span class="spaces"> </span><span class="nottickedoff">[ (a^.Geo.vData, b^.Geo.vData)</span>
|
||||
<span class="lineno"> 76 </span><span class="spaces"> </span><span class="nottickedoff">| (d, Diagonal) <- V.toList (Geo.edges pg)</span>
|
||||
<span class="lineno"> 77 </span><span class="spaces"> </span><span class="nottickedoff">, let (a,b) = Geo.endPointData d pg ]</span>
|
||||
<span class="lineno"> 78 </span><span class="spaces"> </span><span class="nottickedoff">pg :: Geo.PlaneGraph () Int PolygonEdgeType PolygonFaceData a</span>
|
||||
<span class="lineno"> 79 </span><span class="spaces"> </span><span class="nottickedoff">pg = triangulate' Proxy p</span>
|
||||
<span class="lineno"> 80 </span><span class="spaces"> </span><span class="nottickedoff">p :: SimplePolygon Int a</span>
|
||||
<span class="lineno"> 81 </span><span class="spaces"> </span><span class="nottickedoff">p = fromPoints $</span>
|
||||
<span class="lineno"> 82 </span><span class="spaces"> </span><span class="nottickedoff">[ Point2 x y :+ n</span>
|
||||
<span class="lineno"> 83 </span><span class="spaces"> </span><span class="nottickedoff">| (n,V2 x y) <- zip [0..] (V.toList (ringUnpack r)) ]</span></span>
|
||||
<span class="lineno"> 84 </span> -- ringUnpack
|
||||
|
||||
</pre>
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -17,447 +17,466 @@ span.spaces { background: white }
|
|||
<span class="decl"><span class="nottickedoff">never executed</span> <span class="tickonlytrue">always true</span> <span class="tickonlyfalse">always false</span></span>
|
||||
</pre>
|
||||
<pre>
|
||||
<span class="lineno"> 1 </span>module Reanimate.PolyShape
|
||||
<span class="lineno"> 2 </span> ( PolyShape(..)
|
||||
<span class="lineno"> 3 </span> , PolyShapeWithHoles(..)
|
||||
<span class="lineno"> 4 </span> , svgToPolyShapes -- :: Tree -> [PolyShape]
|
||||
<span class="lineno"> 5 </span> , svgToPolygons -- :: Double -> Svg -> [Polygon]
|
||||
<span class="lineno"> 6 </span>
|
||||
<span class="lineno"> 7 </span> , renderPolyShape -- :: PolyShape -> Tree
|
||||
<span class="lineno"> 8 </span> , renderPolyShapes -- :: [PolyShape] -> Tree
|
||||
<span class="lineno"> 9 </span> , renderPolyShapePoints -- :: PolyShape -> Tree
|
||||
<span class="lineno"> 1 </span>{-|
|
||||
<span class="lineno"> 2 </span>Module : Reanimate.PolyShape
|
||||
<span class="lineno"> 3 </span>Copyright : Written by David Himmelstrup
|
||||
<span class="lineno"> 4 </span>License : Unlicense
|
||||
<span class="lineno"> 5 </span>Maintainer : lemmih@gmail.com
|
||||
<span class="lineno"> 6 </span>Stability : experimental
|
||||
<span class="lineno"> 7 </span>Portability : POSIX
|
||||
<span class="lineno"> 8 </span>
|
||||
<span class="lineno"> 9 </span>A PolyShape is a closed set of curves.
|
||||
<span class="lineno"> 10 </span>
|
||||
<span class="lineno"> 11 </span> , plPathCommands -- :: PolyShape -> [PathCommand]
|
||||
<span class="lineno"> 12 </span> , plLineCommands -- :: PolyShape -> [LineCommand]
|
||||
<span class="lineno"> 13 </span>
|
||||
<span class="lineno"> 14 </span> , plLength -- :: PolyShape -> Double
|
||||
<span class="lineno"> 15 </span> , plArea
|
||||
<span class="lineno"> 16 </span> , plCurves -- :: PolyShape -> [CubicBezier Double]
|
||||
<span class="lineno"> 17 </span> , isInsideOf -- :: PolyShape -> PolyShape -> Bool
|
||||
<span class="lineno"> 18 </span>
|
||||
<span class="lineno"> 19 </span> , plFromPolygon -- :: [RPoint] -> PolyShape
|
||||
<span class="lineno"> 20 </span> , plToPolygon -- :: Double -> PolyShape -> Polygon
|
||||
<span class="lineno"> 21 </span> , plPolygonify -- :: Double -> PolyShape -> [Point Double]
|
||||
<span class="lineno"> 22 </span> , plDecompose -- :: [PolyShape] -> [[RPoint]]
|
||||
<span class="lineno"> 23 </span> , unionPolyShapes -- :: [PolyShape] -> [PolyShape]
|
||||
<span class="lineno"> 24 </span> , unionPolyShapes' -- :: Double -> [PolyShape] -> [PolyShape]
|
||||
<span class="lineno"> 25 </span> , plDecompose' -- :: Double -> [PolyShape] -> [[RPoint]]
|
||||
<span class="lineno"> 26 </span> , decomposePolygon -- :: [Point Double] -> [[RPoint]]
|
||||
<span class="lineno"> 27 </span> , plGroupShapes -- :: [PolyShape] -> [PolyShapeWithHoles]
|
||||
<span class="lineno"> 28 </span> , mergePolyShapeHoles -- :: PolyShapeWithHoles -> PolyShape
|
||||
<span class="lineno"> 29 </span> , polyShapeTolerance
|
||||
<span class="lineno"> 30 </span> , plPartial, plPartialGroup, plPartial'
|
||||
<span class="lineno"> 31 </span> , splitPolyShape -- :: Double -> Int -> PolyShape -> [PolyShape]
|
||||
<span class="lineno"> 32 </span> , plGroupTouching
|
||||
<span class="lineno"> 33 </span> ) where
|
||||
<span class="lineno"> 34 </span>
|
||||
<span class="lineno"> 35 </span>import Control.Lens ((&), (.~))
|
||||
<span class="lineno"> 36 </span>import Data.List (minimumBy, nub, partition,
|
||||
<span class="lineno"> 37 </span> sortOn)
|
||||
<span class="lineno"> 38 </span>import Data.Ord
|
||||
<span class="lineno"> 39 </span>import qualified Data.Vector as V
|
||||
<span class="lineno"> 40 </span>import Geometry.Earcut
|
||||
<span class="lineno"> 41 </span>import Graphics.SvgTree (PathCommand (..), RPoint,
|
||||
<span class="lineno"> 42 </span> Tree (..), defaultSvg,
|
||||
<span class="lineno"> 43 </span> pathDefinition)
|
||||
<span class="lineno"> 44 </span>import Linear.V2
|
||||
<span class="lineno"> 45 </span>import Reanimate.Animation
|
||||
<span class="lineno"> 46 </span>import Reanimate.Constants
|
||||
<span class="lineno"> 47 </span>import Reanimate.Internal.CubicBezier (ClosedPath (..),
|
||||
<span class="lineno"> 48 </span> CubicBezier (..),
|
||||
<span class="lineno"> 49 </span> FillRule (..), PathJoin (..),
|
||||
<span class="lineno"> 50 </span> QuadBezier (..), arcLength,
|
||||
<span class="lineno"> 51 </span> arcLengthParam,
|
||||
<span class="lineno"> 52 </span> bezierIntersection,
|
||||
<span class="lineno"> 53 </span> bezierSubsegment,
|
||||
<span class="lineno"> 54 </span> closedPathCurves, closest,
|
||||
<span class="lineno"> 55 </span> colinear, curvesToClosed,
|
||||
<span class="lineno"> 56 </span> evalBezier, interpolateVector,
|
||||
<span class="lineno"> 57 </span> quadToCubic, reorient,
|
||||
<span class="lineno"> 58 </span> splitBezier, union,
|
||||
<span class="lineno"> 59 </span> vectorDistance)
|
||||
<span class="lineno"> 60 </span>import Reanimate.Math.EarClip
|
||||
<span class="lineno"> 61 </span>import Reanimate.Math.Polygon (Polygon, mkPolygon, pArea,
|
||||
<span class="lineno"> 62 </span> pIsCCW, pRing, pdualPolygons,
|
||||
<span class="lineno"> 63 </span> polygonPoints)
|
||||
<span class="lineno"> 64 </span>import Reanimate.Math.SSSP
|
||||
<span class="lineno"> 65 </span>import Reanimate.Svg
|
||||
<span class="lineno"> 66 </span>
|
||||
<span class="lineno"> 67 </span>-- | Shape drawn by continuous line. May have overlap, may be convex.
|
||||
<span class="lineno"> 68 </span>newtype PolyShape = PolyShape { <span class="istickedoff"><span class="decl"><span class="istickedoff">unPolyShape</span></span></span> :: ClosedPath Double }
|
||||
<span class="lineno"> 69 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>)
|
||||
<span class="lineno"> 70 </span>
|
||||
<span class="lineno"> 11 </span>-}
|
||||
<span class="lineno"> 12 </span>module Reanimate.PolyShape
|
||||
<span class="lineno"> 13 </span> ( PolyShape(..)
|
||||
<span class="lineno"> 14 </span> , PolyShapeWithHoles
|
||||
<span class="lineno"> 15 </span> , svgToPolyShapes -- :: Tree -> [PolyShape]
|
||||
<span class="lineno"> 16 </span> , svgToPolygons -- :: Double -> Svg -> [Polygon]
|
||||
<span class="lineno"> 17 </span>
|
||||
<span class="lineno"> 18 </span> , renderPolyShape -- :: PolyShape -> Tree
|
||||
<span class="lineno"> 19 </span> , renderPolyShapes -- :: [PolyShape] -> Tree
|
||||
<span class="lineno"> 20 </span> , renderPolyShapePoints -- :: PolyShape -> Tree
|
||||
<span class="lineno"> 21 </span>
|
||||
<span class="lineno"> 22 </span> , plPathCommands -- :: PolyShape -> [PathCommand]
|
||||
<span class="lineno"> 23 </span> , plLineCommands -- :: PolyShape -> [LineCommand]
|
||||
<span class="lineno"> 24 </span>
|
||||
<span class="lineno"> 25 </span> , plLength -- :: PolyShape -> Double
|
||||
<span class="lineno"> 26 </span> , plArea
|
||||
<span class="lineno"> 27 </span> , plCurves -- :: PolyShape -> [CubicBezier Double]
|
||||
<span class="lineno"> 28 </span> , isInsideOf -- :: PolyShape -> PolyShape -> Bool
|
||||
<span class="lineno"> 29 </span>
|
||||
<span class="lineno"> 30 </span> , plFromPolygon -- :: [RPoint] -> PolyShape
|
||||
<span class="lineno"> 31 </span> , plToPolygon -- :: Double -> PolyShape -> Polygon
|
||||
<span class="lineno"> 32 </span> , plDecompose -- :: [PolyShape] -> [[RPoint]]
|
||||
<span class="lineno"> 33 </span> , unionPolyShapes -- :: [PolyShape] -> [PolyShape]
|
||||
<span class="lineno"> 34 </span> , unionPolyShapes' -- :: Double -> [PolyShape] -> [PolyShape]
|
||||
<span class="lineno"> 35 </span> , plDecompose' -- :: Double -> [PolyShape] -> [[RPoint]]
|
||||
<span class="lineno"> 36 </span> , decomposePolygon -- :: [Point Double] -> [[RPoint]]
|
||||
<span class="lineno"> 37 </span> , plGroupShapes -- :: [PolyShape] -> [PolyShapeWithHoles]
|
||||
<span class="lineno"> 38 </span> , mergePolyShapeHoles -- :: PolyShapeWithHoles -> PolyShape
|
||||
<span class="lineno"> 39 </span> , plPartial
|
||||
<span class="lineno"> 40 </span> , plGroupTouching
|
||||
<span class="lineno"> 41 </span> ) where
|
||||
<span class="lineno"> 42 </span>
|
||||
<span class="lineno"> 43 </span>import Algorithms.Geometry.PolygonTriangulation.Triangulate (triangulate')
|
||||
<span class="lineno"> 44 </span>import Control.Lens ((&), (.~), (^.))
|
||||
<span class="lineno"> 45 </span>import Data.Ext
|
||||
<span class="lineno"> 46 </span>import Data.Geometry.PlanarSubdivision (PolygonFaceData (..))
|
||||
<span class="lineno"> 47 </span>import qualified Data.Geometry.Point as Geo
|
||||
<span class="lineno"> 48 </span>import qualified Data.Geometry.Polygon as Geo
|
||||
<span class="lineno"> 49 </span>import Data.List (nub, partition, sortOn)
|
||||
<span class="lineno"> 50 </span>import qualified Data.PlaneGraph as Geo
|
||||
<span class="lineno"> 51 </span>import Data.Proxy
|
||||
<span class="lineno"> 52 </span>import qualified Data.Vector as V
|
||||
<span class="lineno"> 53 </span>import Geom2D.CubicBezier.Linear (ClosedPath (..), CubicBezier (..), FillRule (..),
|
||||
<span class="lineno"> 54 </span> PathJoin (..), QuadBezier (..), arcLength,
|
||||
<span class="lineno"> 55 </span> arcLengthParam, bezierIntersection, bezierSubsegment,
|
||||
<span class="lineno"> 56 </span> closedPathCurves, closest, colinear, curvesToClosed,
|
||||
<span class="lineno"> 57 </span> evalBezier, quadToCubic, reorient, splitBezier, union,
|
||||
<span class="lineno"> 58 </span> vectorDistance)
|
||||
<span class="lineno"> 59 </span>import Graphics.SvgTree (PathCommand (..), RPoint, Tree (..), defaultSvg, pathDefinition)
|
||||
<span class="lineno"> 60 </span>import Linear.V2
|
||||
<span class="lineno"> 61 </span>import Reanimate.Animation
|
||||
<span class="lineno"> 62 </span>import Reanimate.Constants
|
||||
<span class="lineno"> 63 </span>import Reanimate.Math.Polygon (Polygon, mkPolygon, pArea, pIsCCW)
|
||||
<span class="lineno"> 64 </span>import Reanimate.Svg
|
||||
<span class="lineno"> 65 </span>
|
||||
<span class="lineno"> 66 </span>-- | Shape drawn by continuous line. May have overlap, may be convex.
|
||||
<span class="lineno"> 67 </span>newtype PolyShape = PolyShape { <span class="istickedoff"><span class="decl"><span class="istickedoff">unPolyShape</span></span></span> :: ClosedPath Double }
|
||||
<span class="lineno"> 68 </span> deriving (<span class="decl"><span class="nottickedoff">Show</span></span>)
|
||||
<span class="lineno"> 69 </span>
|
||||
<span class="lineno"> 70 </span>-- | Polyshape with smaller, fully-enclosed holes.
|
||||
<span class="lineno"> 71 </span>data PolyShapeWithHoles = PolyShapeWithHoles
|
||||
<span class="lineno"> 72 </span> { <span class="nottickedoff"><span class="decl"><span class="nottickedoff">polyShapeParent</span></span></span> :: PolyShape
|
||||
<span class="lineno"> 73 </span> , <span class="nottickedoff"><span class="decl"><span class="nottickedoff">polyShapeHoles</span></span></span> :: [PolyShape]
|
||||
<span class="lineno"> 74 </span> }
|
||||
<span class="lineno"> 75 </span>
|
||||
<span class="lineno"> 76 </span>
|
||||
<span class="lineno"> 77 </span>renderPolyShapes :: [PolyShape] -> Tree
|
||||
<span class="lineno"> 78 </span><span class="decl"><span class="nottickedoff">renderPolyShapes pls =</span>
|
||||
<span class="lineno"> 79 </span><span class="spaces"> </span><span class="nottickedoff">PathTree $ defaultSvg & pathDefinition .~ concatMap plPathCommands pls</span></span>
|
||||
<span class="lineno"> 80 </span>
|
||||
<span class="lineno"> 81 </span>renderPolyShape :: PolyShape -> Tree
|
||||
<span class="lineno"> 82 </span><span class="decl"><span class="nottickedoff">renderPolyShape pl =</span>
|
||||
<span class="lineno"> 83 </span><span class="spaces"> </span><span class="nottickedoff">PathTree $ defaultSvg & pathDefinition .~ plPathCommands pl</span></span>
|
||||
<span class="lineno"> 84 </span>
|
||||
<span class="lineno"> 85 </span>renderPolyShapePoints :: PolyShape -> Tree
|
||||
<span class="lineno"> 86 </span><span class="decl"><span class="nottickedoff">renderPolyShapePoints = mkGroup . map renderPoint . plCurves</span>
|
||||
<span class="lineno"> 87 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 88 </span><span class="spaces"> </span><span class="nottickedoff">renderPoint (CubicBezier (V2 x y) _ _ _) =</span>
|
||||
<span class="lineno"> 89 </span><span class="spaces"> </span><span class="nottickedoff">translate x y $ mkCircle 0.02</span></span>
|
||||
<span class="lineno"> 90 </span>
|
||||
<span class="lineno"> 91 </span>plLength :: PolyShape -> Double
|
||||
<span class="lineno"> 92 </span><span class="decl"><span class="nottickedoff">plLength = sum . map cubicLength . plCurves</span>
|
||||
<span class="lineno"> 93 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 94 </span><span class="spaces"> </span><span class="nottickedoff">cubicLength c = arcLength c 1 polyShapeTolerance</span></span>
|
||||
<span class="lineno"> 95 </span>
|
||||
<span class="lineno"> 96 </span>plArea :: PolyShape -> Double
|
||||
<span class="lineno"> 97 </span><span class="decl"><span class="nottickedoff">plArea pl = realToFrac $ pArea $ plToPolygon polyShapeTolerance pl</span></span>
|
||||
<span class="lineno"> 98 </span>
|
||||
<span class="lineno"> 99 </span>-- 1/10th of a pixel if rendered at 2560x1440
|
||||
<span class="lineno"> 100 </span>polyShapeTolerance :: Double
|
||||
<span class="lineno"> 101 </span><span class="decl"><span class="nottickedoff">polyShapeTolerance = screenWidth/25600</span></span>
|
||||
<span class="lineno"> 102 </span>
|
||||
<span class="lineno"> 103 </span>plFromPolygon :: [RPoint] -> PolyShape
|
||||
<span class="lineno"> 104 </span><span class="decl"><span class="nottickedoff">plFromPolygon = PolyShape . ClosedPath . map worker</span>
|
||||
<span class="lineno"> 105 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 106 </span><span class="spaces"> </span><span class="nottickedoff">worker val = (val, JoinLine)</span></span>
|
||||
<span class="lineno"> 77 </span>-- | Render a set of polyshapes as a single SVG path.
|
||||
<span class="lineno"> 78 </span>renderPolyShapes :: [PolyShape] -> Tree
|
||||
<span class="lineno"> 79 </span><span class="decl"><span class="nottickedoff">renderPolyShapes pls =</span>
|
||||
<span class="lineno"> 80 </span><span class="spaces"> </span><span class="nottickedoff">PathTree $ defaultSvg & pathDefinition .~ concatMap plPathCommands pls</span></span>
|
||||
<span class="lineno"> 81 </span>
|
||||
<span class="lineno"> 82 </span>-- | Render a polyshape as a single SVG path.
|
||||
<span class="lineno"> 83 </span>renderPolyShape :: PolyShape -> Tree
|
||||
<span class="lineno"> 84 </span><span class="decl"><span class="nottickedoff">renderPolyShape pl =</span>
|
||||
<span class="lineno"> 85 </span><span class="spaces"> </span><span class="nottickedoff">PathTree $ defaultSvg & pathDefinition .~ plPathCommands pl</span></span>
|
||||
<span class="lineno"> 86 </span>
|
||||
<span class="lineno"> 87 </span>-- | Render control-points of a polyshape as circles.
|
||||
<span class="lineno"> 88 </span>renderPolyShapePoints :: PolyShape -> Tree
|
||||
<span class="lineno"> 89 </span><span class="decl"><span class="nottickedoff">renderPolyShapePoints = mkGroup . map renderPoint . plCurves</span>
|
||||
<span class="lineno"> 90 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 91 </span><span class="spaces"> </span><span class="nottickedoff">renderPoint (CubicBezier (V2 x y) _ _ _) =</span>
|
||||
<span class="lineno"> 92 </span><span class="spaces"> </span><span class="nottickedoff">translate x y $ mkCircle 0.02</span></span>
|
||||
<span class="lineno"> 93 </span>
|
||||
<span class="lineno"> 94 </span>-- | Length of polyshape circumference.
|
||||
<span class="lineno"> 95 </span>plLength :: PolyShape -> Double
|
||||
<span class="lineno"> 96 </span><span class="decl"><span class="nottickedoff">plLength = sum . map cubicLength . plCurves</span>
|
||||
<span class="lineno"> 97 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 98 </span><span class="spaces"> </span><span class="nottickedoff">cubicLength c = arcLength c 1 polyShapeTolerance</span></span>
|
||||
<span class="lineno"> 99 </span>
|
||||
<span class="lineno"> 100 </span>-- | Area of polyshape.
|
||||
<span class="lineno"> 101 </span>plArea :: PolyShape -> Double
|
||||
<span class="lineno"> 102 </span><span class="decl"><span class="nottickedoff">plArea pl = realToFrac $ pArea $ plToPolygon polyShapeTolerance pl</span></span>
|
||||
<span class="lineno"> 103 </span>
|
||||
<span class="lineno"> 104 </span>-- 1/10th of a pixel if rendered at 2560x1440
|
||||
<span class="lineno"> 105 </span>polyShapeTolerance :: Double
|
||||
<span class="lineno"> 106 </span><span class="decl"><span class="nottickedoff">polyShapeTolerance = screenWidth/25600</span></span>
|
||||
<span class="lineno"> 107 </span>
|
||||
<span class="lineno"> 108 </span>plToPolygon :: Double -> PolyShape -> Polygon
|
||||
<span class="lineno"> 109 </span><span class="decl"><span class="istickedoff">plToPolygon tol pl =</span>
|
||||
<span class="lineno"> 110 </span><span class="spaces"> </span><span class="istickedoff">let p = V.init . V.fromList . map (fmap realToFrac) .</span>
|
||||
<span class="lineno"> 111 </span><span class="spaces"> </span><span class="istickedoff">plPolygonify tol $ pl</span>
|
||||
<span class="lineno"> 112 </span><span class="spaces"> </span><span class="istickedoff">in if <span class="tickonlyfalse">pIsCCW (mkPolygon p)</span> then <span class="nottickedoff">mkPolygon p</span> else mkPolygon (V.reverse p)</span></span>
|
||||
<span class="lineno"> 108 </span>-- | Construct a polyshape from the vertices in a polygon.
|
||||
<span class="lineno"> 109 </span>plFromPolygon :: [RPoint] -> PolyShape
|
||||
<span class="lineno"> 110 </span><span class="decl"><span class="nottickedoff">plFromPolygon = PolyShape . ClosedPath . map worker</span>
|
||||
<span class="lineno"> 111 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 112 </span><span class="spaces"> </span><span class="nottickedoff">worker val = (val, JoinLine)</span></span>
|
||||
<span class="lineno"> 113 </span>
|
||||
<span class="lineno"> 114 </span>
|
||||
<span class="lineno"> 115 </span>plPartial :: Double -> PolyShape -> PolyShape
|
||||
<span class="lineno"> 116 </span><span class="decl"><span class="nottickedoff">plPartial delta pl | delta >= 1 = pl</span>
|
||||
<span class="lineno"> 117 </span><span class="spaces"></span><span class="nottickedoff">plPartial delta pl = PolyShape $ curvesToClosed (lineOut ++ [joinB] ++ lineIn)</span>
|
||||
<span class="lineno"> 118 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="nottickedoff">lineOutEnd = cubicC3 (last lineOut)</span>
|
||||
<span class="lineno"> 120 </span><span class="spaces"> </span><span class="nottickedoff">lineInBegin = cubicC0 (head lineIn)</span>
|
||||
<span class="lineno"> 121 </span><span class="spaces"> </span><span class="nottickedoff">joinB = CubicBezier lineOutEnd lineOutEnd lineOutEnd lineInBegin</span>
|
||||
<span class="lineno"> 122 </span><span class="spaces"> </span><span class="nottickedoff">lineOut = takeLen (len*delta/2) $ plCurves pl</span>
|
||||
<span class="lineno"> 123 </span><span class="spaces"> </span><span class="nottickedoff">lineIn =</span>
|
||||
<span class="lineno"> 124 </span><span class="spaces"> </span><span class="nottickedoff">reverse $ map reorient $</span>
|
||||
<span class="lineno"> 125 </span><span class="spaces"> </span><span class="nottickedoff">takeLen (len*delta/2) $ reverse $ map reorient $ plCurves pl</span>
|
||||
<span class="lineno"> 126 </span><span class="spaces"> </span><span class="nottickedoff">len = plLength pl</span>
|
||||
<span class="lineno"> 127 </span><span class="spaces"> </span><span class="nottickedoff">takeLen _ [] = []</span>
|
||||
<span class="lineno"> 128 </span><span class="spaces"> </span><span class="nottickedoff">takeLen l (c:cs) =</span>
|
||||
<span class="lineno"> 129 </span><span class="spaces"> </span><span class="nottickedoff">let cLen = arcLength c 1 polyShapeTolerance in</span>
|
||||
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="nottickedoff">if l < cLen</span>
|
||||
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="nottickedoff">then [bezierSubsegment c 0 (arcLengthParam c l polyShapeTolerance)]</span>
|
||||
<span class="lineno"> 132 </span><span class="spaces"> </span><span class="nottickedoff">else c : takeLen (l-cLen) cs</span></span>
|
||||
<span class="lineno"> 133 </span>
|
||||
<span class="lineno"> 134 </span>-- earClip :: Polygon -> Triangulation
|
||||
<span class="lineno"> 135 </span>-- dual :: Triangulation -> Dual
|
||||
<span class="lineno"> 136 </span>-- toPDual :: Polygon -> Dual -> PDual
|
||||
<span class="lineno"> 137 </span>-- pdualReduce :: Polygon -> PDual -> Int -> PDual
|
||||
<span class="lineno"> 138 </span>-- pdualPolygons :: Polygon -> PDual -> [Polygon]
|
||||
<span class="lineno"> 139 </span>splitPolyShape :: Double -> Int -> PolyShape -> [PolyShape]
|
||||
<span class="lineno"> 140 </span><span class="decl"><span class="nottickedoff">splitPolyShape tol n poly =</span>
|
||||
<span class="lineno"> 141 </span><span class="spaces"> </span><span class="nottickedoff">let polygon = toPolygon (plPolygonify tol poly)</span>
|
||||
<span class="lineno"> 142 </span><span class="spaces"> </span><span class="nottickedoff">trig = earClip $ pRing polygon</span>
|
||||
<span class="lineno"> 143 </span><span class="spaces"> </span><span class="nottickedoff">d = dual 0 trig</span>
|
||||
<span class="lineno"> 144 </span><span class="spaces"> </span><span class="nottickedoff">pd = toPDual (pRing polygon) d</span>
|
||||
<span class="lineno"> 145 </span><span class="spaces"> </span><span class="nottickedoff">reduced = pdualReduce (pRing polygon) pd n</span>
|
||||
<span class="lineno"> 146 </span><span class="spaces"> </span><span class="nottickedoff">polygons = pdualPolygons polygon reduced</span>
|
||||
<span class="lineno"> 147 </span><span class="spaces"> </span><span class="nottickedoff">in map toPolyShape polygons</span>
|
||||
<span class="lineno"> 148 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 149 </span><span class="spaces"> </span><span class="nottickedoff">toPolygon :: [RPoint] -> Polygon</span>
|
||||
<span class="lineno"> 150 </span><span class="spaces"> </span><span class="nottickedoff">toPolygon = mkPolygon . V.fromList . nub . map (fmap realToFrac)</span>
|
||||
<span class="lineno"> 151 </span><span class="spaces"> </span><span class="nottickedoff">toPolyShape :: Polygon -> PolyShape</span>
|
||||
<span class="lineno"> 152 </span><span class="spaces"> </span><span class="nottickedoff">toPolyShape = plFromPolygon . map (fmap realToFrac) . V.toList . polygonPoints</span></span>
|
||||
<span class="lineno"> 153 </span>
|
||||
<span class="lineno"> 154 </span>plPartialGroup :: Double -> [PolyShape] -> [PolyShape]
|
||||
<span class="lineno"> 155 </span><span class="decl"><span class="nottickedoff">plPartialGroup _delta [] = []</span>
|
||||
<span class="lineno"> 156 </span><span class="spaces"></span><span class="nottickedoff">plPartialGroup delta pls =</span>
|
||||
<span class="lineno"> 157 </span><span class="spaces"> </span><span class="nottickedoff">[ plPartial (delta*(maxLen/plLength pl)) pl | pl <- pls ]</span>
|
||||
<span class="lineno"> 158 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 159 </span><span class="spaces"> </span><span class="nottickedoff">maxLen = maximum $ map plLength pls</span></span>
|
||||
<span class="lineno"> 114 </span>-- | Approximate a polyshape as a polygon within the given tolerance.
|
||||
<span class="lineno"> 115 </span>plToPolygon :: Double -> PolyShape -> Polygon
|
||||
<span class="lineno"> 116 </span><span class="decl"><span class="istickedoff">plToPolygon tol pl =</span>
|
||||
<span class="lineno"> 117 </span><span class="spaces"> </span><span class="istickedoff">let p = V.init . V.fromList . map (fmap realToFrac) .</span>
|
||||
<span class="lineno"> 118 </span><span class="spaces"> </span><span class="istickedoff">plPolygonify tol $ pl</span>
|
||||
<span class="lineno"> 119 </span><span class="spaces"> </span><span class="istickedoff">in if <span class="tickonlyfalse">pIsCCW (mkPolygon p)</span> then <span class="nottickedoff">mkPolygon p</span> else mkPolygon (V.reverse p)</span></span>
|
||||
<span class="lineno"> 120 </span>
|
||||
<span class="lineno"> 121 </span>-- | Partially draw polyshape.
|
||||
<span class="lineno"> 122 </span>plPartial :: Double -> PolyShape -> PolyShape
|
||||
<span class="lineno"> 123 </span><span class="decl"><span class="nottickedoff">plPartial delta pl | delta >= 1 = pl</span>
|
||||
<span class="lineno"> 124 </span><span class="spaces"></span><span class="nottickedoff">plPartial delta pl = PolyShape $ curvesToClosed (lineOut ++ [joinB] ++ lineIn)</span>
|
||||
<span class="lineno"> 125 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 126 </span><span class="spaces"> </span><span class="nottickedoff">lineOutEnd = cubicC3 (last lineOut)</span>
|
||||
<span class="lineno"> 127 </span><span class="spaces"> </span><span class="nottickedoff">lineInBegin = cubicC0 (head lineIn)</span>
|
||||
<span class="lineno"> 128 </span><span class="spaces"> </span><span class="nottickedoff">joinB = CubicBezier lineOutEnd lineOutEnd lineOutEnd lineInBegin</span>
|
||||
<span class="lineno"> 129 </span><span class="spaces"> </span><span class="nottickedoff">lineOut = takeLen (len*delta/2) $ plCurves pl</span>
|
||||
<span class="lineno"> 130 </span><span class="spaces"> </span><span class="nottickedoff">lineIn =</span>
|
||||
<span class="lineno"> 131 </span><span class="spaces"> </span><span class="nottickedoff">reverse $ map reorient $</span>
|
||||
<span class="lineno"> 132 </span><span class="spaces"> </span><span class="nottickedoff">takeLen (len*delta/2) $ reverse $ map reorient $ plCurves pl</span>
|
||||
<span class="lineno"> 133 </span><span class="spaces"> </span><span class="nottickedoff">len = plLength pl</span>
|
||||
<span class="lineno"> 134 </span><span class="spaces"> </span><span class="nottickedoff">takeLen _ [] = []</span>
|
||||
<span class="lineno"> 135 </span><span class="spaces"> </span><span class="nottickedoff">takeLen l (c:cs) =</span>
|
||||
<span class="lineno"> 136 </span><span class="spaces"> </span><span class="nottickedoff">let cLen = arcLength c 1 polyShapeTolerance in</span>
|
||||
<span class="lineno"> 137 </span><span class="spaces"> </span><span class="nottickedoff">if l < cLen</span>
|
||||
<span class="lineno"> 138 </span><span class="spaces"> </span><span class="nottickedoff">then [bezierSubsegment c 0 (arcLengthParam c l polyShapeTolerance)]</span>
|
||||
<span class="lineno"> 139 </span><span class="spaces"> </span><span class="nottickedoff">else c : takeLen (l-cLen) cs</span></span>
|
||||
<span class="lineno"> 140 </span>
|
||||
<span class="lineno"> 141 </span>-- earClip :: Polygon -> Triangulation
|
||||
<span class="lineno"> 142 </span>-- dual :: Triangulation -> Dual
|
||||
<span class="lineno"> 143 </span>-- toPDual :: Polygon -> Dual -> PDual
|
||||
<span class="lineno"> 144 </span>-- pdualReduce :: Polygon -> PDual -> Int -> PDual
|
||||
<span class="lineno"> 145 </span>-- pdualPolygons :: Polygon -> PDual -> [Polygon]
|
||||
<span class="lineno"> 146 </span>-- splitPolyShape :: Double -> Int -> PolyShape -> [PolyShape]
|
||||
<span class="lineno"> 147 </span>-- splitPolyShape tol n poly =
|
||||
<span class="lineno"> 148 </span>-- let polygon = toPolygon (plPolygonify tol poly)
|
||||
<span class="lineno"> 149 </span>-- trig = triangulate $ pRing polygon
|
||||
<span class="lineno"> 150 </span>-- d = dual 0 trig
|
||||
<span class="lineno"> 151 </span>-- pd = toPDual (pRing polygon) d
|
||||
<span class="lineno"> 152 </span>-- reduced = pdualReduce (pRing polygon) pd n
|
||||
<span class="lineno"> 153 </span>-- polygons = pdualPolygons polygon reduced
|
||||
<span class="lineno"> 154 </span>-- in map toPolyShape polygons
|
||||
<span class="lineno"> 155 </span>-- where
|
||||
<span class="lineno"> 156 </span>-- toPolygon :: [RPoint] -> Polygon
|
||||
<span class="lineno"> 157 </span>-- toPolygon = mkPolygon . V.fromList . nub . map (fmap realToFrac)
|
||||
<span class="lineno"> 158 </span>-- toPolyShape :: Polygon -> PolyShape
|
||||
<span class="lineno"> 159 </span>-- toPolyShape = plFromPolygon . map (fmap realToFrac) . V.toList . polygonPoints
|
||||
<span class="lineno"> 160 </span>
|
||||
<span class="lineno"> 161 </span>plPartial' :: Double -> ([RPoint], PolyShape) -> PolyShape
|
||||
<span class="lineno"> 162 </span><span class="decl"><span class="nottickedoff">plPartial' delta (seen', PolyShape (ClosedPath lst)) =</span>
|
||||
<span class="lineno"> 163 </span><span class="spaces"> </span><span class="nottickedoff">case lst of</span>
|
||||
<span class="lineno"> 164 </span><span class="spaces"> </span><span class="nottickedoff">[] -> PolyShape (ClosedPath [])</span>
|
||||
<span class="lineno"> 165 </span><span class="spaces"> </span><span class="nottickedoff">(startP, startJoin) : rest -> PolyShape $ ClosedPath $</span>
|
||||
<span class="lineno"> 166 </span><span class="spaces"> </span><span class="nottickedoff">(startP, startJoin) : worker startP rest</span>
|
||||
<span class="lineno"> 167 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 168 </span><span class="spaces"> </span><span class="nottickedoff">seen = filter (`elem` plPoints) seen'</span>
|
||||
<span class="lineno"> 169 </span><span class="spaces"> </span><span class="nottickedoff">closestSeen pt = minimumBy (comparing (vectorDistance pt)) seen</span>
|
||||
<span class="lineno"> 170 </span><span class="spaces"> </span><span class="nottickedoff">worker _ [] = []</span>
|
||||
<span class="lineno"> 171 </span><span class="spaces"> </span><span class="nottickedoff">worker _ ((newP, newJoin) : rest)</span>
|
||||
<span class="lineno"> 172 </span><span class="spaces"> </span><span class="nottickedoff">| newP `elem` seen = (newP, newJoin) : worker newP rest</span>
|
||||
<span class="lineno"> 173 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise =</span>
|
||||
<span class="lineno"> 174 </span><span class="spaces"> </span><span class="nottickedoff">let newAt = interpolateVector (closestSeen newP) newP delta</span>
|
||||
<span class="lineno"> 175 </span><span class="spaces"> </span><span class="nottickedoff">in (newAt, newJoin) : worker newAt rest</span>
|
||||
<span class="lineno"> 176 </span><span class="spaces"> </span><span class="nottickedoff">plPoints =</span>
|
||||
<span class="lineno"> 177 </span><span class="spaces"> </span><span class="nottickedoff">[ p | (p,_) <- lst ]</span></span>
|
||||
<span class="lineno"> 161 </span>-- plPartial' :: Double -> ([RPoint], PolyShape) -> PolyShape
|
||||
<span class="lineno"> 162 </span>-- plPartial' delta (seen', PolyShape (ClosedPath lst)) =
|
||||
<span class="lineno"> 163 </span>-- case lst of
|
||||
<span class="lineno"> 164 </span>-- [] -> PolyShape (ClosedPath [])
|
||||
<span class="lineno"> 165 </span>-- (startP, startJoin) : rest -> PolyShape $ ClosedPath $
|
||||
<span class="lineno"> 166 </span>-- (startP, startJoin) : worker startP rest
|
||||
<span class="lineno"> 167 </span>-- where
|
||||
<span class="lineno"> 168 </span>-- seen = filter (`elem` plPoints) seen'
|
||||
<span class="lineno"> 169 </span>-- closestSeen pt = minimumBy (comparing (vectorDistance pt)) seen
|
||||
<span class="lineno"> 170 </span>-- worker _ [] = []
|
||||
<span class="lineno"> 171 </span>-- worker _ ((newP, newJoin) : rest)
|
||||
<span class="lineno"> 172 </span>-- | newP `elem` seen = (newP, newJoin) : worker newP rest
|
||||
<span class="lineno"> 173 </span>-- | otherwise =
|
||||
<span class="lineno"> 174 </span>-- let newAt = interpolateVector (closestSeen newP) newP delta
|
||||
<span class="lineno"> 175 </span>-- in (newAt, newJoin) : worker newAt rest
|
||||
<span class="lineno"> 176 </span>-- plPoints =
|
||||
<span class="lineno"> 177 </span>-- [ p | (p,_) <- lst ]
|
||||
<span class="lineno"> 178 </span>
|
||||
<span class="lineno"> 179 </span>plGroupTouching :: [PolyShape] -> [[([RPoint],PolyShape)]]
|
||||
<span class="lineno"> 180 </span><span class="decl"><span class="nottickedoff">plGroupTouching [] = []</span>
|
||||
<span class="lineno"> 181 </span><span class="spaces"></span><span class="nottickedoff">plGroupTouching pls = worker [polyShapeOrigin (head pls)] pls</span>
|
||||
<span class="lineno"> 182 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 183 </span><span class="spaces"> </span><span class="nottickedoff">worker _ [] = []</span>
|
||||
<span class="lineno"> 184 </span><span class="spaces"> </span><span class="nottickedoff">worker seen shapes =</span>
|
||||
<span class="lineno"> 185 </span><span class="spaces"> </span><span class="nottickedoff">let (touching, notTouching) = partition (isTouching seen) shapes</span>
|
||||
<span class="lineno"> 186 </span><span class="spaces"> </span><span class="nottickedoff">in if null touching</span>
|
||||
<span class="lineno"> 187 </span><span class="spaces"> </span><span class="nottickedoff">then plGroupTouching notTouching</span>
|
||||
<span class="lineno"> 188 </span><span class="spaces"> </span><span class="nottickedoff">else map ((,) seen . changeOrigin seen) touching :</span>
|
||||
<span class="lineno"> 189 </span><span class="spaces"> </span><span class="nottickedoff">worker (seen ++ concatMap plPoints touching) notTouching</span>
|
||||
<span class="lineno"> 190 </span><span class="spaces"> </span><span class="nottickedoff">isTouching pts = any (`elem` pts) . plPoints</span>
|
||||
<span class="lineno"> 191 </span><span class="spaces"> </span><span class="nottickedoff">changeOrigin seen (PolyShape (ClosedPath segments)) = PolyShape $ ClosedPath $ helper [] segments</span>
|
||||
<span class="lineno"> 192 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 193 </span><span class="spaces"> </span><span class="nottickedoff">helper acc [] = reverse acc</span>
|
||||
<span class="lineno"> 194 </span><span class="spaces"> </span><span class="nottickedoff">helper acc lst@((startP,startJ):rest)</span>
|
||||
<span class="lineno"> 195 </span><span class="spaces"> </span><span class="nottickedoff">| startP `elem` seen = lst ++ reverse acc</span>
|
||||
<span class="lineno"> 196 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = helper ((startP, startJ):acc) rest</span>
|
||||
<span class="lineno"> 197 </span><span class="spaces"> </span><span class="nottickedoff">plPoints :: PolyShape -> [RPoint]</span>
|
||||
<span class="lineno"> 198 </span><span class="spaces"> </span><span class="nottickedoff">plPoints (PolyShape (ClosedPath lst)) =</span>
|
||||
<span class="lineno"> 199 </span><span class="spaces"> </span><span class="nottickedoff">[ p | (p,_) <- lst ]</span></span>
|
||||
<span class="lineno"> 200 </span>
|
||||
<span class="lineno"> 201 </span>-- | Deconstruct a polyshape into non-intersecting, convex polygons.
|
||||
<span class="lineno"> 202 </span>plDecompose :: [PolyShape] -> [[RPoint]]
|
||||
<span class="lineno"> 203 </span><span class="decl"><span class="nottickedoff">plDecompose = plDecompose' 0.001</span></span>
|
||||
<span class="lineno"> 204 </span>
|
||||
<span class="lineno"> 205 </span>-- | Deconstruct a polyshape into non-intersecting, convex polygons.
|
||||
<span class="lineno"> 206 </span>plDecompose' :: Double -> [PolyShape] -> [[RPoint]]
|
||||
<span class="lineno"> 207 </span><span class="decl"><span class="nottickedoff">plDecompose' tol =</span>
|
||||
<span class="lineno"> 208 </span><span class="spaces"> </span><span class="nottickedoff">concatMap (decomposePolygon . plPolygonify tol . mergePolyShapeHoles) .</span>
|
||||
<span class="lineno"> 209 </span><span class="spaces"> </span><span class="nottickedoff">plGroupShapes .</span>
|
||||
<span class="lineno"> 210 </span><span class="spaces"> </span><span class="nottickedoff">unionPolyShapes</span></span>
|
||||
<span class="lineno"> 211 </span>
|
||||
<span class="lineno"> 212 </span>decomposePolygon :: [RPoint] -> [[RPoint]]
|
||||
<span class="lineno"> 213 </span><span class="decl"><span class="nottickedoff">decomposePolygon poly =</span>
|
||||
<span class="lineno"> 214 </span><span class="spaces"> </span><span class="nottickedoff">map toPoly $ V.toList $ earcut [ (a,b) | V2 a b <- poly ]</span>
|
||||
<span class="lineno"> 215 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 216 </span><span class="spaces"> </span><span class="nottickedoff">toPoly (a,b,c) = [poly!!a, poly!!b, poly!!c]</span></span>
|
||||
<span class="lineno"> 217 </span>
|
||||
<span class="lineno"> 218 </span>plPolygonify :: Double -> PolyShape -> [RPoint]
|
||||
<span class="lineno"> 219 </span><span class="decl"><span class="istickedoff">plPolygonify tol shape =</span>
|
||||
<span class="lineno"> 220 </span><span class="spaces"> </span><span class="istickedoff">startPoint (head curves) : concatMap worker curves</span>
|
||||
<span class="lineno"> 221 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||
<span class="lineno"> 222 </span><span class="spaces"> </span><span class="istickedoff">curves = plCurves shape</span>
|
||||
<span class="lineno"> 223 </span><span class="spaces"> </span><span class="istickedoff">worker c | <span class="tickonlyfalse">endPoint c == startPoint c</span> =</span>
|
||||
<span class="lineno"> 224 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">[]</span> -- error $ "Bad bezier: " ++ show c</span>
|
||||
<span class="lineno"> 225 </span><span class="spaces"> </span><span class="istickedoff">worker c =</span>
|
||||
<span class="lineno"> 226 </span><span class="spaces"> </span><span class="istickedoff">if colinear c tol -- && arcLength c 1 tol < 1</span>
|
||||
<span class="lineno"> 227 </span><span class="spaces"> </span><span class="istickedoff">then [endPoint c]</span>
|
||||
<span class="lineno"> 228 </span><span class="spaces"> </span><span class="istickedoff">else</span>
|
||||
<span class="lineno"> 229 </span><span class="spaces"> </span><span class="istickedoff">let (lhs,rhs) = splitBezier c 0.5</span>
|
||||
<span class="lineno"> 230 </span><span class="spaces"> </span><span class="istickedoff">in worker lhs ++ worker rhs</span>
|
||||
<span class="lineno"> 231 </span><span class="spaces"> </span><span class="istickedoff">endPoint (CubicBezier _ _ _ d) = d</span>
|
||||
<span class="lineno"> 232 </span><span class="spaces"> </span><span class="istickedoff">startPoint (CubicBezier a _ _ _) = a</span></span>
|
||||
<span class="lineno"> 233 </span>
|
||||
<span class="lineno"> 234 </span>
|
||||
<span class="lineno"> 235 </span>plPathCommands :: PolyShape -> [PathCommand]
|
||||
<span class="lineno"> 236 </span><span class="decl"><span class="nottickedoff">plPathCommands = lineToPath . plLineCommands</span></span>
|
||||
<span class="lineno"> 237 </span>
|
||||
<span class="lineno"> 238 </span>plLineCommands :: PolyShape -> [LineCommand]
|
||||
<span class="lineno"> 239 </span><span class="decl"><span class="nottickedoff">plLineCommands pl =</span>
|
||||
<span class="lineno"> 240 </span><span class="spaces"> </span><span class="nottickedoff">case curves of</span>
|
||||
<span class="lineno"> 241 </span><span class="spaces"> </span><span class="nottickedoff">[] -> []</span>
|
||||
<span class="lineno"> 242 </span><span class="spaces"> </span><span class="nottickedoff">(CubicBezier start _ _ _:_) -></span>
|
||||
<span class="lineno"> 243 </span><span class="spaces"> </span><span class="nottickedoff">LineMove start :</span>
|
||||
<span class="lineno"> 244 </span><span class="spaces"> </span><span class="nottickedoff">zipWith worker (drop 1 dstList ++ [start]) joinList ++</span>
|
||||
<span class="lineno"> 245 </span><span class="spaces"> </span><span class="nottickedoff">[LineEnd start]</span>
|
||||
<span class="lineno"> 246 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 247 </span><span class="spaces"> </span><span class="nottickedoff">ClosedPath closedPath = unPolyShape pl</span>
|
||||
<span class="lineno"> 248 </span><span class="spaces"> </span><span class="nottickedoff">(dstList, joinList) = unzip closedPath</span>
|
||||
<span class="lineno"> 249 </span><span class="spaces"> </span><span class="nottickedoff">curves = plCurves pl</span>
|
||||
<span class="lineno"> 250 </span><span class="spaces"> </span><span class="nottickedoff">worker dst JoinLine =</span>
|
||||
<span class="lineno"> 251 </span><span class="spaces"> </span><span class="nottickedoff">LineBezier [dst]</span>
|
||||
<span class="lineno"> 252 </span><span class="spaces"> </span><span class="nottickedoff">worker dst (JoinCurve a b) =</span>
|
||||
<span class="lineno"> 253 </span><span class="spaces"> </span><span class="nottickedoff">LineBezier [a,b,dst]</span></span>
|
||||
<span class="lineno"> 254 </span>
|
||||
<span class="lineno"> 255 </span>svgToPolyShapes :: Tree -> [PolyShape]
|
||||
<span class="lineno"> 256 </span><span class="decl"><span class="istickedoff">svgToPolyShapes = cmdsToPolyShapes . toLineCommands . extractPath</span></span>
|
||||
<span class="lineno"> 257 </span>
|
||||
<span class="lineno"> 258 </span>svgToPolygons :: Double -> SVG -> [Polygon]
|
||||
<span class="lineno"> 259 </span><span class="decl"><span class="nottickedoff">svgToPolygons tol = map (toPolygon . plPolygonify tol) . svgToPolyShapes</span>
|
||||
<span class="lineno"> 260 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 261 </span><span class="spaces"> </span><span class="nottickedoff">toPolygon :: [RPoint] -> Polygon</span>
|
||||
<span class="lineno"> 262 </span><span class="spaces"> </span><span class="nottickedoff">toPolygon = mkPolygon .</span>
|
||||
<span class="lineno"> 263 </span><span class="spaces"> </span><span class="nottickedoff">V.fromList . nub . map (fmap realToFrac)</span></span>
|
||||
<span class="lineno"> 179 </span>-- | Find intersection points.
|
||||
<span class="lineno"> 180 </span>plGroupTouching :: [PolyShape] -> [[([RPoint],PolyShape)]]
|
||||
<span class="lineno"> 181 </span><span class="decl"><span class="nottickedoff">plGroupTouching [] = []</span>
|
||||
<span class="lineno"> 182 </span><span class="spaces"></span><span class="nottickedoff">plGroupTouching pls = worker [polyShapeOrigin (head pls)] pls</span>
|
||||
<span class="lineno"> 183 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 184 </span><span class="spaces"> </span><span class="nottickedoff">worker _ [] = []</span>
|
||||
<span class="lineno"> 185 </span><span class="spaces"> </span><span class="nottickedoff">worker seen shapes =</span>
|
||||
<span class="lineno"> 186 </span><span class="spaces"> </span><span class="nottickedoff">let (touching, notTouching) = partition (isTouching seen) shapes</span>
|
||||
<span class="lineno"> 187 </span><span class="spaces"> </span><span class="nottickedoff">in if null touching</span>
|
||||
<span class="lineno"> 188 </span><span class="spaces"> </span><span class="nottickedoff">then plGroupTouching notTouching</span>
|
||||
<span class="lineno"> 189 </span><span class="spaces"> </span><span class="nottickedoff">else map ((,) seen . changeOrigin seen) touching :</span>
|
||||
<span class="lineno"> 190 </span><span class="spaces"> </span><span class="nottickedoff">worker (seen ++ concatMap plPoints touching) notTouching</span>
|
||||
<span class="lineno"> 191 </span><span class="spaces"> </span><span class="nottickedoff">isTouching pts = any (`elem` pts) . plPoints</span>
|
||||
<span class="lineno"> 192 </span><span class="spaces"> </span><span class="nottickedoff">changeOrigin seen (PolyShape (ClosedPath segments)) = PolyShape $ ClosedPath $ helper [] segments</span>
|
||||
<span class="lineno"> 193 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 194 </span><span class="spaces"> </span><span class="nottickedoff">helper acc [] = reverse acc</span>
|
||||
<span class="lineno"> 195 </span><span class="spaces"> </span><span class="nottickedoff">helper acc lst@((startP,startJ):rest)</span>
|
||||
<span class="lineno"> 196 </span><span class="spaces"> </span><span class="nottickedoff">| startP `elem` seen = lst ++ reverse acc</span>
|
||||
<span class="lineno"> 197 </span><span class="spaces"> </span><span class="nottickedoff">| otherwise = helper ((startP, startJ):acc) rest</span>
|
||||
<span class="lineno"> 198 </span><span class="spaces"> </span><span class="nottickedoff">plPoints :: PolyShape -> [RPoint]</span>
|
||||
<span class="lineno"> 199 </span><span class="spaces"> </span><span class="nottickedoff">plPoints (PolyShape (ClosedPath lst)) =</span>
|
||||
<span class="lineno"> 200 </span><span class="spaces"> </span><span class="nottickedoff">[ p | (p,_) <- lst ]</span></span>
|
||||
<span class="lineno"> 201 </span>
|
||||
<span class="lineno"> 202 </span>-- | Deconstruct a polyshape into non-intersecting, convex polygons.
|
||||
<span class="lineno"> 203 </span>plDecompose :: [PolyShape] -> [[RPoint]]
|
||||
<span class="lineno"> 204 </span><span class="decl"><span class="nottickedoff">plDecompose = plDecompose' 0.001</span></span>
|
||||
<span class="lineno"> 205 </span>
|
||||
<span class="lineno"> 206 </span>-- | Deconstruct a polyshape into non-intersecting, convex polygons.
|
||||
<span class="lineno"> 207 </span>plDecompose' :: Double -> [PolyShape] -> [[RPoint]]
|
||||
<span class="lineno"> 208 </span><span class="decl"><span class="nottickedoff">plDecompose' tol =</span>
|
||||
<span class="lineno"> 209 </span><span class="spaces"> </span><span class="nottickedoff">concatMap (decomposePolygon . plPolygonify tol . mergePolyShapeHoles) .</span>
|
||||
<span class="lineno"> 210 </span><span class="spaces"> </span><span class="nottickedoff">plGroupShapes .</span>
|
||||
<span class="lineno"> 211 </span><span class="spaces"> </span><span class="nottickedoff">unionPolyShapes</span></span>
|
||||
<span class="lineno"> 212 </span>
|
||||
<span class="lineno"> 213 </span>-- | Split polygon into smaller, convex polygons.
|
||||
<span class="lineno"> 214 </span>decomposePolygon :: [RPoint] -> [[RPoint]]
|
||||
<span class="lineno"> 215 </span><span class="decl"><span class="nottickedoff">decomposePolygon poly =</span>
|
||||
<span class="lineno"> 216 </span><span class="spaces"> </span><span class="nottickedoff">[ [ V2 x y</span>
|
||||
<span class="lineno"> 217 </span><span class="spaces"> </span><span class="nottickedoff">| v <- V.toList (Geo.boundaryVertices f pg)</span>
|
||||
<span class="lineno"> 218 </span><span class="spaces"> </span><span class="nottickedoff">, let Geo.Point2 x y =(pg^.Geo.vertexDataOf v) ^. Geo.location ]</span>
|
||||
<span class="lineno"> 219 </span><span class="spaces"> </span><span class="nottickedoff">| (f, Inside) <- V.toList (Geo.internalFaces pg) ]</span>
|
||||
<span class="lineno"> 220 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||
<span class="lineno"> 221 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 222 </span><span class="spaces"> </span><span class="nottickedoff">pg = triangulate' Proxy p</span>
|
||||
<span class="lineno"> 223 </span><span class="spaces"> </span><span class="nottickedoff">p = Geo.fromPoints $</span>
|
||||
<span class="lineno"> 224 </span><span class="spaces"> </span><span class="nottickedoff">[ Geo.Point2 x y :+ ()</span>
|
||||
<span class="lineno"> 225 </span><span class="spaces"> </span><span class="nottickedoff">| V2 x y <- poly ]</span></span>
|
||||
<span class="lineno"> 226 </span>
|
||||
<span class="lineno"> 227 </span>plPolygonify :: Double -> PolyShape -> [RPoint]
|
||||
<span class="lineno"> 228 </span><span class="decl"><span class="istickedoff">plPolygonify tol shape =</span>
|
||||
<span class="lineno"> 229 </span><span class="spaces"> </span><span class="istickedoff">startPoint (head curves) : concatMap worker curves</span>
|
||||
<span class="lineno"> 230 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||
<span class="lineno"> 231 </span><span class="spaces"> </span><span class="istickedoff">curves = plCurves shape</span>
|
||||
<span class="lineno"> 232 </span><span class="spaces"> </span><span class="istickedoff">worker c | <span class="tickonlyfalse">endPoint c == startPoint c</span> =</span>
|
||||
<span class="lineno"> 233 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">[]</span> -- error $ "Bad bezier: " ++ show c</span>
|
||||
<span class="lineno"> 234 </span><span class="spaces"> </span><span class="istickedoff">worker c =</span>
|
||||
<span class="lineno"> 235 </span><span class="spaces"> </span><span class="istickedoff">if colinear c tol -- && arcLength c 1 tol < 1</span>
|
||||
<span class="lineno"> 236 </span><span class="spaces"> </span><span class="istickedoff">then [endPoint c]</span>
|
||||
<span class="lineno"> 237 </span><span class="spaces"> </span><span class="istickedoff">else</span>
|
||||
<span class="lineno"> 238 </span><span class="spaces"> </span><span class="istickedoff">let (lhs,rhs) = splitBezier c 0.5</span>
|
||||
<span class="lineno"> 239 </span><span class="spaces"> </span><span class="istickedoff">in worker lhs ++ worker rhs</span>
|
||||
<span class="lineno"> 240 </span><span class="spaces"> </span><span class="istickedoff">endPoint (CubicBezier _ _ _ d) = d</span>
|
||||
<span class="lineno"> 241 </span><span class="spaces"> </span><span class="istickedoff">startPoint (CubicBezier a _ _ _) = a</span></span>
|
||||
<span class="lineno"> 242 </span>
|
||||
<span class="lineno"> 243 </span>-- | Convert a polyshape to a list of SVG path commands.
|
||||
<span class="lineno"> 244 </span>plPathCommands :: PolyShape -> [PathCommand]
|
||||
<span class="lineno"> 245 </span><span class="decl"><span class="nottickedoff">plPathCommands = lineToPath . plLineCommands</span></span>
|
||||
<span class="lineno"> 246 </span>
|
||||
<span class="lineno"> 247 </span>-- | Convert a polyshape to a list of line commands.
|
||||
<span class="lineno"> 248 </span>plLineCommands :: PolyShape -> [LineCommand]
|
||||
<span class="lineno"> 249 </span><span class="decl"><span class="nottickedoff">plLineCommands pl =</span>
|
||||
<span class="lineno"> 250 </span><span class="spaces"> </span><span class="nottickedoff">case curves of</span>
|
||||
<span class="lineno"> 251 </span><span class="spaces"> </span><span class="nottickedoff">[] -> []</span>
|
||||
<span class="lineno"> 252 </span><span class="spaces"> </span><span class="nottickedoff">(CubicBezier start _ _ _:_) -></span>
|
||||
<span class="lineno"> 253 </span><span class="spaces"> </span><span class="nottickedoff">LineMove start :</span>
|
||||
<span class="lineno"> 254 </span><span class="spaces"> </span><span class="nottickedoff">zipWith worker (drop 1 dstList ++ [start]) joinList ++</span>
|
||||
<span class="lineno"> 255 </span><span class="spaces"> </span><span class="nottickedoff">[LineEnd start]</span>
|
||||
<span class="lineno"> 256 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 257 </span><span class="spaces"> </span><span class="nottickedoff">ClosedPath closedPath = unPolyShape pl</span>
|
||||
<span class="lineno"> 258 </span><span class="spaces"> </span><span class="nottickedoff">(dstList, joinList) = unzip closedPath</span>
|
||||
<span class="lineno"> 259 </span><span class="spaces"> </span><span class="nottickedoff">curves = plCurves pl</span>
|
||||
<span class="lineno"> 260 </span><span class="spaces"> </span><span class="nottickedoff">worker dst JoinLine =</span>
|
||||
<span class="lineno"> 261 </span><span class="spaces"> </span><span class="nottickedoff">LineBezier [dst]</span>
|
||||
<span class="lineno"> 262 </span><span class="spaces"> </span><span class="nottickedoff">worker dst (JoinCurve a b) =</span>
|
||||
<span class="lineno"> 263 </span><span class="spaces"> </span><span class="nottickedoff">LineBezier [a,b,dst]</span></span>
|
||||
<span class="lineno"> 264 </span>
|
||||
<span class="lineno"> 265 </span>cmdsToPolyShapes :: [LineCommand] -> [PolyShape]
|
||||
<span class="lineno"> 266 </span><span class="decl"><span class="istickedoff">cmdsToPolyShapes [] = <span class="nottickedoff">[]</span></span>
|
||||
<span class="lineno"> 267 </span><span class="spaces"></span><span class="istickedoff">cmdsToPolyShapes cmds =</span>
|
||||
<span class="lineno"> 268 </span><span class="spaces"> </span><span class="istickedoff">case cmds of</span>
|
||||
<span class="lineno"> 269 </span><span class="spaces"> </span><span class="istickedoff">(LineMove dst:cont) -> map PolyShape $ worker dst [] cont</span>
|
||||
<span class="lineno"> 270 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">bad</span></span>
|
||||
<span class="lineno"> 271 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||
<span class="lineno"> 272 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">bad = error $ "Reanimate.PolyShape: Invalid commands: " ++ show cmds</span></span>
|
||||
<span class="lineno"> 273 </span><span class="spaces"> </span><span class="istickedoff">finalize [] rest = <span class="nottickedoff">rest</span></span>
|
||||
<span class="lineno"> 274 </span><span class="spaces"> </span><span class="istickedoff">finalize acc rest = ClosedPath (reverse acc) : rest</span>
|
||||
<span class="lineno"> 275 </span><span class="spaces"> </span><span class="istickedoff">worker _from acc [] = <span class="nottickedoff">finalize acc []</span></span>
|
||||
<span class="lineno"> 276 </span><span class="spaces"> </span><span class="istickedoff">worker _from acc (LineMove newStart : xs) =</span>
|
||||
<span class="lineno"> 277 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">finalize acc $</span></span>
|
||||
<span class="lineno"> 278 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">worker newStart [] xs</span></span>
|
||||
<span class="lineno"> 279 </span><span class="spaces"> </span><span class="istickedoff">worker from acc (LineEnd orig:LineMove dst:xs) | <span class="nottickedoff">from /= orig</span> =</span>
|
||||
<span class="lineno"> 280 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">finalize ((from, JoinLine):acc) $</span></span>
|
||||
<span class="lineno"> 281 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">worker dst [] xs</span></span>
|
||||
<span class="lineno"> 282 </span><span class="spaces"> </span><span class="istickedoff">worker _from acc (LineEnd{}:LineMove dst:xs) =</span>
|
||||
<span class="lineno"> 283 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">finalize acc $</span></span>
|
||||
<span class="lineno"> 284 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">worker dst [] xs</span></span>
|
||||
<span class="lineno"> 285 </span><span class="spaces"> </span><span class="istickedoff">worker from acc [LineEnd orig] | <span class="tickonlytrue">from /= orig</span> =</span>
|
||||
<span class="lineno"> 286 </span><span class="spaces"> </span><span class="istickedoff">finalize ((from, JoinLine):acc) []</span>
|
||||
<span class="lineno"> 287 </span><span class="spaces"> </span><span class="istickedoff">worker _from acc [LineEnd{}] =</span>
|
||||
<span class="lineno"> 288 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">finalize acc []</span></span>
|
||||
<span class="lineno"> 289 </span><span class="spaces"> </span><span class="istickedoff">worker from acc (LineBezier [x]:xs) =</span>
|
||||
<span class="lineno"> 290 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">worker x ((from, JoinLine) : acc) xs</span></span>
|
||||
<span class="lineno"> 291 </span><span class="spaces"> </span><span class="istickedoff">worker from acc (LineBezier [a,b]:xs) =</span>
|
||||
<span class="lineno"> 292 </span><span class="spaces"> </span><span class="istickedoff">let quad = QuadBezier from a b</span>
|
||||
<span class="lineno"> 293 </span><span class="spaces"> </span><span class="istickedoff">CubicBezier _ a' b' c' = quadToCubic quad</span>
|
||||
<span class="lineno"> 294 </span><span class="spaces"> </span><span class="istickedoff">in worker from acc (LineBezier [a',b',c']:xs)</span>
|
||||
<span class="lineno"> 295 </span><span class="spaces"> </span><span class="istickedoff">worker from acc (LineBezier [a,b,c]:xs) =</span>
|
||||
<span class="lineno"> 296 </span><span class="spaces"> </span><span class="istickedoff">worker c ((from, JoinCurve a b) : acc) xs</span>
|
||||
<span class="lineno"> 297 </span><span class="spaces"> </span><span class="istickedoff">worker _ _ _ = <span class="nottickedoff">bad</span></span></span>
|
||||
<span class="lineno"> 298 </span>
|
||||
<span class="lineno"> 299 </span>unionPolyShapes :: [PolyShape] -> [PolyShape]
|
||||
<span class="lineno"> 300 </span><span class="decl"><span class="nottickedoff">unionPolyShapes shapes =</span>
|
||||
<span class="lineno"> 301 </span><span class="spaces"> </span><span class="nottickedoff">map PolyShape $</span>
|
||||
<span class="lineno"> 302 </span><span class="spaces"> </span><span class="nottickedoff">union (map unPolyShape shapes) NonZero (polyShapeTolerance/10000)</span></span>
|
||||
<span class="lineno"> 303 </span>
|
||||
<span class="lineno"> 304 </span>unionPolyShapes' :: Double -> [PolyShape] -> [PolyShape]
|
||||
<span class="lineno"> 305 </span><span class="decl"><span class="nottickedoff">unionPolyShapes' tol shapes =</span>
|
||||
<span class="lineno"> 306 </span><span class="spaces"> </span><span class="nottickedoff">map PolyShape $</span>
|
||||
<span class="lineno"> 307 </span><span class="spaces"> </span><span class="nottickedoff">union (map unPolyShape shapes) NonZero tol</span></span>
|
||||
<span class="lineno"> 308 </span>
|
||||
<span class="lineno"> 309 </span>-- True iff lhs is inside of rhs.
|
||||
<span class="lineno"> 310 </span>-- lhs and rhs may not overlap.
|
||||
<span class="lineno"> 311 </span>-- Implementation: Trace a vertical line through the origin of A and check
|
||||
<span class="lineno"> 312 </span>-- of this line intersects and odd number of times on both sides of A.
|
||||
<span class="lineno"> 313 </span>isInsideOf :: PolyShape -> PolyShape -> Bool
|
||||
<span class="lineno"> 314 </span><span class="decl"><span class="nottickedoff">lhs `isInsideOf` rhs =</span>
|
||||
<span class="lineno"> 315 </span><span class="spaces"> </span><span class="nottickedoff">odd (length upHits) && odd (length downHits)</span>
|
||||
<span class="lineno"> 316 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 317 </span><span class="spaces"> </span><span class="nottickedoff">(upHits, downHits) = polyIntersections origin rhs</span>
|
||||
<span class="lineno"> 318 </span><span class="spaces"> </span><span class="nottickedoff">origin = polyShapeOrigin lhs</span></span>
|
||||
<span class="lineno"> 319 </span>
|
||||
<span class="lineno"> 320 </span>polyIntersections :: RPoint -> PolyShape -> ([RPoint],[RPoint])
|
||||
<span class="lineno"> 321 </span><span class="decl"><span class="nottickedoff">polyIntersections origin rhs =</span>
|
||||
<span class="lineno"> 322 </span><span class="spaces"> </span><span class="nottickedoff">(nub $ concatMap (intersections rayUp) curves</span>
|
||||
<span class="lineno"> 323 </span><span class="spaces"> </span><span class="nottickedoff">,nub $ concatMap (intersections rayDown) curves)</span>
|
||||
<span class="lineno"> 324 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 325 </span><span class="spaces"> </span><span class="nottickedoff">curves = plCurves rhs</span>
|
||||
<span class="lineno"> 326 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||
<span class="lineno"> 327 </span><span class="spaces"> </span><span class="nottickedoff">intersections line bs =</span>
|
||||
<span class="lineno"> 328 </span><span class="spaces"> </span><span class="nottickedoff">map (evalBezier bs . fst) (bezierIntersection bs line polyShapeTolerance)</span>
|
||||
<span class="lineno"> 329 </span><span class="spaces"> </span><span class="nottickedoff">limit = 1000</span>
|
||||
<span class="lineno"> 330 </span><span class="spaces"> </span><span class="nottickedoff">rayUp = CubicBezier origin origin origin (V2 limit limit)</span>
|
||||
<span class="lineno"> 331 </span><span class="spaces"> </span><span class="nottickedoff">rayDown = CubicBezier origin origin origin (V2 (-limit) (-limit))</span></span>
|
||||
<span class="lineno"> 332 </span>
|
||||
<span class="lineno"> 333 </span>polyShapeOrigin :: PolyShape -> V2 Double
|
||||
<span class="lineno"> 334 </span><span class="decl"><span class="nottickedoff">polyShapeOrigin (PolyShape closedPath) =</span>
|
||||
<span class="lineno"> 335 </span><span class="spaces"> </span><span class="nottickedoff">case closedPath of</span>
|
||||
<span class="lineno"> 336 </span><span class="spaces"> </span><span class="nottickedoff">ClosedPath [] -> V2 0 0</span>
|
||||
<span class="lineno"> 337 </span><span class="spaces"> </span><span class="nottickedoff">ClosedPath ((start,_):_) -> start</span></span>
|
||||
<span class="lineno"> 338 </span>
|
||||
<span class="lineno"> 339 </span>plGroupShapes :: [PolyShape] -> [PolyShapeWithHoles]
|
||||
<span class="lineno"> 340 </span><span class="decl"><span class="istickedoff">plGroupShapes = worker</span>
|
||||
<span class="lineno"> 341 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||
<span class="lineno"> 342 </span><span class="spaces"> </span><span class="istickedoff">worker (s:rest)</span>
|
||||
<span class="lineno"> 343 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">null (parents <span class="nottickedoff">s</span> rest)</span> =</span>
|
||||
<span class="lineno"> 344 </span><span class="spaces"> </span><span class="istickedoff">let <span class="nottickedoff">isOnlyChild x = parents x (s:rest) == [s]</span></span>
|
||||
<span class="lineno"> 345 </span><span class="spaces"> </span><span class="istickedoff">(holes, nonHoles) = partition <span class="nottickedoff">isOnlyChild</span> rest</span>
|
||||
<span class="lineno"> 346 </span><span class="spaces"> </span><span class="istickedoff">prime = PolyShapeWithHoles</span>
|
||||
<span class="lineno"> 347 </span><span class="spaces"> </span><span class="istickedoff">{ polyShapeParent = s</span>
|
||||
<span class="lineno"> 348 </span><span class="spaces"> </span><span class="istickedoff">, polyShapeHoles = holes }</span>
|
||||
<span class="lineno"> 349 </span><span class="spaces"> </span><span class="istickedoff">in prime : worker nonHoles</span>
|
||||
<span class="lineno"> 350 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">otherwise</span> = <span class="nottickedoff">worker (rest ++ [s])</span></span>
|
||||
<span class="lineno"> 351 </span><span class="spaces"> </span><span class="istickedoff">worker [] = []</span>
|
||||
<span class="lineno"> 352 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||
<span class="lineno"> 353 </span><span class="spaces"> </span><span class="istickedoff">parents :: PolyShape -> [PolyShape] -> [PolyShape]</span>
|
||||
<span class="lineno"> 354 </span><span class="spaces"> </span><span class="istickedoff">parents self = filter <span class="nottickedoff">(self `isInsideOf`)</span> . filter <span class="nottickedoff">(/=self)</span></span></span>
|
||||
<span class="lineno"> 355 </span>
|
||||
<span class="lineno"> 356 </span>instance Eq PolyShape where
|
||||
<span class="lineno"> 357 </span> <span class="decl"><span class="nottickedoff">a == b = plCurves a == plCurves b</span></span>
|
||||
<span class="lineno"> 358 </span>
|
||||
<span class="lineno"> 359 </span>mergePolyShapeHoles :: PolyShapeWithHoles -> PolyShape
|
||||
<span class="lineno"> 360 </span><span class="decl"><span class="istickedoff">mergePolyShapeHoles (PolyShapeWithHoles parent []) = parent</span>
|
||||
<span class="lineno"> 361 </span><span class="spaces"></span><span class="istickedoff">mergePolyShapeHoles (PolyShapeWithHoles parent (child:children)) =</span>
|
||||
<span class="lineno"> 362 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">mergePolyShapeHoles $</span></span>
|
||||
<span class="lineno"> 363 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">PolyShapeWithHoles (mergePolyShapeHole parent child) children</span></span></span>
|
||||
<span class="lineno"> 364 </span>
|
||||
<span class="lineno"> 365 </span>-- Merge
|
||||
<span class="lineno"> 366 </span>mergePolyShapeHole :: PolyShape -> PolyShape -> PolyShape
|
||||
<span class="lineno"> 367 </span><span class="decl"><span class="nottickedoff">mergePolyShapeHole parent child =</span>
|
||||
<span class="lineno"> 368 </span><span class="spaces"> </span><span class="nottickedoff">snd $ head $</span>
|
||||
<span class="lineno"> 369 </span><span class="spaces"> </span><span class="nottickedoff">sortOn fst</span>
|
||||
<span class="lineno"> 370 </span><span class="spaces"> </span><span class="nottickedoff">[ cutSingleHole newParent child</span>
|
||||
<span class="lineno"> 371 </span><span class="spaces"> </span><span class="nottickedoff">| newParent <- polyShapePermutations parent ]</span></span>
|
||||
<span class="lineno"> 265 </span>-- | Extract all shapes from SVG nodes. Drawing attributes such
|
||||
<span class="lineno"> 266 </span>-- as stroke and fill color are discarded.
|
||||
<span class="lineno"> 267 </span>svgToPolyShapes :: Tree -> [PolyShape]
|
||||
<span class="lineno"> 268 </span><span class="decl"><span class="istickedoff">svgToPolyShapes = cmdsToPolyShapes . toLineCommands . extractPath</span></span>
|
||||
<span class="lineno"> 269 </span>
|
||||
<span class="lineno"> 270 </span>-- | Extract all polygons from SVG nodes. Curves are approximated to
|
||||
<span class="lineno"> 271 </span>-- within the given tolerance.
|
||||
<span class="lineno"> 272 </span>svgToPolygons :: Double -> SVG -> [Polygon]
|
||||
<span class="lineno"> 273 </span><span class="decl"><span class="nottickedoff">svgToPolygons tol = map (toPolygon . plPolygonify tol) . svgToPolyShapes</span>
|
||||
<span class="lineno"> 274 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 275 </span><span class="spaces"> </span><span class="nottickedoff">toPolygon :: [RPoint] -> Polygon</span>
|
||||
<span class="lineno"> 276 </span><span class="spaces"> </span><span class="nottickedoff">toPolygon = mkPolygon .</span>
|
||||
<span class="lineno"> 277 </span><span class="spaces"> </span><span class="nottickedoff">V.fromList . nub . map (fmap realToFrac)</span></span>
|
||||
<span class="lineno"> 278 </span>
|
||||
<span class="lineno"> 279 </span>cmdsToPolyShapes :: [LineCommand] -> [PolyShape]
|
||||
<span class="lineno"> 280 </span><span class="decl"><span class="istickedoff">cmdsToPolyShapes [] = <span class="nottickedoff">[]</span></span>
|
||||
<span class="lineno"> 281 </span><span class="spaces"></span><span class="istickedoff">cmdsToPolyShapes cmds =</span>
|
||||
<span class="lineno"> 282 </span><span class="spaces"> </span><span class="istickedoff">case cmds of</span>
|
||||
<span class="lineno"> 283 </span><span class="spaces"> </span><span class="istickedoff">(LineMove dst:cont) -> map PolyShape $ worker dst [] cont</span>
|
||||
<span class="lineno"> 284 </span><span class="spaces"> </span><span class="istickedoff">_ -> <span class="nottickedoff">bad</span></span>
|
||||
<span class="lineno"> 285 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||
<span class="lineno"> 286 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">bad = error $ "Reanimate.PolyShape: Invalid commands: " ++ show cmds</span></span>
|
||||
<span class="lineno"> 287 </span><span class="spaces"> </span><span class="istickedoff">finalize [] rest = <span class="nottickedoff">rest</span></span>
|
||||
<span class="lineno"> 288 </span><span class="spaces"> </span><span class="istickedoff">finalize acc rest = ClosedPath (reverse acc) : rest</span>
|
||||
<span class="lineno"> 289 </span><span class="spaces"> </span><span class="istickedoff">worker _from acc [] = <span class="nottickedoff">finalize acc []</span></span>
|
||||
<span class="lineno"> 290 </span><span class="spaces"> </span><span class="istickedoff">worker _from acc (LineMove newStart : xs) =</span>
|
||||
<span class="lineno"> 291 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">finalize acc $</span></span>
|
||||
<span class="lineno"> 292 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">worker newStart [] xs</span></span>
|
||||
<span class="lineno"> 293 </span><span class="spaces"> </span><span class="istickedoff">worker from acc (LineEnd orig:LineMove dst:xs) | <span class="nottickedoff">from /= orig</span> =</span>
|
||||
<span class="lineno"> 294 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">finalize ((from, JoinLine):acc) $</span></span>
|
||||
<span class="lineno"> 295 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">worker dst [] xs</span></span>
|
||||
<span class="lineno"> 296 </span><span class="spaces"> </span><span class="istickedoff">worker _from acc (LineEnd{}:LineMove dst:xs) =</span>
|
||||
<span class="lineno"> 297 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">finalize acc $</span></span>
|
||||
<span class="lineno"> 298 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">worker dst [] xs</span></span>
|
||||
<span class="lineno"> 299 </span><span class="spaces"> </span><span class="istickedoff">worker from acc [LineEnd orig] | <span class="tickonlytrue">from /= orig</span> =</span>
|
||||
<span class="lineno"> 300 </span><span class="spaces"> </span><span class="istickedoff">finalize ((from, JoinLine):acc) []</span>
|
||||
<span class="lineno"> 301 </span><span class="spaces"> </span><span class="istickedoff">worker _from acc [LineEnd{}] =</span>
|
||||
<span class="lineno"> 302 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">finalize acc []</span></span>
|
||||
<span class="lineno"> 303 </span><span class="spaces"> </span><span class="istickedoff">worker from acc (LineBezier [x]:xs) =</span>
|
||||
<span class="lineno"> 304 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">worker x ((from, JoinLine) : acc) xs</span></span>
|
||||
<span class="lineno"> 305 </span><span class="spaces"> </span><span class="istickedoff">worker from acc (LineBezier [a,b]:xs) =</span>
|
||||
<span class="lineno"> 306 </span><span class="spaces"> </span><span class="istickedoff">let quad = QuadBezier from a b</span>
|
||||
<span class="lineno"> 307 </span><span class="spaces"> </span><span class="istickedoff">CubicBezier _ a' b' c' = quadToCubic quad</span>
|
||||
<span class="lineno"> 308 </span><span class="spaces"> </span><span class="istickedoff">in worker from acc (LineBezier [a',b',c']:xs)</span>
|
||||
<span class="lineno"> 309 </span><span class="spaces"> </span><span class="istickedoff">worker from acc (LineBezier [a,b,c]:xs) =</span>
|
||||
<span class="lineno"> 310 </span><span class="spaces"> </span><span class="istickedoff">worker c ((from, JoinCurve a b) : acc) xs</span>
|
||||
<span class="lineno"> 311 </span><span class="spaces"> </span><span class="istickedoff">worker _ _ _ = <span class="nottickedoff">bad</span></span></span>
|
||||
<span class="lineno"> 312 </span>
|
||||
<span class="lineno"> 313 </span>-- | Merge overlapping shapes.
|
||||
<span class="lineno"> 314 </span>unionPolyShapes :: [PolyShape] -> [PolyShape]
|
||||
<span class="lineno"> 315 </span><span class="decl"><span class="nottickedoff">unionPolyShapes shapes =</span>
|
||||
<span class="lineno"> 316 </span><span class="spaces"> </span><span class="nottickedoff">map PolyShape $</span>
|
||||
<span class="lineno"> 317 </span><span class="spaces"> </span><span class="nottickedoff">union (map unPolyShape shapes) NonZero (polyShapeTolerance/10000)</span></span>
|
||||
<span class="lineno"> 318 </span>
|
||||
<span class="lineno"> 319 </span>-- | Merge overlapping shapes to within given tolerance.
|
||||
<span class="lineno"> 320 </span>unionPolyShapes' :: Double -> [PolyShape] -> [PolyShape]
|
||||
<span class="lineno"> 321 </span><span class="decl"><span class="nottickedoff">unionPolyShapes' tol shapes =</span>
|
||||
<span class="lineno"> 322 </span><span class="spaces"> </span><span class="nottickedoff">map PolyShape $</span>
|
||||
<span class="lineno"> 323 </span><span class="spaces"> </span><span class="nottickedoff">union (map unPolyShape shapes) NonZero tol</span></span>
|
||||
<span class="lineno"> 324 </span>
|
||||
<span class="lineno"> 325 </span>-- | True iff lhs is inside of rhs.
|
||||
<span class="lineno"> 326 </span>-- lhs and rhs may not overlap.
|
||||
<span class="lineno"> 327 </span>-- Implementation: Trace a vertical line through the origin of A and check
|
||||
<span class="lineno"> 328 </span>-- of this line intersects and odd number of times on both sides of A.
|
||||
<span class="lineno"> 329 </span>isInsideOf :: PolyShape -> PolyShape -> Bool
|
||||
<span class="lineno"> 330 </span><span class="decl"><span class="nottickedoff">lhs `isInsideOf` rhs =</span>
|
||||
<span class="lineno"> 331 </span><span class="spaces"> </span><span class="nottickedoff">odd (length upHits) && odd (length downHits)</span>
|
||||
<span class="lineno"> 332 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 333 </span><span class="spaces"> </span><span class="nottickedoff">(upHits, downHits) = polyIntersections origin rhs</span>
|
||||
<span class="lineno"> 334 </span><span class="spaces"> </span><span class="nottickedoff">origin = polyShapeOrigin lhs</span></span>
|
||||
<span class="lineno"> 335 </span>
|
||||
<span class="lineno"> 336 </span>polyIntersections :: RPoint -> PolyShape -> ([RPoint],[RPoint])
|
||||
<span class="lineno"> 337 </span><span class="decl"><span class="nottickedoff">polyIntersections origin rhs =</span>
|
||||
<span class="lineno"> 338 </span><span class="spaces"> </span><span class="nottickedoff">(nub $ concatMap (intersections rayUp) curves</span>
|
||||
<span class="lineno"> 339 </span><span class="spaces"> </span><span class="nottickedoff">,nub $ concatMap (intersections rayDown) curves)</span>
|
||||
<span class="lineno"> 340 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 341 </span><span class="spaces"> </span><span class="nottickedoff">curves = plCurves rhs</span>
|
||||
<span class="lineno"> 342 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||
<span class="lineno"> 343 </span><span class="spaces"> </span><span class="nottickedoff">intersections line bs =</span>
|
||||
<span class="lineno"> 344 </span><span class="spaces"> </span><span class="nottickedoff">map (evalBezier bs . fst) (bezierIntersection bs line polyShapeTolerance)</span>
|
||||
<span class="lineno"> 345 </span><span class="spaces"> </span><span class="nottickedoff">limit = 1000</span>
|
||||
<span class="lineno"> 346 </span><span class="spaces"> </span><span class="nottickedoff">rayUp = CubicBezier origin origin origin (V2 limit limit)</span>
|
||||
<span class="lineno"> 347 </span><span class="spaces"> </span><span class="nottickedoff">rayDown = CubicBezier origin origin origin (V2 (-limit) (-limit))</span></span>
|
||||
<span class="lineno"> 348 </span>
|
||||
<span class="lineno"> 349 </span>polyShapeOrigin :: PolyShape -> V2 Double
|
||||
<span class="lineno"> 350 </span><span class="decl"><span class="nottickedoff">polyShapeOrigin (PolyShape closedPath) =</span>
|
||||
<span class="lineno"> 351 </span><span class="spaces"> </span><span class="nottickedoff">case closedPath of</span>
|
||||
<span class="lineno"> 352 </span><span class="spaces"> </span><span class="nottickedoff">ClosedPath [] -> V2 0 0</span>
|
||||
<span class="lineno"> 353 </span><span class="spaces"> </span><span class="nottickedoff">ClosedPath ((start,_):_) -> start</span></span>
|
||||
<span class="lineno"> 354 </span>
|
||||
<span class="lineno"> 355 </span>-- | Find holes and group them with their parent.
|
||||
<span class="lineno"> 356 </span>plGroupShapes :: [PolyShape] -> [PolyShapeWithHoles]
|
||||
<span class="lineno"> 357 </span><span class="decl"><span class="istickedoff">plGroupShapes = worker</span>
|
||||
<span class="lineno"> 358 </span><span class="spaces"> </span><span class="istickedoff">where</span>
|
||||
<span class="lineno"> 359 </span><span class="spaces"> </span><span class="istickedoff">worker (s:rest)</span>
|
||||
<span class="lineno"> 360 </span><span class="spaces"> </span><span class="istickedoff">| <span class="tickonlytrue">null (parents <span class="nottickedoff">s</span> rest)</span> =</span>
|
||||
<span class="lineno"> 361 </span><span class="spaces"> </span><span class="istickedoff">let <span class="nottickedoff">isOnlyChild x = parents x (s:rest) == [s]</span></span>
|
||||
<span class="lineno"> 362 </span><span class="spaces"> </span><span class="istickedoff">(holes, nonHoles) = partition <span class="nottickedoff">isOnlyChild</span> rest</span>
|
||||
<span class="lineno"> 363 </span><span class="spaces"> </span><span class="istickedoff">prime = PolyShapeWithHoles</span>
|
||||
<span class="lineno"> 364 </span><span class="spaces"> </span><span class="istickedoff">{ polyShapeParent = s</span>
|
||||
<span class="lineno"> 365 </span><span class="spaces"> </span><span class="istickedoff">, polyShapeHoles = holes }</span>
|
||||
<span class="lineno"> 366 </span><span class="spaces"> </span><span class="istickedoff">in prime : worker nonHoles</span>
|
||||
<span class="lineno"> 367 </span><span class="spaces"> </span><span class="istickedoff">| <span class="nottickedoff">otherwise</span> = <span class="nottickedoff">worker (rest ++ [s])</span></span>
|
||||
<span class="lineno"> 368 </span><span class="spaces"> </span><span class="istickedoff">worker [] = []</span>
|
||||
<span class="lineno"> 369 </span><span class="spaces"></span><span class="istickedoff"></span>
|
||||
<span class="lineno"> 370 </span><span class="spaces"> </span><span class="istickedoff">parents :: PolyShape -> [PolyShape] -> [PolyShape]</span>
|
||||
<span class="lineno"> 371 </span><span class="spaces"> </span><span class="istickedoff">parents self = filter <span class="nottickedoff">(self `isInsideOf`)</span> . filter <span class="nottickedoff">(/=self)</span></span></span>
|
||||
<span class="lineno"> 372 </span>
|
||||
<span class="lineno"> 373 </span>{-
|
||||
<span class="lineno"> 374 </span>parent:
|
||||
<span class="lineno"> 375 </span> (a,b)
|
||||
<span class="lineno"> 376 </span> (b,c)
|
||||
<span class="lineno"> 377 </span> (c,a)
|
||||
<span class="lineno"> 378 </span>
|
||||
<span class="lineno"> 379 </span>child:
|
||||
<span class="lineno"> 380 </span> (x,y)
|
||||
<span class="lineno"> 381 </span> (y,z)
|
||||
<span class="lineno"> 382 </span> (z,x)
|
||||
<span class="lineno"> 383 </span>
|
||||
<span class="lineno"> 384 </span>P = split (a,b)
|
||||
<span class="lineno"> 385 </span>new:
|
||||
<span class="lineno"> 386 </span> (P,b) p2b
|
||||
<span class="lineno"> 387 </span> (b,c) pTail
|
||||
<span class="lineno"> 388 </span> (c,a) pTail
|
||||
<span class="lineno"> 389 </span> (a,P) a2p
|
||||
<span class="lineno"> 373 </span>instance Eq PolyShape where
|
||||
<span class="lineno"> 374 </span> <span class="decl"><span class="nottickedoff">a == b = plCurves a == plCurves b</span></span>
|
||||
<span class="lineno"> 375 </span>
|
||||
<span class="lineno"> 376 </span>-- | Cut out holes.
|
||||
<span class="lineno"> 377 </span>mergePolyShapeHoles :: PolyShapeWithHoles -> PolyShape
|
||||
<span class="lineno"> 378 </span><span class="decl"><span class="istickedoff">mergePolyShapeHoles (PolyShapeWithHoles parent []) = parent</span>
|
||||
<span class="lineno"> 379 </span><span class="spaces"></span><span class="istickedoff">mergePolyShapeHoles (PolyShapeWithHoles parent (child:children)) =</span>
|
||||
<span class="lineno"> 380 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">mergePolyShapeHoles $</span></span>
|
||||
<span class="lineno"> 381 </span><span class="spaces"> </span><span class="istickedoff"><span class="nottickedoff">PolyShapeWithHoles (mergePolyShapeHole parent child) children</span></span></span>
|
||||
<span class="lineno"> 382 </span>
|
||||
<span class="lineno"> 383 </span>-- Merge
|
||||
<span class="lineno"> 384 </span>mergePolyShapeHole :: PolyShape -> PolyShape -> PolyShape
|
||||
<span class="lineno"> 385 </span><span class="decl"><span class="nottickedoff">mergePolyShapeHole parent child =</span>
|
||||
<span class="lineno"> 386 </span><span class="spaces"> </span><span class="nottickedoff">snd $ head $</span>
|
||||
<span class="lineno"> 387 </span><span class="spaces"> </span><span class="nottickedoff">sortOn fst</span>
|
||||
<span class="lineno"> 388 </span><span class="spaces"> </span><span class="nottickedoff">[ cutSingleHole newParent child</span>
|
||||
<span class="lineno"> 389 </span><span class="spaces"> </span><span class="nottickedoff">| newParent <- polyShapePermutations parent ]</span></span>
|
||||
<span class="lineno"> 390 </span>
|
||||
<span class="lineno"> 391 </span> (P,x) p2x
|
||||
<span class="lineno"> 392 </span>
|
||||
<span class="lineno"> 393 </span> (x,y) childCurves
|
||||
<span class="lineno"> 394 </span> (y,z) childCurves
|
||||
<span class="lineno"> 395 </span> (z,x) childCurves
|
||||
<span class="lineno"> 391 </span>{-
|
||||
<span class="lineno"> 392 </span>parent:
|
||||
<span class="lineno"> 393 </span> (a,b)
|
||||
<span class="lineno"> 394 </span> (b,c)
|
||||
<span class="lineno"> 395 </span> (c,a)
|
||||
<span class="lineno"> 396 </span>
|
||||
<span class="lineno"> 397 </span> (x,P) x2p
|
||||
<span class="lineno"> 398 </span>
|
||||
<span class="lineno"> 399 </span>-}
|
||||
<span class="lineno"> 400 </span>cutSingleHole :: PolyShape -> PolyShape -> (Double, PolyShape)
|
||||
<span class="lineno"> 401 </span><span class="decl"><span class="nottickedoff">cutSingleHole parent child =</span>
|
||||
<span class="lineno"> 402 </span><span class="spaces"> </span><span class="nottickedoff">(score, PolyShape $ curvesToClosed $</span>
|
||||
<span class="lineno"> 403 </span><span class="spaces"> </span><span class="nottickedoff">p2b:pTail ++ [a2p] ++</span>
|
||||
<span class="lineno"> 404 </span><span class="spaces"> </span><span class="nottickedoff">[p2x] ++ childCurves ++</span>
|
||||
<span class="lineno"> 405 </span><span class="spaces"> </span><span class="nottickedoff">[x2p]</span>
|
||||
<span class="lineno"> 406 </span><span class="spaces"> </span><span class="nottickedoff">)</span>
|
||||
<span class="lineno"> 407 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 408 </span><span class="spaces"> </span><span class="nottickedoff">-- vect = (childOrigin - p) * 0 -- 0.0001</span>
|
||||
<span class="lineno"> 409 </span><span class="spaces"> </span><span class="nottickedoff">vectL = 0 -- rotate90L $* vect</span>
|
||||
<span class="lineno"> 410 </span><span class="spaces"> </span><span class="nottickedoff">vectR = 0 -- rotate90R $* vect</span>
|
||||
<span class="lineno"> 411 </span><span class="spaces"> </span><span class="nottickedoff">score = vectorDistance childOrigin p</span>
|
||||
<span class="lineno"> 412 </span><span class="spaces"> </span><span class="nottickedoff">childOrigin = polyShapeOrigin child</span>
|
||||
<span class="lineno"> 413 </span><span class="spaces"> </span><span class="nottickedoff">childOrigin' = childOrigin - vectL</span>
|
||||
<span class="lineno"> 414 </span><span class="spaces"> </span><span class="nottickedoff">(pHead:pTail) = plCurves parent</span>
|
||||
<span class="lineno"> 415 </span><span class="spaces"> </span><span class="nottickedoff">childCurves = plCurves child</span>
|
||||
<span class="lineno"> 416 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||
<span class="lineno"> 417 </span><span class="spaces"> </span><span class="nottickedoff">pParam = closest pHead childOrigin polyShapeTolerance</span>
|
||||
<span class="lineno"> 418 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||
<span class="lineno"> 419 </span><span class="spaces"> </span><span class="nottickedoff">(a2p, p2b') = splitBezier pHead pParam</span>
|
||||
<span class="lineno"> 420 </span><span class="spaces"> </span><span class="nottickedoff">p2b = case p2b' of</span>
|
||||
<span class="lineno"> 421 </span><span class="spaces"> </span><span class="nottickedoff">CubicBezier a b c d -> CubicBezier (a - vectL) b c d</span>
|
||||
<span class="lineno"> 422 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||
<span class="lineno"> 423 </span><span class="spaces"> </span><span class="nottickedoff">p = evalBezier pHead pParam</span>
|
||||
<span class="lineno"> 424 </span><span class="spaces"> </span><span class="nottickedoff">-- straight line to child origin</span>
|
||||
<span class="lineno"> 425 </span><span class="spaces"> </span><span class="nottickedoff">p2x = lineBetween (p - vectR) childOrigin</span>
|
||||
<span class="lineno"> 426 </span><span class="spaces"> </span><span class="nottickedoff">-- straight line from child origin</span>
|
||||
<span class="lineno"> 427 </span><span class="spaces"> </span><span class="nottickedoff">x2p = lineBetween childOrigin' p</span>
|
||||
<span class="lineno"> 428 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||
<span class="lineno"> 429 </span><span class="spaces"> </span><span class="nottickedoff">lineBetween a = CubicBezier a a a</span></span>
|
||||
<span class="lineno"> 430 </span>
|
||||
<span class="lineno"> 431 </span>plCurves :: PolyShape -> [CubicBezier Double]
|
||||
<span class="lineno"> 432 </span><span class="decl"><span class="istickedoff">plCurves = closedPathCurves . unPolyShape</span></span>
|
||||
<span class="lineno"> 433 </span>
|
||||
<span class="lineno"> 434 </span>polyShapePermutations :: PolyShape -> [PolyShape]
|
||||
<span class="lineno"> 435 </span><span class="decl"><span class="nottickedoff">polyShapePermutations =</span>
|
||||
<span class="lineno"> 436 </span><span class="spaces"> </span><span class="nottickedoff">map (PolyShape . curvesToClosed) . cycleList . plCurves</span>
|
||||
<span class="lineno"> 437 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 438 </span><span class="spaces"> </span><span class="nottickedoff">cycleList lst =</span>
|
||||
<span class="lineno"> 439 </span><span class="spaces"> </span><span class="nottickedoff">let n = length lst in</span>
|
||||
<span class="lineno"> 440 </span><span class="spaces"> </span><span class="nottickedoff">[ take n $ drop i $ cycle lst</span>
|
||||
<span class="lineno"> 441 </span><span class="spaces"> </span><span class="nottickedoff">| i <- [0.. n-1] ]</span></span>
|
||||
<span class="lineno"> 397 </span>child:
|
||||
<span class="lineno"> 398 </span> (x,y)
|
||||
<span class="lineno"> 399 </span> (y,z)
|
||||
<span class="lineno"> 400 </span> (z,x)
|
||||
<span class="lineno"> 401 </span>
|
||||
<span class="lineno"> 402 </span>P = split (a,b)
|
||||
<span class="lineno"> 403 </span>new:
|
||||
<span class="lineno"> 404 </span> (P,b) p2b
|
||||
<span class="lineno"> 405 </span> (b,c) pTail
|
||||
<span class="lineno"> 406 </span> (c,a) pTail
|
||||
<span class="lineno"> 407 </span> (a,P) a2p
|
||||
<span class="lineno"> 408 </span>
|
||||
<span class="lineno"> 409 </span> (P,x) p2x
|
||||
<span class="lineno"> 410 </span>
|
||||
<span class="lineno"> 411 </span> (x,y) childCurves
|
||||
<span class="lineno"> 412 </span> (y,z) childCurves
|
||||
<span class="lineno"> 413 </span> (z,x) childCurves
|
||||
<span class="lineno"> 414 </span>
|
||||
<span class="lineno"> 415 </span> (x,P) x2p
|
||||
<span class="lineno"> 416 </span>
|
||||
<span class="lineno"> 417 </span>-}
|
||||
<span class="lineno"> 418 </span>cutSingleHole :: PolyShape -> PolyShape -> (Double, PolyShape)
|
||||
<span class="lineno"> 419 </span><span class="decl"><span class="nottickedoff">cutSingleHole parent child =</span>
|
||||
<span class="lineno"> 420 </span><span class="spaces"> </span><span class="nottickedoff">(score, PolyShape $ curvesToClosed $</span>
|
||||
<span class="lineno"> 421 </span><span class="spaces"> </span><span class="nottickedoff">p2b:pTail ++ [a2p] ++</span>
|
||||
<span class="lineno"> 422 </span><span class="spaces"> </span><span class="nottickedoff">[p2x] ++ childCurves ++</span>
|
||||
<span class="lineno"> 423 </span><span class="spaces"> </span><span class="nottickedoff">[x2p]</span>
|
||||
<span class="lineno"> 424 </span><span class="spaces"> </span><span class="nottickedoff">)</span>
|
||||
<span class="lineno"> 425 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 426 </span><span class="spaces"> </span><span class="nottickedoff">-- vect = (childOrigin - p) * 0 -- 0.0001</span>
|
||||
<span class="lineno"> 427 </span><span class="spaces"> </span><span class="nottickedoff">vectL = 0 -- rotate90L $* vect</span>
|
||||
<span class="lineno"> 428 </span><span class="spaces"> </span><span class="nottickedoff">vectR = 0 -- rotate90R $* vect</span>
|
||||
<span class="lineno"> 429 </span><span class="spaces"> </span><span class="nottickedoff">score = vectorDistance childOrigin p</span>
|
||||
<span class="lineno"> 430 </span><span class="spaces"> </span><span class="nottickedoff">childOrigin = polyShapeOrigin child</span>
|
||||
<span class="lineno"> 431 </span><span class="spaces"> </span><span class="nottickedoff">childOrigin' = childOrigin - vectL</span>
|
||||
<span class="lineno"> 432 </span><span class="spaces"> </span><span class="nottickedoff">(pHead:pTail) = plCurves parent</span>
|
||||
<span class="lineno"> 433 </span><span class="spaces"> </span><span class="nottickedoff">childCurves = plCurves child</span>
|
||||
<span class="lineno"> 434 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||
<span class="lineno"> 435 </span><span class="spaces"> </span><span class="nottickedoff">pParam = closest pHead childOrigin polyShapeTolerance</span>
|
||||
<span class="lineno"> 436 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||
<span class="lineno"> 437 </span><span class="spaces"> </span><span class="nottickedoff">(a2p, p2b') = splitBezier pHead pParam</span>
|
||||
<span class="lineno"> 438 </span><span class="spaces"> </span><span class="nottickedoff">p2b = case p2b' of</span>
|
||||
<span class="lineno"> 439 </span><span class="spaces"> </span><span class="nottickedoff">CubicBezier a b c d -> CubicBezier (a - vectL) b c d</span>
|
||||
<span class="lineno"> 440 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||
<span class="lineno"> 441 </span><span class="spaces"> </span><span class="nottickedoff">p = evalBezier pHead pParam</span>
|
||||
<span class="lineno"> 442 </span><span class="spaces"> </span><span class="nottickedoff">-- straight line to child origin</span>
|
||||
<span class="lineno"> 443 </span><span class="spaces"> </span><span class="nottickedoff">p2x = lineBetween (p - vectR) childOrigin</span>
|
||||
<span class="lineno"> 444 </span><span class="spaces"> </span><span class="nottickedoff">-- straight line from child origin</span>
|
||||
<span class="lineno"> 445 </span><span class="spaces"> </span><span class="nottickedoff">x2p = lineBetween childOrigin' p</span>
|
||||
<span class="lineno"> 446 </span><span class="spaces"></span><span class="nottickedoff"></span>
|
||||
<span class="lineno"> 447 </span><span class="spaces"> </span><span class="nottickedoff">lineBetween a = CubicBezier a a a</span></span>
|
||||
<span class="lineno"> 448 </span>
|
||||
<span class="lineno"> 449 </span>-- | Destruct a polyshape into constituent curves.
|
||||
<span class="lineno"> 450 </span>plCurves :: PolyShape -> [CubicBezier Double]
|
||||
<span class="lineno"> 451 </span><span class="decl"><span class="istickedoff">plCurves = closedPathCurves . unPolyShape</span></span>
|
||||
<span class="lineno"> 452 </span>
|
||||
<span class="lineno"> 453 </span>polyShapePermutations :: PolyShape -> [PolyShape]
|
||||
<span class="lineno"> 454 </span><span class="decl"><span class="nottickedoff">polyShapePermutations =</span>
|
||||
<span class="lineno"> 455 </span><span class="spaces"> </span><span class="nottickedoff">map (PolyShape . curvesToClosed) . cycleList . plCurves</span>
|
||||
<span class="lineno"> 456 </span><span class="spaces"> </span><span class="nottickedoff">where</span>
|
||||
<span class="lineno"> 457 </span><span class="spaces"> </span><span class="nottickedoff">cycleList lst =</span>
|
||||
<span class="lineno"> 458 </span><span class="spaces"> </span><span class="nottickedoff">let n = length lst in</span>
|
||||
<span class="lineno"> 459 </span><span class="spaces"> </span><span class="nottickedoff">[ take n $ drop i $ cycle lst</span>
|
||||
<span class="lineno"> 460 </span><span class="spaces"> </span><span class="nottickedoff">| i <- [0.. n-1] ]</span></span>
|
||||
|
||||
</pre>
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ span.spaces { background: white }
|
|||
<span class="lineno"> 5 </span>import Control.Monad.State
|
||||
<span class="lineno"> 6 </span>import Data.Functor
|
||||
<span class="lineno"> 7 </span>import qualified Data.Vector.Unboxed as V
|
||||
<span class="lineno"> 8 </span>import qualified Reanimate.Internal.CubicBezier as Bezier
|
||||
<span class="lineno"> 8 </span>import qualified Geom2D.CubicBezier.Linear as Bezier
|
||||
<span class="lineno"> 9 </span>import Graphics.SvgTree hiding (height, line, path, use, width)
|
||||
<span class="lineno"> 10 </span>import Linear.Metric
|
||||
<span class="lineno"> 11 </span>import Linear.V2 hiding (angle)
|
||||
|
|
|
|||
Loading…
Reference in a new issue