Created
March 19, 2018 02:52
-
-
Save NateTG/b350378c56f436d3996a2107f7cba965 to your computer and use it in GitHub Desktop.
Gone a little bit crazy with triangulation in Openscad
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//Scraped from postscript using pathforall | |
a=[ | |
43.9881,6.56189,"moveto", | |
42.2891,5.17072,41.0949,4.67827,39.6053,4.67827,"curveto", | |
37.3154,4.67827,36.626,6.06944,36.626,10.4522,"curveto", | |
36.626,29.8548,"lineto", | |
36.626,35.0255,36.1212,37.9186,34.6315,40.307,"curveto", | |
32.4401,43.8896,28.1681,45.7732,22.2957,45.7732,"curveto", | |
12.9391,45.7732,5.57699,40.898,5.57699,34.6315,"curveto", | |
5.57699,32.3416,7.46061,30.3472,9.849,30.3472,"curveto", | |
12.2374,30.3472,14.3303,32.3416,14.3303,34.533,"curveto", | |
14.3303,34.927,14.2318,35.4318,14.1333,36.1212,"curveto", | |
13.9363,37.0199,13.8378,37.8201,13.8378,38.5096,"curveto", | |
13.8378,41.1934,17.0141,43.3848,21.003,43.3848,"curveto", | |
25.8782,43.3848,28.5621,40.504,28.5621,35.124,"curveto", | |
28.5621,29.0545,"lineto", | |
13.3331,22.9851,11.5479,22.0864,7.26363,18.3068,"curveto", | |
5.07223,16.3247,3.68106,12.9391,3.68106,9.65202,"curveto", | |
3.68106,3.38559,8.06387,-0.997211,14.1333,-0.997211,"curveto", | |
18.5038,-0.997211,22.5911,1.0957,28.6606,6.26642,"curveto", | |
29.153,0.997211,30.9505,-0.997211,35.0255,-0.997211,"curveto", | |
38.4111,-0.997211,40.504,0.19698,43.9881,3.97653,"curveto", | |
43.9881,6.56189,"lineto", | |
"closepath", | |
28.5621,12.2374,"moveto", | |
28.5621,9.25806,28.0573,8.16236,25.9767,6.96816,"curveto", | |
23.4899,5.57699,20.7937,4.77676,18.7131,4.77676,"curveto", | |
15.229,4.77676,12.4344,8.16236,12.4344,12.4344,"curveto", | |
12.4344,12.8406,"lineto", | |
12.5328,18.8116,16.9156,22.5911,28.5621,26.6662,"curveto", | |
28.5621,12.2374,"lineto", | |
"closepath" | |
]; | |
function splitpaths(script,i=0)= | |
("closepath"==script[i])? | |
(i==len(script)-1)? | |
[[for (j=[0:i-1]) script[j]]] | |
: | |
concat( | |
[[for (j=[0:i-1]) script[j]]], | |
splitpaths([for (j=[i+1:len(script)-1]) script[j]]) | |
) | |
: | |
splitpaths(script,i+1) | |
; | |
function pathstep(path,i=0,curx,cury,steps=10)= | |
(i>=len(path))? | |
[] | |
:("moveto"==path[i])? //This should only happen when i==2 | |
concat( | |
[[path[i-2],path[i-1]]], | |
pathstep(path,i+1,path[i-2],path[i-1],steps) | |
) | |
:("lineto"==path[i])? //This happens later... | |
concat( | |
[[path[i-2],path[i-1]]], | |
pathstep(path,i+1,path[i-2],path[i-1],steps) | |
) | |
:("curveto"==path[i])? | |
concat( | |
psbezier([curx,cury],[path[i-6],path[i-5]],[path[i-4],path[i-3]],[path[i-2],path[i-1]],steps), | |
pathstep(path,i+1,path[i-2],path[i-1],steps) | |
) | |
: | |
pathstep(path,i+1,curx,cury,steps); | |
function psbezier(a,b,c,d,steps=10) = | |
let(step=1/steps) | |
[for(i=[1:steps]) nbezier([a,b,c,d],step*i)] | |
; | |
function nbezier(points,t)= | |
1>=len(points)? | |
points[0] | |
: | |
nbezier( | |
[for(i=[0:len(points)-2]) points[i]*(1-t)+points[i+1]*t], | |
t | |
); | |
function stripnulls(path)= | |
let(pl=len(path)) | |
[for (i=[0:pl-1]) if((path[i]-path[(pl+i-1)%pl])*(path[i]-path[(pl+i-1)%pl])>0) path[i]] | |
; | |
function mkpoly(paths,curpoints=[],curpaths=[],i=0)= | |
(i>=len(paths))? | |
[] | |
:(i==len(paths)-1)? | |
let(mypath=stripnulls(paths[i])) | |
[ | |
concat(curpoints,mypath), | |
concat(curpaths,[[for (i=[0:len(mypath)-1]) i+len(curpoints)]]) | |
] | |
: | |
let(mypath=stripnulls(paths[i])) | |
mkpoly( | |
paths, | |
concat(curpoints,mypath), | |
concat(curpaths,[[for (i=[0:len(mypath)-1]) i+len(curpoints)]]), | |
i+1 | |
) | |
; | |
function makesegments(poly) = | |
[ | |
for (i=[0:len(poly[1])-1]) [ | |
for(j=[0:len(poly[1][i])-1]) | |
[ | |
poly[1][i][j], | |
poly[1][i][(j+1)%len(poly[1][i])] | |
] | |
] | |
] | |
; | |
apaths=splitpaths(a); | |
arender=[for (i=[0:len(apaths)-1]) pathstep(apaths[i])]; | |
poly=mkpoly(arender); | |
translate([0,0,-1]) linear_extrude(height=1) { | |
polygon(points=poly[0],paths=poly[1]); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use<subdivision.scad> | |
use<FunctionalOpenSCAD/functional.scad> | |
//Sweep line triangulator using monotone polygons | |
//Requires: | |
// First path to be properly wound external face. | |
// Correctly wound paths (internal paths are CW, external CCW). | |
// No intesecting paths | |
// No vertices with more than 2 edges. | |
//include<a.scad> | |
use<a.scad> | |
include<text.scad> | |
ppaths=splitpaths(text); | |
prender=[for (i=[0:len(ppaths)-1]) pathstep(ppaths[i],steps=3)]; | |
poly=mkpoly(prender); | |
/* | |
translate([0,0,-1]) linear_extrude(height=1) { | |
polygon(points=poly[0],paths=poly[1]); | |
} | |
*/ | |
maxtest=0; | |
triangles=triangulate(poly[0],poly[1]); | |
//Testing stuff... | |
mypoints=mk3d(poly[0]); | |
//subdivided=[mypoints,triangles]; | |
stest=sphere(); | |
subdivided=subdivide_faces(2,[mypoints,triangles]); | |
echo(len(subdivided[0])); | |
//modified=[for (point=subdivided[0]) [point[0],point[1]+point[0]/10,((point[0]-325)*(point[0]-325)+point[1]*point[1])/1000]]; | |
function toc(point)= | |
let(x=point[0],y=point[1],z=point[2]) | |
[-50*cos(x),-50*sin(x),y-x/3] | |
; | |
modified=[for (point=subdivided[0]) toc(point)]; | |
polyhedron(points=modified,faces=subdivided[1]); | |
color("black") cylinder(r=48,h=2000,$fn=36,center=true); | |
//showsweep(points=modified,closed=subdivided[1],open=[]); | |
//This one is often handy... | |
module line (a=[1,1,1],b=[21,2,2],r=0.125) { | |
v=b-a; | |
translate(a) | |
rotate(a=atan2(v[1],v[0])) | |
rotate(v=[0,1,0],a=atan2(sqrt(v[0]*v[0]+v[1]*v[1]),v[2])) | |
cylinder(h=sqrt(v*v),r1=r,r2=r); | |
} | |
module closedtest(pointlist,components) { | |
echo("testing components"); | |
for(i=[0:len(components)-1]) { | |
for(j=[0:len(components[i])-1]) { | |
if(pointlist[components[i][j]][0]>pointlist[components[i][0]][0]) { | |
echo("no start on max x",i,j,pointlist[component[i][0]],pointlist[component[i][j]]); | |
} | |
} | |
} | |
} | |
module dot (p=[1,1,1],r=0.25) { | |
translate(p) sphere(r=r); | |
} | |
module showopen(points,component) { | |
list=component[0]; | |
prev=points[component[1]]; | |
next=points[component[2]]; | |
color("white") translate(prev) sphere(r=0.5); | |
color("yellow") line(prev,points[list[0]]); | |
// color("white") translate(next) sphere(r=0.25); | |
color("white") line(points[list[len(list)-1]],next); | |
color("black") translate(points[list[0]]) sphere(r=0.25); | |
color("black") translate(points[list[len(list)-1]]) sphere(r=0.25); | |
//show box.. | |
// color("white") line(points[list[0]],points[list[len(list)-1]]); | |
// color("white") line(prev,next); | |
//latest | |
color("green") dot(points[list[component[3]]],r=0.5); | |
if(len(list)>1) { | |
for(j=[0:len(list)-2]) { | |
color("black") line(points[list[j]],points[list[j+1]]); | |
} | |
} | |
} | |
module showsweep (points,closed,open,rz=0.1) { | |
if(len(closed)>0) { | |
for (i=[0:len(closed)-1]) { | |
for(j=[0:len(closed[i])-1]) { | |
color("blue") line( | |
points[closed[i][j]],points[closed[i][(j+1)%len(closed[i])]]); | |
} | |
} | |
} | |
if(len(open)>0) { | |
for (i=[0:len(open)-1]) { | |
translate([0,0,rz*(i+1)]) showopen(points,open[i]); | |
} | |
} | |
} | |
//End of test/debugging section | |
//Requires: | |
// First path to be properly wound. | |
// No intesecting paths | |
// No vertices with more than 2 edges. | |
//At this point I have monotone components. ... | |
function triangulate(points,paths)= | |
let( | |
mypoints=mk3d(points), | |
/* | |
localz=winding_direction(mypoints,paths[0]), | |
localx=nontrivialsegment(mypoints,paths[0]), | |
localy=cross(localz,localx), | |
*/ | |
localx=[1,0,0],localy=[0,1,0],localz=[0,0,1], | |
neighborlist=mkneighborlist(mypoints,paths,localx,localy), | |
sweeplist=mksweeplist(neighborlist), | |
closed=sweeptriangulate(neighborlist,sweeplist,closed=[],open=[]) | |
) | |
flatten([for (i=[0:len(closed)-1]) triangulatecomponent(neighborlist,closed[i])]) | |
// flatten([for (i=[0:60]) triangulatecomponent(neighborlist,closed[i])]) | |
; | |
//Use a "data structure" for components: | |
//vertices - component body | |
//prev - "left" dangler | |
//next - "right" dangler | |
//latest - index of the newest vertex (typically 0 or -1) | |
//pendant - undef or index of a 'roof cusp' | |
function flatten(list)= | |
[for (a=list) for (b=a) b] | |
; | |
//Fixme: Needs a component triangulation function. | |
//Trapezoid partition & uni-montone components, perhaps. | |
function newcomponent(pointlist,point) = | |
let( | |
index=2, | |
isexternal=5, | |
a=pointlist[point[3]], | |
b=pointlist[point[4]], | |
swap=!point[isexternal], | |
prev=swap?b[2]:a[2], | |
next=swap?a[2]:b[2] | |
) | |
[ | |
[point[index]], | |
prev, | |
next, | |
0, | |
undef | |
] | |
; | |
//returns [ newclosed/undef, component ] | |
function componentnewprev(pointlist,component,point) = | |
let( | |
vertexlist=component[0], | |
next=component[2], | |
index=2, | |
pendant=component[4], | |
newprev=(vertexlist[0]==point[3])?point[4]:point[3] | |
) | |
(undef==pendant)? //No dangling roof pendant. | |
[ | |
[], | |
[ | |
concat([point[index]],vertexlist), | |
newprev, | |
next, | |
0, | |
undef | |
] | |
] | |
: | |
[ | |
[ | |
concat( [point[index]], sublist(vertexlist,0,pendant) ) | |
], | |
[ | |
concat( [point[index]], sublist(vertexlist,pendant,-1) ), | |
newprev, | |
next, | |
0, | |
undef | |
] | |
] | |
; | |
function componentnewnext(pointlist,component,point) = | |
let( | |
vertexlist=component[0], | |
prev=component[1], | |
index=2, | |
pendant=component[4], | |
newnext=(vertexlist[len(vertexlist)-1]==point[3])?point[4]:point[3] | |
) | |
(undef==pendant)? //No dangling roof pendant. | |
[ | |
[], | |
[ | |
concat(vertexlist,[point[index]]), | |
prev, | |
newnext, | |
len(vertexlist), | |
undef | |
] | |
] | |
: | |
[ | |
[ | |
concat( [point[index]], sublist(vertexlist,pendant,-1) ) | |
], | |
[ | |
concat( sublist(vertexlist,0,pendant), [point[index]] ), | |
prev, | |
newnext, | |
pendant+1, | |
undef | |
] | |
] | |
; | |
function componentfuse(pointlist,componentl,componentr,point)= | |
let( | |
pendant=4, | |
index=2, | |
lvertexlist=componentl[0], | |
rvertexlist=componentr[0], | |
newprev=componentl[1], | |
newnext=componentr[2], | |
lpendant=componentl[pendant], | |
rpendant=componentr[pendant] | |
) | |
(lpendant==undef && rpendant==undef)? | |
[ | |
[], | |
[ | |
concat(lvertexlist,[point[index]],rvertexlist), | |
newprev, | |
newnext, | |
len(lvertexlist), | |
len(lvertexlist) | |
] | |
] | |
:(rpendant==undef)? | |
[ | |
[ | |
//Make X-most point first in list for triangulation. | |
concat([point[index]],sublist(lvertexlist,lpendant,-1)) | |
], | |
[ | |
concat(sublist(lvertexlist,0,lpendant),[point[index]],rvertexlist), | |
newprev, | |
newnext, | |
lpendant+1, | |
lpendant+1 | |
] | |
] | |
:(lpendant==undef)? | |
[ | |
[ | |
concat([point[index]],sublist(rvertexlist,0,rpendant)) | |
], | |
[ | |
concat(lvertexlist,[point[index]],sublist(rvertexlist,rpendant,-1)), | |
newprev, | |
newnext, | |
len(lvertexlist), | |
len(lvertexlist) | |
] | |
] | |
://both components have pendants | |
//fixme: I think this one still needs testing. | |
[ | |
[ | |
//Make x-most point first for triangulation. | |
concat([point[index]],sublist(lvertices,lpendant,-1)), | |
concat([point[index]],sublist(rvertexlist,0,rpendant)) | |
], | |
[ | |
concat(sublist(lvertices,0,lpendant),[point[index]],sublist(rvertexlist,rpendant,-1)), | |
newprev, | |
newnext, | |
lpendant+1, | |
lpendant+1 | |
] | |
] | |
; | |
function componentsplit (pointlist,component,point)= | |
let( | |
latest=component[3], | |
vertexlist=component[0], | |
l=pointlist[vertexlist[latest]], | |
componentprev=component[1], | |
componentnext=component[2], | |
index=2, | |
isexternal=5, | |
a=pointlist[point[3]], | |
b=pointlist[point[4]], | |
swap=!point[isexternal], | |
//Reversed b/c this is inside -> outside | |
pointprev=swap?a[2]:b[2], | |
pointnext=swap?b[2]:a[2] | |
) | |
[ | |
[ | |
concat(sublist(vertexlist,0,latest),[point[index]]), | |
componentprev, | |
pointprev, | |
latest+1, | |
undef | |
], | |
[ | |
concat([point[index]],sublist(vertexlist,latest,-1)), | |
pointnext, | |
componentnext, | |
0, | |
undef | |
] | |
] | |
; | |
function componentclose(open,point)= | |
let( | |
list=open[0], | |
pendant=open[4], | |
mypoint=point[2] | |
) | |
(undef==pendant)? | |
[ | |
concat([mypoint],list) | |
] | |
: | |
//FIXME: This may be untested. | |
[ | |
concat([mypoint],sublist(list,0,pendant)), | |
concat([mypoint],sublist(list,pendant,-1)) | |
] | |
; | |
function r2ceil(x,n=1)= | |
(n>x)? | |
n | |
: | |
r2ceil(x,n=n*2) | |
; | |
function componentposition(point,neighborlist,open,i=0)= | |
let( | |
odd=(i%2==1), | |
path=odd?(i-1)/2:i/2, | |
prev=1, | |
next=2, | |
vlist=open[path][0], | |
ai=odd?open[path][next]:open[path][prev], | |
bi=odd?vlist[len(vlist)-1]:vlist[0], | |
a=[neighborlist[ai][0],neighborlist[ai][1]], | |
b=[neighborlist[bi][0],neighborlist[bi][1]], | |
p=[point[0],point[1]] | |
) | |
(i>=len(open)*2)? | |
i | |
:cross(b-a,p-b)>0? | |
i | |
//On the line case? | |
:(a[0]==p[0] && b[0]==p[0] && ((a[1]<=p[1] && p[1]<=b[1]) || (a[1]>=p[1] && p[1]>=b[1])))? | |
i | |
: | |
componentposition(point,neighborlist,open,i=i+1) | |
; | |
/* | |
FIXME: This doesn't work? - want binary search... | |
function componentposition(point,neighborlist,components)= | |
let( | |
r2c=r2ceil(2*len(components)+1) //radix 2 ceiling | |
) | |
componentpositionstep(point,neighborlist,components,pos=r2c-1,i=r2c/2) | |
; | |
function componentpositionstep(point,neighborlist,components,pos=0,i=1)= | |
let( | |
cur=floor(pos-i), | |
odd=(cur%2==1), | |
path=floor(cur/2), | |
prev=1, | |
next=2, | |
component=components[path], | |
vertexlist=component[0], | |
ai=odd?component[next]:component[prev], | |
bi=odd?vertexlist[len(vertexlist)-1]:vertexlist[0], | |
a=[neighborlist[ai][0],neighborlist[ai][1]], | |
b=[neighborlist[bi][0],neighborlist[bi][1]], | |
p=[point[0],point[1]] | |
) | |
(i<1)? | |
pos | |
:cur>=(len(components)*2)? | |
componentpositionstep(point,neighborlist,components,pos=pos-i,i=i/2) | |
:cross(b-a,p-b)>0? | |
componentpositionstep(point,neighborlist,components,pos=pos-i,i=i/2) | |
: | |
componentpositionstep(point,neighborlist,components,pos=pos,i=i/2) | |
; | |
*/ | |
function checkstarts(point, open,incomp)= | |
let( | |
tocheck=[incomp,incomp-1,incomp+1], | |
mypoint=point[2], | |
prev=1 | |
) | |
(0==len(open))? | |
[false] | |
:(mypoint==open[tocheck[0]][prev])? | |
[true,tocheck[0]] | |
:(tocheck[1]>=0 && mypoint==open[tocheck[1]][prev])? | |
[true,tocheck[1]] | |
:(tocheck[2]<len(open) && mypoint==open[tocheck[2]][prev])? | |
[true,tocheck[2]] | |
: | |
[false] | |
; | |
function checkends(point, open,incomp)= | |
let( | |
tocheck=[incomp,incomp-1,incomp+1], | |
mypoint=point[2], | |
next=2 | |
) | |
(0==len(open))? | |
[false] | |
:(mypoint==open[tocheck[0]][next])? | |
[true,tocheck[0]] | |
:(tocheck[1]>=0 && mypoint==open[tocheck[1]][next])? | |
[true,tocheck[1]] | |
:(tocheck[2]<len(open) && mypoint==open[tocheck[2]][next])? | |
[true,tocheck[2]] | |
: | |
[false] | |
; | |
function sweeptriangulate (neighborlist,sweeplist,closed=[],open=[],i=0)= | |
let( | |
a=neighborlist[sweeplist[i][3]], | |
b=neighborlist[sweeplist[i][4]], | |
point=sweeplist[i], | |
//FIXME: These need to use binary search or something | |
//similar if this is to be O(N log N) | |
pos=componentposition(point,neighborlist,open), | |
incomp=floor(pos/2), | |
starts=checkstarts(point,open,incomp), | |
ends=checkends(point,open,incomp), | |
index=2 //Fake associative array? | |
) | |
//Testing stub | |
(maxtest>0 && i>=maxtest)? | |
[closed,open,"point",point,"incomp",incomp,"pos",pos,"starts",starts,"ends",ends] | |
: | |
(i>len(neighborlist)-1)? | |
//no more points - all the components should be closed. | |
closed | |
:(starts[0] && ends[0])? | |
(starts[1]==ends[1])? //Current point closes off a component | |
sweeptriangulate( | |
neighborlist, | |
sweeplist, | |
closed=concat(closed,componentclose(open[starts[1]],point)), | |
open=concat( | |
(starts[1]>0)? | |
sublist(open,0,starts[1]-1) | |
: | |
[] | |
, | |
(starts[1]<len(open)-1)? | |
sublist(open,starts[1]+1,len(open)-1) | |
: | |
[] | |
), | |
i=i+1 | |
) | |
://Current point hooks together components. | |
//Should die if starts[1]!=ends[1]+1 | |
let( | |
new=componentfuse(neighborlist,open[ends[1]],open[starts[1]],point), | |
newclosed=new[0], | |
newopen=new[1] | |
) | |
sweeptriangulate( | |
neighborlist, | |
sweeplist, | |
closed=concat(closed,newclosed), | |
open=concat( | |
(ends[1]>0)?sublist(open,0,ends[1]-1):[], | |
[newopen], | |
(starts[1]<len(open)-1)?sublist(open,starts[1]+1,len(open)-1):[] | |
), | |
i=i+1 | |
) | |
:(starts[0])?//Current point extends the left end of a component | |
let( | |
new=componentnewprev(neighborlist,open[starts[1]],point), | |
newclosed=new[0], | |
newopen=new[1] | |
) | |
sweeptriangulate( | |
neighborlist, | |
sweeplist, | |
closed=concat(closed,newclosed), | |
open=concat( | |
(starts[1]>0)?sublist(open,0,starts[1]-1):[], | |
[newopen], | |
(starts[1]<len(open)-1)?sublist(open,starts[1]+1,-1):[] | |
), | |
i=i+1 | |
) | |
:(ends[0])?//Current point extends the right end of a component | |
let( | |
new=componentnewnext(neighborlist,open[ends[1]],point), | |
newclosed=new[0], | |
newopen=new[1] | |
) | |
sweeptriangulate( | |
neighborlist, | |
sweeplist, | |
closed=concat(closed,newclosed), | |
open=concat( | |
(ends[1]>0)?sublist(open,0,ends[1]-1):[], | |
[newopen], | |
(ends[1]<len(open)-1)?sublist(open,ends[1]+1,-1):[] | |
), | |
i=i+1 | |
) | |
:(1==pos%2)? // Current point is "in" a component | |
let( | |
newopenlist=componentsplit(neighborlist,open[incomp],point) | |
) | |
sweeptriangulate( | |
neighborlist, | |
sweeplist, | |
closed=closed, | |
open=concat( | |
(incomp>0)?sublist(open,0,incomp-1):[], | |
newopenlist, | |
(incomp<len(open)-1)?sublist(open,incomp+1,-1):[] | |
), | |
i=i+1 | |
) | |
://Current point is 'between' components. | |
sweeptriangulate( | |
neighborlist, | |
sweeplist, | |
closed=closed, | |
open=concat( | |
(incomp>0)?sublist(open,0,incomp-1):[], | |
[ | |
newcomponent(neighborlist,point) | |
], | |
//Since it's "between" the incompth open component is retained. | |
(incomp<=len(open)-1)?sublist(open,incomp,-1):[] | |
), | |
i=i+1 | |
) | |
; | |
function sublist (list,a,b) = | |
let( | |
start=(a<0)?(len(list)+a)%len(list):a, | |
end=(b<0)?(len(list)+b)%len(list):b | |
) | |
(start<=end)? | |
[for (i=[start:end]) list[i]] | |
: | |
[] | |
; | |
function reverse(list)= | |
[for (i=[1:len(list)]) list[len(list)-i]] | |
; | |
function mkums (list,splitpoints) = | |
let( | |
ums=[for (i=[1:len(splitpoints)-1]) sublist(list,splitpoints[i-1]-1,splitpoints[i])], | |
isreturn=3 | |
) | |
[for (i=[0:len(ums)-1]) ums[i][1][isreturn]?reverse(ums[i]):ums[i]] | |
; | |
function triangulateums (ums,stack,i=0) = | |
let( | |
length=len(ums), | |
next=ums[i], | |
last=len(stack)-1 | |
) | |
i>=length-1? | |
[for (j=[1:len(stack)-1]) [stack[j-1],stack[j],ums[length-1]]] | |
:(len(stack)<2 || cross( | |
[stack[last-1][0],stack[last-1][1]]-[stack[last][0],stack[last][1]],[next[0],next[1]]-[stack[last][0],stack[last][1]])<0)? | |
triangulateums(ums,concat(stack,[next]),i+1) | |
: | |
concat( | |
[[stack[last-1],stack[last],next]], | |
triangulateums(ums,sublist(stack,0,-2),i=i) | |
) | |
; | |
function listgt (a,b,list,i=0) = | |
(i>=len(list) || i<0 || list[i]<0 || list[i]>=len(a) || list[i]>= len(b)) ? | |
false | |
:(a[list[i]]==b[list[i]])? | |
listgt(a,b,list,i+1) | |
:(a[list[i]]>b[list[i]])? | |
true | |
:(a[list[i]]<b[list[i]])? | |
false | |
: | |
false | |
; | |
function listeq (a,b,list,i=0) = | |
(i>=len(list) || i<0 || list[i]<0 || list[i]>=len(a) || list[i]>= len(b)) ? | |
false | |
:(a[list[i]]>b[list[i]])? | |
false | |
:(a[list[i]]<b[list[i]])? | |
false | |
:(i<len(list)-1)? | |
listeq(a,b,list,i+1) | |
: | |
true | |
; | |
function listquicksort(arr,list) = | |
!(len(arr)>0)? | |
[] | |
: | |
let( | |
pivot = arr[floor(len(arr)/2)], | |
lesser = [ for (y = arr) if(listgt(pivot,y,list)) y ], | |
equal = [ for (y = arr) if(listeq(pivot,y,list)) y ], | |
greater = [ for (y = arr) if(listgt(y,pivot,list)) y ] | |
) | |
concat( | |
listquicksort(lesser,list), equal, listquicksort(greater,list) | |
); | |
//Sorting by local x, then local y. | |
function mksweeplist(neighborlist)= | |
listquicksort(neighborlist,[0,1]) | |
; | |
function patharea(points,path,localx,localy) = | |
let( | |
da=[for (i=[0:len(path)-1]) cross(points[path[i]]-points[path[0]],points[path[(i+1)%len(path)]]-points[path[i]])] | |
) | |
vsum(da) | |
; | |
//FIXME: Just making unimonotone components so far. | |
function triangulatecomponent(points,component)= | |
let( | |
l=len(component), | |
minxindex=minx(points,component), | |
//negating the x coordinates so that is a sort by decreasing x. | |
//second coordinate is negative on the return leg. | |
sortlist=[for (i=[0:l-1]) [-points[component[i]][0],-points[component[i]][1],i>minxindex?-i:i,i>minxindex,component[i]]], | |
sortedlist=listquicksort(sortlist,[0,2]), | |
switchpoints=[for (i=[1:l-1]) if(i==1 || i==l-1 || sortedlist[i][3]!=sortedlist[i-1][3]) i], | |
// splits=mkums(sortedlist,switchpoints), | |
// cleansplits=[for (split=splits) [for (a=split) a[4]]] | |
umss=mkums(sortedlist,switchpoints), | |
triangulated=flatten([for (ums=umss) triangulateums(ums,[],0)]), | |
cleantriangles=[for (triangle=triangulated) [for (a=triangle) a[4]]] | |
) | |
//["component",component,"sortedlist",sortedlist,"splitpoints",switchpoints,"splits",splits,"cleansplits",cleansplits] | |
// cleansplits | |
cleantriangles | |
; | |
function minx(points,component,i=0)= | |
(i>=len(component)-1 || points[component[i+1]][0]>points[component[i]][0])? | |
i | |
: | |
minx(points,component,i+1) | |
; | |
function mkneighborlist(points,paths,localx,localy)= | |
let( | |
localpoints=[for (i=[0:len(points)-1]) [points[i]*localx,points[i]*localy]], | |
areas=[for (i=[0:len(paths)-1]) patharea(localpoints,paths[i])], | |
list=[ | |
for(i=[0:len(paths)-1]) | |
for(j=[0:len(paths[i])-1]) | |
[ | |
//Sweep line sort values | |
localpoints[paths[i][j]][0], | |
localpoints[paths[i][j]][1], | |
//Index | |
paths[i][j], | |
//neighbors - use oriented area for consistent winding. | |
areas[i]>0? paths[i][(j+1)%len(paths[i])]: paths[i][(len(paths[i])+j-1)%len(paths[i])], | |
areas[i]>0? paths[i][(len(paths[i])+j-1)%len(paths[i])]:paths[i][(j+1)%len(paths[i])], | |
//path number | |
areas[i]>0 | |
] | |
] | |
) | |
//sort by point index. | |
listquicksort(list,[2]) | |
; | |
function nontrivialsegment(points,path,i=0)= | |
let( | |
count=len(path), | |
v=points[path[(i+1)%count]]-points[path[i]] | |
) | |
(i<count-1)? | |
v*v>0? | |
v | |
: | |
nontrivialsegment(points,path,i+1) | |
: | |
undef | |
; | |
function mk3d(list)= | |
(2==len(list[0]))? | |
[for (i=[0:len(list)-1]) concat(list[i],[0])] | |
:(3==len(list[0]))? | |
list | |
: | |
[] | |
; | |
function vsum(v,i=0) = len(v)-1 > i ? v[i] + vsum(v, i+1) : v[i]; | |
function winding_direction(points,path)= | |
let(count=len(path)) | |
vsum([ | |
for(i=[0:count-1]) | |
cross( | |
points[path[(i+1)%count]]-points[path[0]], | |
points[path[(i+2)%count]]-points[path[(i+1)%count]] | |
) | |
]) | |
; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
text =[25.3735,44.776,"moveto", | |
15.3275,44.776,"lineto", | |
15.3275,56.3239,"lineto", | |
15.3275,57.3212,15.1305,57.6166,14.6258,57.6166,"curveto", | |
8.85178,49.2573,5.87246,45.8717,2.97932,44.1851,"curveto", | |
1.89593,43.4833,1.29268,42.8924,1.29268,42.2891,"curveto", | |
1.29268,41.9937,1.39117,41.7967,1.68664,41.5997,"curveto", | |
6.96816,41.5997,"lineto", | |
6.96816,11.6464,"lineto", | |
6.96816,3.2871,9.94749,-0.997211,15.8199,-0.997211,"curveto", | |
20.6952,-0.997211,24.4748,1.39117,27.7619,6.56189,"curveto", | |
26.4692,7.65759,"lineto", | |
24.2778,5.07223,22.6896,4.17351,20.4982,4.17351,"curveto", | |
16.8172,4.17351,15.3275,6.86967,15.3275,13.1361,"curveto", | |
15.3275,41.5997,"lineto", | |
25.3735,41.5997,"lineto", | |
25.3735,44.776,"lineto", | |
"closepath", | |
76.2682,1.48966,"moveto", | |
70.8881,2.38838,70.3957,3.09012,70.2972,10.1445,"curveto", | |
70.2972,29.9533,"lineto", | |
70.2972,40.4055,66.2099,45.7732,58.0475,45.7732,"curveto", | |
52.1751,45.7732,48.0015,43.3848,43.4218,37.4139,"curveto", | |
43.4218,67.6749,"lineto", | |
42.9293,67.9704,"lineto", | |
39.4452,66.7762,36.9584,65.976,31.4799,64.3878,"curveto", | |
28.796,63.5876,"lineto", | |
28.796,61.9994,"lineto", | |
29.19,62.0979,29.3869,62.0979,29.9902,62.0979,"curveto", | |
34.2622,62.0979,35.0624,61.2977,35.0624,57.0257,"curveto", | |
35.0624,10.1445,"lineto", | |
34.8654,2.97932,34.3607,2.1914,28.6975,1.48966,"curveto", | |
28.6975,0.0,"lineto", | |
50.1929,0.0,"lineto", | |
50.1929,1.48966,"lineto", | |
44.419,1.99442,43.6187,3.09012,43.4218,10.1445,"curveto", | |
43.4218,34.1391,"lineto", | |
47.6076,38.7066,50.5869,40.4055,54.5634,40.4055,"curveto", | |
59.4387,40.4055,61.9379,36.8229,61.9379,29.8548,"curveto", | |
61.9379,10.1445,"lineto", | |
61.7286,3.09012,60.8422,1.99442,55.1667,1.48966,"curveto", | |
55.1667,0.0,"lineto", | |
76.2682,0.0,"lineto", | |
76.2682,1.48966,"lineto", | |
"closepath", | |
118.4,16.3247,"moveto", | |
113.624,8.75329,109.339,5.87246,102.974,5.87246,"curveto", | |
97.2988,5.87246,93.0268,8.75329,90.1337,14.4288,"curveto", | |
88.3486,18.2083,87.6468,21.3969,87.4499,27.5649,"curveto", | |
118.105,27.5649,"lineto", | |
117.305,34.0283,116.307,36.9214,113.821,40.11,"curveto", | |
110.841,43.6926,106.261,45.7732,101.078,45.7732,"curveto", | |
96.1047,45.7732,91.4264,43.9881,87.6468,40.6025,"curveto", | |
82.9686,36.5275,80.2847,29.4608,80.2847,21.2985,"curveto", | |
80.2847,7.5591,87.4499,-0.997211,98.8993,-0.997211,"curveto", | |
108.354,-0.997211,115.815,4.87525,119.988,15.623,"curveto", | |
118.4,16.3247,"lineto", | |
"closepath", | |
87.6468,30.7535,"moveto", | |
88.7425,38.5096,92.1281,42.1906,98.1976,42.1906,"curveto", | |
104.267,42.1906,106.655,39.4083,107.948,30.7535,"curveto", | |
87.6468,30.7535,"lineto", | |
"closepath", | |
183.019,42.2891,"moveto", | |
178.538,44.8868,175.558,45.7732,171.57,45.7732,"curveto", | |
159.037,45.7732,149.582,34.73,149.582,20.3012,"curveto", | |
149.582,7.86689,156.144,-0.997211,165.5,-0.997211,"curveto", | |
171.274,-0.997211,176.753,1.58815,181.123,6.36491,"curveto", | |
181.123,-12.3359,"lineto", | |
181.025,-17.9129,179.239,-19.501,172.271,-19.9073,"curveto", | |
172.271,-21.5939,"lineto", | |
195.761,-21.5939,"lineto", | |
195.761,-20.2028,"lineto", | |
190.381,-19.0086,189.692,-18.3068,189.482,-14.0348,"curveto", | |
189.482,45.3792,"lineto", | |
188.387,45.4777,"lineto", | |
183.019,42.2891,"lineto", | |
"closepath", | |
181.123,12.6436,"moveto", | |
181.123,10.2553,180.729,8.95028,179.732,8.06387,"curveto", | |
177.54,6.26642,174.266,5.07223,171.176,5.07223,"curveto", | |
168.085,5.07223,165.402,6.06944,163.419,7.96538,"curveto", | |
160.231,10.9447,158.138,17.3096,158.138,23.9823,"curveto", | |
158.138,35.7272,163.419,42.9909,171.877,42.9909,"curveto", | |
178.045,42.9909,181.123,39.7038,181.123,33.1419,"curveto", | |
181.123,12.6436,"lineto", | |
"closepath", | |
244.861,4.97374,"moveto", | |
244.357,4.97374,"lineto", | |
239.481,5.17072,238.792,5.97095,238.693,10.6492,"curveto", | |
238.693,44.776,"lineto", | |
222.972,44.776,"lineto", | |
222.972,43.0894,"lineto", | |
229.14,42.7939,230.334,41.7967,230.334,36.8229,"curveto", | |
230.334,13.4316,"lineto", | |
230.334,10.6492,229.829,9.25806,228.438,8.16236,"curveto", | |
225.754,5.97095,222.664,4.77676,219.685,4.77676,"curveto", | |
215.807,4.77676,212.618,8.16236,212.618,12.3359,"curveto", | |
212.618,44.776,"lineto", | |
198.091,44.776,"lineto", | |
198.091,43.3848,"lineto", | |
202.769,43.1878,204.16,41.7967,204.259,37.0199,"curveto", | |
204.259,11.9419,"lineto", | |
204.259,4.07502,209.036,-0.997211,216.299,-0.997211,"curveto", | |
219.98,-0.997211,223.858,0.59094,226.555,3.2871,"curveto", | |
230.827,7.5591,"lineto", | |
230.827,-0.701741,"lineto", | |
231.221,-0.898721,"lineto", | |
236.207,1.0957,239.789,2.1914,244.861,3.58257,"curveto", | |
244.861,4.97374,"lineto", | |
"closepath", | |
248.779,0.0,"moveto", | |
272.368,0.0,"lineto", | |
272.368,1.48966,"lineto", | |
265.806,1.99442,265.104,2.88083,265.006,10.1445,"curveto", | |
265.006,45.4777,"lineto", | |
264.612,45.7732,"lineto", | |
249.186,40.307,"lineto", | |
249.186,38.805,"lineto", | |
249.974,38.9158,"lineto", | |
251.168,39.1128,252.362,39.2113,253.359,39.2113,"curveto", | |
255.748,39.2113,256.646,37.6109,256.646,33.2404,"curveto", | |
256.646,10.1445,"lineto", | |
256.449,2.78234,255.551,1.78513,248.779,1.48966,"curveto", | |
248.779,0.0,"lineto", | |
"closepath", | |
259.933,67.9704,"moveto", | |
257.237,67.9704,254.947,65.6805,254.947,62.8982,"curveto", | |
254.947,60.005,257.139,57.8136,259.933,57.8136,"curveto", | |
262.913,57.8136,265.104,60.005,265.104,62.8982,"curveto", | |
265.104,65.779,262.814,67.9704,259.933,67.9704,"curveto", | |
"closepath", | |
314.595,15.5245,"moveto", | |
309.819,8.55632,306.236,6.16793,300.561,6.16793,"curveto", | |
291.413,6.16793,285.135,14.1333,285.135,25.5705,"curveto", | |
285.135,35.9242,290.613,42.8924,298.677,42.8924,"curveto", | |
302.26,42.8924,303.552,41.8952,304.549,38.1156,"curveto", | |
305.14,35.9242,"lineto", | |
305.941,33.0434,307.726,31.3444,309.917,31.3444,"curveto", | |
312.502,31.3444,314.595,33.2404,314.595,35.5303,"curveto", | |
314.595,41.0949,307.627,45.7732,299.268,45.7732,"curveto", | |
294.393,45.7732,289.32,43.7911,285.245,40.2085,"curveto", | |
280.259,35.8257,277.477,29.0545,277.477,21.1015,"curveto", | |
277.477,8.26085,285.344,-0.997211,296.387,-0.997211,"curveto", | |
300.868,-0.997211,304.845,0.59094,308.427,3.68106,"curveto", | |
311.111,5.97095,313.007,8.75329,315.987,14.6258,"curveto", | |
314.595,15.5245,"lineto", | |
"closepath", | |
320.089,0.0,"moveto", | |
343.37,0.0,"lineto", | |
343.37,1.48966,"lineto", | |
341.375,1.58815,"lineto", | |
337.202,1.89593,336.008,2.97932,335.909,6.67269,"curveto", | |
335.909,24.9795,"lineto", | |
349.833,6.36491,"lineto", | |
350.24,5.87246,350.535,5.3677,350.83,5.07223,"curveto", | |
351.631,4.07502,351.926,3.48408,351.926,2.97932,"curveto", | |
351.926,2.09291,351.027,1.48966,349.833,1.48966,"curveto", | |
347.95,1.48966,"lineto", | |
347.95,0.0,"lineto", | |
369.642,0.0,"lineto", | |
369.642,1.48966,"lineto", | |
365.259,1.78513,362.181,3.68106,357.996,8.75329,"curveto", | |
342.779,28.0573,"lineto", | |
345.66,30.7535,"lineto", | |
358.094,41.8952,360.79,43.4833,367.155,43.2863,"curveto", | |
367.155,44.776,"lineto", | |
346.854,44.776,"lineto", | |
346.854,43.3848,"lineto", | |
350.732,43.2863,351.828,42.8924,351.828,41.5997,"curveto", | |
351.828,40.701,350.929,39.4083,349.538,38.1156,"curveto", | |
335.909,25.9767,"lineto", | |
335.909,67.7734,"lineto", | |
335.503,67.9704,"lineto", | |
331.625,66.7762,328.744,65.8775,323.069,64.3878,"curveto", | |
320.089,63.5876,"lineto", | |
320.089,61.9994,"lineto", | |
321.382,62.0979,322.268,62.1964,323.266,62.1964,"curveto", | |
326.651,62.1964,327.55,60.9037,327.55,56.127,"curveto", | |
327.55,8.16236,"lineto", | |
327.451,2.88083,327.144,2.58536,320.089,1.48966,"curveto", | |
320.089,0.0,"lineto", | |
"closepath", | |
409.614,67.7734,"moveto", | |
409.109,67.9704,"lineto", | |
405.034,66.5792,402.35,65.6805,397.573,64.3878,"curveto", | |
394.68,63.5876,"lineto", | |
394.68,61.9994,"lineto", | |
395.283,62.0979,395.579,62.0979,396.379,62.0979,"curveto", | |
400.356,62.0979,401.254,61.1992,401.254,57.0257,"curveto", | |
401.254,5.3677,"lineto", | |
401.254,2.28989,409.614,-0.997211,417.665,-0.997211,"curveto", | |
430.801,-0.997211,440.958,9.94749,440.958,24.1793,"curveto", | |
440.958,36.5275,433.399,45.7732,423.439,45.7732,"curveto", | |
417.37,45.7732,411.596,42.2891,409.614,37.3154,"curveto", | |
409.614,67.7734,"lineto", | |
"closepath", | |
409.614,32.0462,"moveto", | |
409.614,35.9242,414.292,39.5068,419.463,39.5068,"curveto", | |
422.245,39.5068,424.732,38.5096,426.825,36.626,"curveto", | |
430.013,33.5358,432.205,26.7646,432.205,19.5995,"curveto", | |
432.205,8.55632,427.428,2.1914,419.266,2.1914,"curveto", | |
414.083,2.1914,409.614,4.3828,409.614,6.96816,"curveto", | |
409.614,32.0462,"lineto", | |
"closepath", | |
444.876,0.0,"moveto", | |
468.76,0.0,"lineto", | |
468.76,1.48966,"lineto", | |
462.099,1.68664,460.499,3.09012,460.302,8.95028,"curveto", | |
460.302,31.3444,"lineto", | |
460.302,34.533,464.488,39.5068,467.27,39.5068,"curveto", | |
467.873,39.5068,468.76,39.0143,469.856,38.0171,"curveto", | |
471.358,36.5275,472.552,36.0227,473.844,36.0227,"curveto", | |
476.233,36.0227,477.722,37.7217,477.722,40.504,"curveto", | |
477.722,43.7911,475.63,45.7732,472.244,45.7732,"curveto", | |
468.07,45.7732,465.276,43.5818,460.302,36.4167,"curveto", | |
460.302,45.5762,"lineto", | |
459.81,45.7732,"lineto", | |
454.233,43.5818,450.65,42.1906,445.085,40.4055,"curveto", | |
445.085,38.805,"lineto", | |
446.477,39.1128,447.363,39.2113,448.557,39.2113,"curveto", | |
451.056,39.2113,451.943,37.6109,451.943,33.2404,"curveto", | |
451.943,8.35933,"lineto", | |
451.746,3.18861,451.155,2.58536,444.876,1.48966,"curveto", | |
444.876,0.0,"lineto", | |
"closepath", | |
502.563,45.7732,"moveto", | |
489.526,45.7732,480.563,36.2197,480.563,22.4926,"curveto", | |
480.563,8.95028,489.821,-0.997211,502.366,-0.997211,"curveto", | |
514.899,-0.997211,524.453,9.45504,524.453,23.2806,"curveto", | |
524.453,36.4167,515.293,45.7732,502.563,45.7732,"curveto", | |
"closepath", | |
501.271,42.9909,"moveto", | |
509.63,42.9909,515.503,33.4373,515.503,19.8088,"curveto", | |
515.503,8.45782,511.021,1.78513,503.561,1.78513,"curveto", | |
499.67,1.78513,495.989,4.17351,493.909,8.16236,"curveto", | |
491.114,13.3331,489.526,20.3012,489.526,27.3679,"curveto", | |
489.526,36.8229,494.106,42.9909,501.271,42.9909,"curveto", | |
"closepath", | |
584.51,44.776,"moveto", | |
584.51,43.2863,"lineto", | |
587.883,42.5969,588.881,41.8952,588.881,40.2085,"curveto", | |
588.881,38.7066,588.29,36.3182,587.194,33.6343,"curveto", | |
578.231,11.5479,"lineto", | |
569.872,33.8313,"lineto", | |
568.185,38.4111,568.185,38.4111,568.185,39.7038,"curveto", | |
568.185,41.8952,569.281,42.5969,573.959,43.2863,"curveto", | |
573.959,44.776,"lineto", | |
553.757,44.776,"lineto", | |
553.757,43.2863,"lineto", | |
557.438,42.8924,558.632,41.6982,560.626,36.4167,"curveto", | |
561.119,35.0255,562.018,32.5386,562.609,30.852,"curveto", | |
553.56,11.0432,"lineto", | |
543.698,37.0199,"lineto", | |
543.304,38.0171,543.107,39.0143,543.107,39.9992,"curveto", | |
543.107,42.0921,544.203,42.8924,547.687,43.2863,"curveto", | |
547.687,44.776,"lineto", | |
529.774,44.776,"lineto", | |
529.774,43.2863,"lineto", | |
532.064,43.0894,532.852,42.0921,535.044,37.0199,"curveto", | |
548.475,2.97932,"lineto", | |
549.669,-0.09849,550.47,-1.39117,551.073,-1.39117,"curveto", | |
551.565,-1.39117,552.366,-0.19698,553.56,2.48687,"curveto", | |
564.701,26.3707,"lineto", | |
573.763,2.88083,"lineto", | |
575.252,-0.898721,575.449,-1.39117,576.151,-1.39117,"curveto", | |
576.84,-1.39117,577.345,-0.49245,578.933,3.48408,"curveto", | |
592.66,37.9186,"lineto", | |
594.458,42.0921,594.753,42.5969,596.748,43.2863,"curveto", | |
596.748,44.776,"lineto", | |
584.51,44.776,"lineto", | |
"closepath", | |
601.666,0.0,"moveto", | |
622.767,0.0,"lineto", | |
622.767,1.48966,"lineto", | |
617.794,1.78513,616.206,3.09012,616.206,6.67269,"curveto", | |
616.206,34.6315,"lineto", | |
620.982,39.1128,623.161,40.307,626.448,40.307,"curveto", | |
631.324,40.307,633.712,37.2169,633.712,30.655,"curveto", | |
633.712,9.849,"lineto", | |
633.515,3.38559,632.321,1.78513,627.446,1.48966,"curveto", | |
627.446,0.0,"lineto", | |
648.141,0.0,"lineto", | |
648.141,1.48966,"lineto", | |
643.266,1.99442,642.17,3.18861,642.071,8.06387,"curveto", | |
642.071,30.852,"lineto", | |
642.071,40.2085,637.701,45.7732,630.326,45.7732,"curveto", | |
625.759,45.7732,622.669,44.0866,615.898,37.7217,"curveto", | |
615.898,45.5762,"lineto", | |
615.208,45.7732,"lineto", | |
610.025,43.8896,606.652,42.7939,601.469,41.3042,"curveto", | |
601.469,39.6053,"lineto", | |
602.171,39.9007,603.069,39.9992,604.165,39.9992,"curveto", | |
606.947,39.9992,607.846,38.5096,607.846,33.6343,"curveto", | |
607.846,8.95028,"lineto", | |
607.748,3.09012,606.652,1.78513,601.666,1.48966,"curveto", | |
601.666,0.0,"lineto", | |
"closepath", | |
705.631,44.776,"moveto", | |
693.382,44.776,"lineto", | |
693.382,56.3239,"lineto", | |
693.382,62.1964,695.278,65.1757,699.057,65.1757,"curveto", | |
701.248,65.1757,702.541,64.1908,704.339,61.2977,"curveto", | |
705.927,58.7123,707.121,57.7151,708.808,57.7151,"curveto", | |
711.196,57.7151,712.993,59.5126,712.993,61.8024,"curveto", | |
712.993,65.385,708.611,67.9704,702.64,67.9704,"curveto", | |
696.373,67.9704,691.203,65.2865,688.605,60.8052,"curveto", | |
686.019,56.3239,685.232,52.7414,685.133,44.776,"curveto", | |
676.971,44.776,"lineto", | |
676.971,41.5997,"lineto", | |
685.133,41.5997,"lineto", | |
685.133,10.3538,"lineto", | |
684.924,2.88083,683.939,1.78513,676.872,1.48966,"curveto", | |
676.872,0.0,"lineto", | |
702.738,0.0,"lineto", | |
702.738,1.48966,"lineto", | |
694.576,1.78513,693.492,2.88083,693.492,10.3538,"curveto", | |
693.492,41.5997,"lineto", | |
705.631,41.5997,"lineto", | |
705.631,44.776,"lineto", | |
"closepath", | |
733.058,45.7732,"moveto", | |
720.02,45.7732,711.057,36.2197,711.057,22.4926,"curveto", | |
711.057,8.95028,720.316,-0.997211,732.861,-0.997211,"curveto", | |
745.394,-0.997211,754.947,9.45504,754.947,23.2806,"curveto", | |
754.947,36.4167,745.788,45.7732,733.058,45.7732,"curveto", | |
"closepath", | |
731.765,42.9909,"moveto", | |
740.124,42.9909,745.997,33.4373,745.997,19.8088,"curveto", | |
745.997,8.45782,741.516,1.78513,734.055,1.78513,"curveto", | |
730.165,1.78513,726.483,4.17351,724.403,8.16236,"curveto", | |
721.608,13.3331,720.02,20.3012,720.02,27.3679,"curveto", | |
720.02,36.8229,724.6,42.9909,731.765,42.9909,"curveto", | |
"closepath", | |
785.839,0.0,"moveto", | |
805.845,0.0,"lineto", | |
805.845,1.48966,"lineto", | |
802.755,1.48966,800.773,3.09012,797.682,7.46061,"curveto", | |
784.94,26.9739,"lineto", | |
793.201,38.9158,"lineto", | |
795.097,41.5997,797.978,43.0894,801.265,43.2863,"curveto", | |
801.265,44.776,"lineto", | |
785.544,44.776,"lineto", | |
785.544,43.2863,"lineto", | |
788.523,43.0894,789.52,42.4984,789.52,41.0949,"curveto", | |
789.52,39.9007,788.326,37.7217,785.839,34.6315,"curveto", | |
785.347,34.0283,784.152,32.2431,782.86,30.2487,"curveto", | |
782.06,31.4429,"lineto", | |
780.57,33.7328,779.671,35.0255,779.474,35.4318,"curveto", | |
777.578,38.5096,776.889,40.11,776.889,41.0949,"curveto", | |
776.889,42.5969,778.181,43.1878,781.161,43.2863,"curveto", | |
781.161,44.776,"lineto", | |
760.564,44.776,"lineto", | |
760.564,43.2863,"lineto", | |
761.463,43.2863,"lineto", | |
764.442,43.2863,766.043,41.9937,769.12,37.3154,"curveto", | |
778.477,22.9851,"lineto", | |
767.126,6.56189,"lineto", | |
764.147,2.48687,763.149,1.78513,759.862,1.48966,"curveto", | |
759.862,0.0,"lineto", | |
774.291,0.0,"lineto", | |
774.291,1.48966,"lineto", | |
771.41,1.48966,770.315,1.99442,770.315,3.2871,"curveto", | |
770.315,3.97653,770.918,5.26921,772.309,7.36212,"curveto", | |
780.164,19.5995,"lineto", | |
789.225,5.67548,"lineto", | |
789.619,5.07223,789.816,4.57978,789.816,3.87804,"curveto", | |
789.816,2.09291,789.126,1.68664,785.839,1.48966,"curveto", | |
785.839,0.0,"lineto", | |
"closepath", | |
852.378,45.4777,"moveto", | |
851.886,45.7732,"lineto", | |
845.706,43.3848,841.926,42.0921,836.361,40.4055,"curveto", | |
836.361,38.805,"lineto", | |
836.854,38.9158,"lineto", | |
838.343,39.1128,839.845,39.2113,840.83,39.2113,"curveto", | |
843.12,39.2113,844.019,37.5124,844.019,33.2404,"curveto", | |
844.019,-4.48129,"lineto", | |
844.019,-12.0404,843.723,-14.5273,842.628,-16.5217,"curveto", | |
842.025,-17.5189,840.633,-18.3068,839.242,-18.3068,"curveto", | |
837.753,-18.3068,836.755,-17.6174,835.069,-15.5245,"curveto", | |
833.271,-13.2346,831.88,-12.3359,830.292,-12.3359,"curveto", | |
828.002,-12.3359,826.205,-14.0348,826.205,-16.2262,"curveto", | |
826.205,-19.4025,830.083,-21.6924,835.561,-21.6924,"curveto", | |
839.944,-21.6924,843.92,-20.3012,846.604,-17.8144,"curveto", | |
850.187,-14.6258,852.378,-7.86689,852.378,0.0,"curveto", | |
852.378,45.4777,"lineto", | |
"closepath", | |
847.306,67.9704,"moveto", | |
844.622,67.9704,842.332,65.6805,842.332,62.8982,"curveto", | |
842.332,60.005,844.511,57.8136,847.306,57.8136,"curveto", | |
850.285,57.8136,852.477,60.005,852.477,62.8982,"curveto", | |
852.477,65.779,850.187,67.9704,847.306,67.9704,"curveto", | |
"closepath", | |
908.641,4.97374,"moveto", | |
908.136,4.97374,"lineto", | |
903.261,5.17072,902.571,5.97095,902.473,10.6492,"curveto", | |
902.473,44.776,"lineto", | |
886.751,44.776,"lineto", | |
886.751,43.0894,"lineto", | |
892.919,42.7939,894.113,41.7967,894.113,36.8229,"curveto", | |
894.113,13.4316,"lineto", | |
894.113,10.6492,893.609,9.25806,892.217,8.16236,"curveto", | |
889.534,5.97095,886.443,4.77676,883.464,4.77676,"curveto", | |
879.586,4.77676,876.398,8.16236,876.398,12.3359,"curveto", | |
876.398,44.776,"lineto", | |
861.87,44.776,"lineto", | |
861.87,43.3848,"lineto", | |
866.549,43.1878,867.94,41.7967,868.038,37.0199,"curveto", | |
868.038,11.9419,"lineto", | |
868.038,4.07502,872.815,-0.997211,880.079,-0.997211,"curveto", | |
883.76,-0.997211,887.638,0.59094,890.334,3.2871,"curveto", | |
894.606,7.5591,"lineto", | |
894.606,-0.701741,"lineto", | |
895.0,-0.898721,"lineto", | |
899.986,1.0957,903.568,2.1914,908.641,3.58257,"curveto", | |
908.641,4.97374,"lineto", | |
"closepath", | |
912.559,0.0,"moveto", | |
934.657,0.0,"lineto", | |
934.657,1.48966,"lineto", | |
929.585,1.58815,927.985,2.68385,927.886,6.67269,"curveto", | |
927.886,34.73,"lineto", | |
927.886,34.927,928.686,35.9242,929.376,36.626,"curveto", | |
931.863,38.9158,936.147,40.6025,939.631,40.6025,"curveto", | |
944.014,40.6025,946.193,37.1184,946.193,30.1502,"curveto", | |
946.193,8.55632,"lineto", | |
945.996,2.88083,944.999,1.78513,939.434,1.48966,"curveto", | |
939.434,0.0,"lineto", | |
961.718,0.0,"lineto", | |
961.718,1.48966,"lineto", | |
956.153,1.48966,954.762,3.09012,954.552,9.45504,"curveto", | |
954.552,34.533,"lineto", | |
957.544,38.805,960.733,40.6025,965.411,40.6025,"curveto", | |
971.074,40.6025,972.872,37.9186,972.872,29.6578,"curveto", | |
972.872,8.65481,"lineto", | |
972.674,2.78234,972.071,2.09291,966.297,1.48966,"curveto", | |
966.297,0.0,"lineto", | |
988.088,0.0,"lineto", | |
988.088,1.48966,"lineto", | |
985.503,1.68664,"lineto", | |
982.327,2.1914,981.231,3.68106,981.231,7.5591,"curveto", | |
981.231,28.0573,"lineto", | |
981.231,39.8023,977.34,45.7732,969.683,45.7732,"curveto", | |
963.909,45.7732,958.837,43.1878,953.469,37.4139,"curveto", | |
951.672,43.0894,948.286,45.7732,942.918,45.7732,"curveto", | |
938.437,45.7732,935.753,44.4805,927.492,38.1156,"curveto", | |
927.492,45.5762,"lineto", | |
926.791,45.7732,"lineto", | |
921.521,43.8896,918.136,42.7939,912.867,41.3042,"curveto", | |
912.867,39.6053,"lineto", | |
914.061,39.9007,914.947,39.9992,916.043,39.9992,"curveto", | |
918.628,39.9992,919.527,38.4111,919.527,33.6343,"curveto", | |
919.527,8.45782,"lineto", | |
919.33,2.88083,918.037,1.48966,912.559,1.48966,"curveto", | |
912.559,0.0,"lineto", | |
"closepath", | |
989.261,-21.5939,"moveto", | |
1013.35,-21.5939,"lineto", | |
1013.35,-19.8088,"lineto", | |
1005.88,-19.698,1004.69,-18.7131,1004.59,-12.3359,"curveto", | |
1004.59,3.2871,"lineto", | |
1008.17,0.0,1010.46,-0.997211,1014.65,-0.997211,"curveto", | |
1026.49,-0.997211,1035.54,10.1445,1035.54,24.5856,"curveto", | |
1035.54,36.9214,1028.57,45.7732,1018.92,45.7732,"curveto", | |
1013.35,45.7732,1008.97,43.3848,1004.59,37.9186,"curveto", | |
1004.59,45.5762,"lineto", | |
1004.0,45.7732,"lineto", | |
998.617,43.6926,995.133,42.3876,989.667,40.701,"curveto", | |
989.667,39.1128,"lineto", | |
990.554,39.2113,991.157,39.2113,992.154,39.2113,"curveto", | |
995.54,39.2113,996.229,38.2141,996.229,33.5358,"curveto", | |
996.229,-13.0376,"lineto", | |
996.229,-18.3068,995.133,-19.304,989.261,-19.9073,"curveto", | |
989.261,-21.5939,"lineto", | |
"closepath", | |
1004.59,33.2404,"moveto", | |
1004.59,36.2197,1010.17,39.8023,1014.75,39.8023,"curveto", | |
1022.11,39.8023,1026.98,32.2431,1026.98,20.5967,"curveto", | |
1026.98,9.65202,1022.11,2.1914,1014.94,2.1914,"curveto", | |
1010.26,2.1914,1004.59,5.77397,1004.59,8.75329,"curveto", | |
1004.59,33.2404,"lineto", | |
"closepath", | |
1079.37,16.3247,"moveto", | |
1074.59,8.75329,1070.31,5.87246,1063.94,5.87246,"curveto", | |
1058.27,5.87246,1054.0,8.75329,1051.1,14.4288,"curveto", | |
1049.32,18.2083,1048.62,21.3969,1048.42,27.5649,"curveto", | |
1079.07,27.5649,"lineto", | |
1078.27,34.0283,1077.28,36.9214,1074.79,40.11,"curveto", | |
1071.81,43.6926,1067.23,45.7732,1062.05,45.7732,"curveto", | |
1057.07,45.7732,1052.4,43.9881,1048.62,40.6025,"curveto", | |
1043.94,36.5275,1041.25,29.4608,1041.25,21.2985,"curveto", | |
1041.25,7.5591,1048.42,-0.997211,1059.87,-0.997211,"curveto", | |
1069.32,-0.997211,1076.78,4.87525,1080.96,15.623,"curveto", | |
1079.37,16.3247,"lineto", | |
"closepath", | |
1048.62,30.7535,"moveto", | |
1049.71,38.5096,1053.1,42.1906,1059.17,42.1906,"curveto", | |
1065.24,42.1906,1067.63,39.4083,1068.92,30.7535,"curveto", | |
1048.62,30.7535,"lineto", | |
"closepath", | |
1132.03,5.77397,"moveto", | |
1130.74,5.67548,1130.13,5.67548,1129.74,5.67548,"curveto", | |
1126.25,5.67548,1125.36,6.77118,1125.36,11.3387,"curveto", | |
1125.36,67.7734,"lineto", | |
1124.86,67.9704,"lineto", | |
1120.18,66.3699,1116.8,65.2865,1110.24,63.5876,"curveto", | |
1110.24,61.9994,"lineto", | |
1111.03,62.0979,1111.53,62.0979,1112.42,62.0979,"curveto", | |
1116.11,62.0979,1117.0,61.1007,1117.0,57.0257,"curveto", | |
1117.0,41.5012,"lineto", | |
1113.22,44.6775,1110.53,45.7732,1106.56,45.7732,"curveto", | |
1095.11,45.7732,1085.85,34.533,1085.85,20.3997,"curveto", | |
1085.85,7.65759,1093.21,-0.997211,1104.27,-0.997211,"curveto", | |
1109.83,-0.997211,1113.61,0.997211,1117.0,5.67548,"curveto", | |
1117.0,-0.701741,"lineto", | |
1117.4,-0.997211,"lineto", | |
1132.03,4.17351,"lineto", | |
1132.03,5.77397,"lineto", | |
"closepath", | |
1117.0,10.1445,"moveto", | |
1117.0,9.45504,1116.31,8.26085,1115.31,7.16514,"curveto", | |
1113.61,5.17072,1111.03,4.17351,1108.14,4.17351,"curveto", | |
1099.79,4.17351,1094.41,12.1389,1094.41,24.4748,"curveto", | |
1094.41,35.6287,1099.28,42.9909,1106.85,42.9909,"curveto", | |
1112.22,42.9909,1117.0,38.3126,1117.0,33.0434,"curveto", | |
1117.0,10.1445,"lineto", | |
"closepath", | |
1183.04,45.7732,"moveto", | |
1170.01,45.7732,1161.04,36.2197,1161.04,22.4926,"curveto", | |
1161.04,8.95028,1170.3,-0.997211,1182.85,-0.997211,"curveto", | |
1195.38,-0.997211,1204.93,9.45504,1204.93,23.2806,"curveto", | |
1204.93,36.4167,1195.77,45.7732,1183.04,45.7732,"curveto", | |
"closepath", | |
1181.75,42.9909,"moveto", | |
1190.11,42.9909,1195.98,33.4373,1195.98,19.8088,"curveto", | |
1195.98,8.45782,1191.5,1.78513,1184.04,1.78513,"curveto", | |
1180.15,1.78513,1176.47,4.17351,1174.39,8.16236,"curveto", | |
1171.59,13.3331,1170.01,20.3012,1170.01,27.3679,"curveto", | |
1170.01,36.8229,1174.59,42.9909,1181.75,42.9909,"curveto", | |
"closepath", | |
1255.63,44.776,"moveto", | |
1241.8,44.776,"lineto", | |
1241.8,43.2863,"lineto", | |
1244.98,42.9909,1246.47,41.9937,1246.47,40.11,"curveto", | |
1246.47,39.1128,1246.28,38.1156,1245.88,37.1184,"curveto", | |
1236.02,11.3387,"lineto", | |
1225.88,36.8229,"lineto", | |
1225.27,38.2141,1224.98,39.6053,1224.98,40.504,"curveto", | |
1224.98,42.2891,1226.07,42.9909,1229.56,43.2863,"curveto", | |
1229.56,44.776,"lineto", | |
1210.06,44.776,"lineto", | |
1210.06,43.2863,"lineto", | |
1213.84,43.0894,1214.53,42.0921,1219.11,31.8492,"curveto", | |
1231.05,3.2871,"lineto", | |
1231.24,2.68385,1231.55,1.99442,1231.85,1.19419,"curveto", | |
1232.14,0.39396,1232.44,-0.29547,1232.75,-0.800231,"curveto", | |
1232.94,-1.19419,1233.34,-1.39117,1233.63,-1.39117,"curveto", | |
1234.24,-1.39117,1234.93,-0.09849,1236.43,3.58257,"curveto", | |
1249.16,35.5303,"lineto", | |
1252.05,42.2891,1252.64,42.9909,1255.63,43.2863,"curveto", | |
1255.63,44.776,"lineto", | |
"closepath", | |
1298.76,16.3247,"moveto", | |
1293.99,8.75329,1289.7,5.87246,1283.34,5.87246,"curveto", | |
1277.66,5.87246,1273.39,8.75329,1270.5,14.4288,"curveto", | |
1268.71,18.2083,1268.01,21.3969,1267.81,27.5649,"curveto", | |
1298.47,27.5649,"lineto", | |
1297.67,34.0283,1296.67,36.9214,1294.18,40.11,"curveto", | |
1291.2,43.6926,1286.62,45.7732,1281.44,45.7732,"curveto", | |
1276.47,45.7732,1271.79,43.9881,1268.01,40.6025,"curveto", | |
1263.33,36.5275,1260.65,29.4608,1260.65,21.2985,"curveto", | |
1260.65,7.5591,1267.81,-0.997211,1279.26,-0.997211,"curveto", | |
1288.72,-0.997211,1296.18,4.87525,1300.35,15.623,"curveto", | |
1298.76,16.3247,"lineto", | |
"closepath", | |
1268.01,30.7535,"moveto", | |
1269.1,38.5096,1272.49,42.1906,1278.56,42.1906,"curveto", | |
1284.63,42.1906,1287.02,39.4083,1288.31,30.7535,"curveto", | |
1268.01,30.7535,"lineto", | |
"closepath", | |
1303.05,0.0,"moveto", | |
1326.93,0.0,"lineto", | |
1326.93,1.48966,"lineto", | |
1320.27,1.68664,1318.67,3.09012,1318.48,8.95028,"curveto", | |
1318.48,31.3444,"lineto", | |
1318.48,34.533,1322.66,39.5068,1325.44,39.5068,"curveto", | |
1326.05,39.5068,1326.93,39.0143,1328.03,38.0171,"curveto", | |
1329.53,36.5275,1330.73,36.0227,1332.02,36.0227,"curveto", | |
1334.41,36.0227,1335.9,37.7217,1335.9,40.504,"curveto", | |
1335.9,43.7911,1333.8,45.7732,1330.42,45.7732,"curveto", | |
1326.24,45.7732,1323.45,43.5818,1318.48,36.4167,"curveto", | |
1318.48,45.5762,"lineto", | |
1317.98,45.7732,"lineto", | |
1312.41,43.5818,1308.82,42.1906,1303.26,40.4055,"curveto", | |
1303.26,38.805,"lineto", | |
1304.65,39.1128,1305.54,39.2113,1306.73,39.2113,"curveto", | |
1309.23,39.2113,1310.12,37.6109,1310.12,33.2404,"curveto", | |
1310.12,8.35933,"lineto", | |
1309.92,3.18861,1309.33,2.58536,1303.05,1.48966,"curveto", | |
1303.05,0.0,"lineto", | |
"closepath", | |
1386.23,44.776,"moveto", | |
1376.18,44.776,"lineto", | |
1376.18,56.3239,"lineto", | |
1376.18,57.3212,1375.98,57.6166,1375.48,57.6166,"curveto", | |
1369.71,49.2573,1366.73,45.8717,1363.83,44.1851,"curveto", | |
1362.75,43.4833,1362.15,42.8924,1362.15,42.2891,"curveto", | |
1362.15,41.9937,1362.25,41.7967,1362.54,41.5997,"curveto", | |
1367.82,41.5997,"lineto", | |
1367.82,11.6464,"lineto", | |
1367.82,3.2871,1370.8,-0.997211,1376.67,-0.997211,"curveto", | |
1381.55,-0.997211,1385.33,1.39117,1388.62,6.56189,"curveto", | |
1387.32,7.65759,"lineto", | |
1385.13,5.07223,1383.54,4.17351,1381.35,4.17351,"curveto", | |
1377.67,4.17351,1376.18,6.86967,1376.18,13.1361,"curveto", | |
1376.18,41.5997,"lineto", | |
1386.23,41.5997,"lineto", | |
1386.23,44.776,"lineto", | |
"closepath", | |
1437.12,1.48966,"moveto", | |
1431.74,2.38838,1431.25,3.09012,1431.15,10.1445,"curveto", | |
1431.15,29.9533,"lineto", | |
1431.15,40.4055,1427.06,45.7732,1418.9,45.7732,"curveto", | |
1413.03,45.7732,1408.86,43.3848,1404.28,37.4139,"curveto", | |
1404.28,67.6749,"lineto", | |
1403.78,67.9704,"lineto", | |
1400.3,66.7762,1397.81,65.976,1392.33,64.3878,"curveto", | |
1389.65,63.5876,"lineto", | |
1389.65,61.9994,"lineto", | |
1390.04,62.0979,1390.24,62.0979,1390.84,62.0979,"curveto", | |
1395.12,62.0979,1395.92,61.2977,1395.92,57.0257,"curveto", | |
1395.92,10.1445,"lineto", | |
1395.72,2.97932,1395.21,2.1914,1389.55,1.48966,"curveto", | |
1389.55,0.0,"lineto", | |
1411.05,0.0,"lineto", | |
1411.05,1.48966,"lineto", | |
1405.27,1.99442,1404.47,3.09012,1404.28,10.1445,"curveto", | |
1404.28,34.1391,"lineto", | |
1408.46,38.7066,1411.44,40.4055,1415.42,40.4055,"curveto", | |
1420.29,40.4055,1422.79,36.8229,1422.79,29.8548,"curveto", | |
1422.79,10.1445,"lineto", | |
1422.58,3.09012,1421.7,1.99442,1416.02,1.48966,"curveto", | |
1416.02,0.0,"lineto", | |
1437.12,0.0,"lineto", | |
1437.12,1.48966,"lineto", | |
"closepath", | |
1479.25,16.3247,"moveto", | |
1474.48,8.75329,1470.19,5.87246,1463.83,5.87246,"curveto", | |
1458.15,5.87246,1453.88,8.75329,1450.99,14.4288,"curveto", | |
1449.2,18.2083,1448.5,21.3969,1448.3,27.5649,"curveto", | |
1478.96,27.5649,"lineto", | |
1478.16,34.0283,1477.16,36.9214,1474.67,40.11,"curveto", | |
1471.7,43.6926,1467.12,45.7732,1461.93,45.7732,"curveto", | |
1456.96,45.7732,1452.28,43.9881,1448.5,40.6025,"curveto", | |
1443.82,36.5275,1441.14,29.4608,1441.14,21.2985,"curveto", | |
1441.14,7.5591,1448.3,-0.997211,1459.75,-0.997211,"curveto", | |
1469.21,-0.997211,1476.67,4.87525,1480.84,15.623,"curveto", | |
1479.25,16.3247,"lineto", | |
"closepath", | |
1448.5,30.7535,"moveto", | |
1449.6,38.5096,1452.98,42.1906,1459.05,42.1906,"curveto", | |
1465.12,42.1906,1467.51,39.4083,1468.8,30.7535,"curveto", | |
1448.5,30.7535,"lineto", | |
"closepath", | |
1510.14,0.0,"moveto", | |
1533.62,0.0,"lineto", | |
1533.62,1.48966,"lineto", | |
1527.35,1.78513,1526.26,2.78234,1526.16,8.35933,"curveto", | |
1526.16,67.7734,"lineto", | |
1525.76,67.9704,"lineto", | |
1520.69,66.3699,1517.0,65.2865,1509.94,63.5876,"curveto", | |
1509.94,61.9994,"lineto", | |
1510.53,61.9994,"lineto", | |
1511.63,62.0979,1512.82,62.1964,1513.62,62.1964,"curveto", | |
1516.8,62.1964,1517.8,60.8052,1517.8,56.127,"curveto", | |
1517.8,8.65481,"lineto", | |
1517.7,3.2871,1516.31,1.89593,1510.14,1.48966,"curveto", | |
1510.14,0.0,"lineto", | |
"closepath", | |
1579.83,6.56189,"moveto", | |
1578.14,5.17072,1576.94,4.67827,1575.45,4.67827,"curveto", | |
1573.16,4.67827,1572.47,6.06944,1572.47,10.4522,"curveto", | |
1572.47,29.8548,"lineto", | |
1572.47,35.0255,1571.97,37.9186,1570.48,40.307,"curveto", | |
1568.29,43.8896,1564.01,45.7732,1558.14,45.7732,"curveto", | |
1548.79,45.7732,1541.42,40.898,1541.42,34.6315,"curveto", | |
1541.42,32.3416,1543.31,30.3472,1545.7,30.3472,"curveto", | |
1548.08,30.3472,1550.18,32.3416,1550.18,34.533,"curveto", | |
1550.18,34.927,1550.08,35.4318,1549.98,36.1212,"curveto", | |
1549.78,37.0199,1549.68,37.8201,1549.68,38.5096,"curveto", | |
1549.68,41.1934,1552.86,43.3848,1556.85,43.3848,"curveto", | |
1561.72,43.3848,1564.41,40.504,1564.41,35.124,"curveto", | |
1564.41,29.0545,"lineto", | |
1549.18,22.9851,1547.39,22.0864,1543.11,18.3068,"curveto", | |
1540.92,16.3247,1539.53,12.9391,1539.53,9.65202,"curveto", | |
1539.53,3.38559,1543.91,-0.997211,1549.98,-0.997211,"curveto", | |
1554.35,-0.997211,1558.44,1.0957,1564.51,6.26642,"curveto", | |
1565.0,0.997211,1566.8,-0.997211,1570.87,-0.997211,"curveto", | |
1574.26,-0.997211,1576.35,0.19698,1579.83,3.97653,"curveto", | |
1579.83,6.56189,"lineto", | |
"closepath", | |
1564.41,12.2374,"moveto", | |
1564.41,9.25806,1563.9,8.16236,1561.82,6.96816,"curveto", | |
1559.34,5.57699,1556.64,4.77676,1554.56,4.77676,"curveto", | |
1551.08,4.77676,1548.28,8.16236,1548.28,12.4344,"curveto", | |
1548.28,12.8406,"lineto", | |
1548.38,18.8116,1552.76,22.5911,1564.41,26.6662,"curveto", | |
1564.41,12.2374,"lineto", | |
"closepath", | |
1621.84,13.4316,"moveto", | |
1620.05,13.8378,"lineto", | |
1618.26,4.48129,1616.87,3.2871,1607.32,2.97932,"curveto", | |
1593.58,2.97932,"lineto", | |
1620.35,43.2863,"lineto", | |
1620.35,44.776,"lineto", | |
1585.82,44.776,"lineto", | |
1585.51,33.0434,"lineto", | |
1587.31,33.0434,"lineto", | |
1588.11,40.11,1589.5,41.5997,1595.67,41.7967,"curveto", | |
1609.4,41.7967,"lineto", | |
1582.93,1.48966,"lineto", | |
1582.93,0.0,"lineto", | |
1620.45,0.0,"lineto", | |
1621.84,13.4316,"lineto", | |
"closepath", | |
1671.92,44.776,"moveto", | |
1658.47,44.776,"lineto", | |
1658.47,43.2863,"lineto", | |
1661.66,43.2863,1663.25,42.3876,1663.25,40.7995,"curveto", | |
1663.25,40.4055,1663.15,39.8023,1662.86,39.1128,"curveto", | |
1653.2,11.6464,"lineto", | |
1641.75,36.8229,"lineto", | |
1641.16,38.2141,1640.76,39.6053,1640.76,40.6025,"curveto", | |
1640.76,42.3876,1642.26,43.0894,1646.53,43.2863,"curveto", | |
1646.53,44.776,"lineto", | |
1626.03,44.776,"lineto", | |
1626.03,43.3848,"lineto", | |
1628.62,42.9909,1630.32,41.8952,1631.1,40.2085,"curveto", | |
1642.46,15.7215,"lineto", | |
1643.65,13.0376,1643.75,12.9391,1644.24,11.9419,"curveto", | |
1647.04,6.96816,1648.62,3.2871,1648.62,1.78513,"curveto", | |
1648.62,0.19698,1646.33,-5.87246,1644.65,-8.95028,"curveto", | |
1643.14,-11.4495,1641.06,-13.3331,1639.67,-13.3331,"curveto", | |
1639.07,-13.3331,1638.17,-13.1361,1637.08,-12.6436,"curveto", | |
1635.29,-11.9419,1633.49,-11.5479,1631.9,-11.5479,"curveto", | |
1629.52,-11.5479,1627.62,-13.4316,1627.62,-15.9184,"curveto", | |
1627.62,-19.2055,1630.71,-21.6924,1634.99,-21.6924,"curveto", | |
1641.75,-21.6924,1646.33,-16.2262,1651.81,-1.78513,"curveto", | |
1667.14,38.805,"lineto", | |
1668.43,41.9937,1669.53,42.9909,1671.92,43.2863,"curveto", | |
1671.92,44.776,"lineto", | |
"closepath", | |
1748.5,5.77397,"moveto", | |
1747.21,5.67548,1746.61,5.67548,1746.21,5.67548,"curveto", | |
1742.73,5.67548,1741.83,6.77118,1741.83,11.3387,"curveto", | |
1741.83,67.7734,"lineto", | |
1741.34,67.9704,"lineto", | |
1736.66,66.3699,1733.27,65.2865,1726.71,63.5876,"curveto", | |
1726.71,61.9994,"lineto", | |
1727.5,62.0979,1728.0,62.0979,1728.89,62.0979,"curveto", | |
1732.58,62.0979,1733.47,61.1007,1733.47,57.0257,"curveto", | |
1733.47,41.5012,"lineto", | |
1729.69,44.6775,1727.01,45.7732,1723.03,45.7732,"curveto", | |
1711.58,45.7732,1702.32,34.533,1702.32,20.3997,"curveto", | |
1702.32,7.65759,1709.68,-0.997211,1720.74,-0.997211,"curveto", | |
1726.3,-0.997211,1730.08,0.997211,1733.47,5.67548,"curveto", | |
1733.47,-0.701741,"lineto", | |
1733.88,-0.997211,"lineto", | |
1748.5,4.17351,"lineto", | |
1748.5,5.77397,"lineto", | |
"closepath", | |
1733.47,10.1445,"moveto", | |
1733.47,9.45504,1732.78,8.26085,1731.78,7.16514,"curveto", | |
1730.08,5.17072,1727.5,4.17351,1724.62,4.17351,"curveto", | |
1716.26,4.17351,1710.88,12.1389,1710.88,24.4748,"curveto", | |
1710.88,35.6287,1715.75,42.9909,1723.32,42.9909,"curveto", | |
1728.69,42.9909,1733.47,38.3126,1733.47,33.0434,"curveto", | |
1733.47,10.1445,"lineto", | |
"closepath", | |
1774.52,45.7732,"moveto", | |
1761.48,45.7732,1752.52,36.2197,1752.52,22.4926,"curveto", | |
1752.52,8.95028,1761.78,-0.997211,1774.32,-0.997211,"curveto", | |
1786.85,-0.997211,1796.41,9.45504,1796.41,23.2806,"curveto", | |
1796.41,36.4167,1787.25,45.7732,1774.52,45.7732,"curveto", | |
"closepath", | |
1773.23,42.9909,"moveto", | |
1781.58,42.9909,1787.46,33.4373,1787.46,19.8088,"curveto", | |
1787.46,8.45782,1782.98,1.78513,1775.52,1.78513,"curveto", | |
1771.63,1.78513,1767.94,4.17351,1765.86,8.16236,"curveto", | |
1763.07,13.3331,1761.48,20.3012,1761.48,27.3679,"curveto", | |
1761.48,36.8229,1766.06,42.9909,1773.23,42.9909,"curveto", | |
"closepath", | |
1846.41,38.6081,"moveto", | |
1846.41,42.4984,"lineto", | |
1838.75,42.4984,"lineto", | |
1836.66,42.4984,1835.27,42.7939,1833.27,43.4833,"curveto", | |
1831.08,44.2835,"lineto", | |
1828.49,45.2808,1825.71,45.7732,1823.13,45.7732,"curveto", | |
1813.87,45.7732,1806.51,38.7066,1806.51,29.5593,"curveto", | |
1806.51,23.2806,1809.09,19.501,1815.75,16.2262,"curveto", | |
1813.17,13.8378,"lineto", | |
1811.09,11.8434,1809.89,10.7477,1809.58,10.3538,"curveto", | |
1807.5,8.16236,1806.9,7.06665,1806.9,5.3677,"curveto", | |
1806.9,3.18861,1808.0,2.09291,1812.17,0.09849,"curveto", | |
1805.0,-5.07223,1802.42,-8.35933,1802.42,-12.0404,"curveto", | |
1802.42,-17.3096,1810.09,-21.6924,1819.64,-21.6924,"curveto", | |
1827.1,-21.6924,1834.86,-19.1071,1840.04,-14.9212,"curveto", | |
1843.82,-11.8434,1845.51,-8.65481,1845.51,-4.87525,"curveto", | |
1845.51,1.29268,1840.83,5.3677,1833.47,5.77397,"curveto", | |
1820.64,6.36491,"lineto", | |
1815.26,6.56189,1812.87,7.46061,1812.87,9.06108,"curveto", | |
1812.87,11.0432,1816.16,14.5273,1818.84,15.3275,"curveto", | |
1822.42,15.032,1824.32,14.8227,1824.52,14.8227,"curveto", | |
1828.2,14.8227,1832.17,16.3247,1835.27,19.0086,"curveto", | |
1838.55,21.7909,1840.04,25.275,1840.04,30.2487,"curveto", | |
1840.04,33.1419,1839.54,35.4318,1838.15,38.6081,"curveto", | |
1846.41,38.6081,"lineto", | |
"closepath", | |
1814.26,-0.19698,"moveto", | |
1817.65,-0.898721,1825.42,-1.48966,1830.49,-1.48966,"curveto", | |
1839.44,-1.48966,1842.73,-2.78234,1842.73,-6.36491,"curveto", | |
1842.73,-12.1389,1835.17,-16.0169,1823.91,-16.0169,"curveto", | |
1815.06,-16.0169,1809.39,-13.1361,1809.39,-8.75329,"curveto", | |
1809.39,-6.4634,1810.29,-4.97374,1814.26,-0.19698,"curveto", | |
"closepath", | |
1814.77,33.6343,"moveto", | |
1814.77,39.5068,1817.55,42.9909,1822.13,42.9909,"curveto", | |
1825.21,42.9909,1827.8,41.3042,1829.39,38.3126,"curveto", | |
1831.28,34.8285,1832.37,30.3472,1832.37,26.3707,"curveto", | |
1832.37,20.7937,1829.59,17.3096,1825.01,17.3096,"curveto", | |
1818.84,17.3096,1814.77,23.7853,1814.77,33.3389,"curveto", | |
1814.77,33.6343,"lineto", | |
"closepath" | |
]; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment