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 hidden or 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 hidden or 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 hidden or 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