@arcgis/core
Version:
ArcGIS Maps SDK for JavaScript: A complete 2D and 3D mapping and data visualization API
3 lines (2 loc) • 6.85 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.0.8/LICENSE.txt */
import{thinLineHalfWidthThreshold as t}from"./definitions.js";function e(t,e){return t.x===e.x&&t.y===e.y}function i(t){if(!t)return;const i=t.length;if(i<=1)return;let x=0;for(let r=1;r<i;r++)e(t[r],t[x])||++x===r||(t[x]=t[r]);t.length=x+1}function x(t,e){return t.x=e.y,t.y=-e.x,t}function r(t,e){return t.x=-e.y,t.y=e.x,t}function n(t,e){return t.x=e.x,t.y=e.y,t}function s(t,e){return t.x=-e.x,t.y=-e.y,t}function y(t){return Math.sqrt(t.x*t.x+t.y*t.y)}function o(t,e){return t.x*e.y-t.y*e.x}function h(t,e){return t.x*e.x+t.y*e.y}function l(t,e,i,x){return t.x=e.x*i+e.y*x,t.y=e.x*x-e.y*i,t}class _{constructor(t,e,i){this._writeVertex=t,this._writeTriangle=e,this._canUseThinTessellation=i,this._prevNormal={x:void 0,y:void 0},this._nextNormal={x:void 0,y:void 0},this._textureNormalLeft={x:0,y:1},this._textureNormalRight={x:0,y:-1},this._textureNormal={x:void 0,y:void 0},this._joinNormal={x:void 0,y:void 0},this._inner={x:void 0,y:void 0},this._outer={x:void 0,y:void 0},this._roundStart={x:void 0,y:void 0},this._roundEnd={x:void 0,y:void 0},this._startBreak={x:void 0,y:void 0},this._endBreak={x:void 0,y:void 0},this._innerPrev={x:void 0,y:void 0},this._innerNext={x:void 0,y:void 0},this._bevelStart={x:void 0,y:void 0},this._bevelEnd={x:void 0,y:void 0},this._bevelMiddle={x:void 0,y:void 0}}tessellate(e,x,r=this._canUseThinTessellation){i(e),r&&x.halfWidth<t&&!x.offset?this._tessellateThin(e,x):this._tessellate(e,x)}_tessellateThin(t,e){if(t.length<2)return;const i=e.wrapDistance||65535;let x=e.initialDistance||0,r=!1,n=t[0].x,s=t[0].y;const y=t.length;for(let o=1;o<y;++o){r&&(r=!1,x=0);let e=t[o].x,y=t[o].y,h=e-n,l=y-s,_=Math.sqrt(h*h+l*l);if(h/=_,l/=_,x+_>i){r=!0;const t=(i-x)/_;_=i-x,e=(1-t)*n+t*e,y=(1-t)*s+t*y,--o}const a=this._writeVertex(n,s,0,0,h,l,l,-h,0,-1,x),c=this._writeVertex(n,s,0,0,h,l,-l,h,0,1,x);x+=_;const d=this._writeVertex(e,y,0,0,h,l,l,-h,0,-1,x),u=this._writeVertex(e,y,0,0,h,l,-l,h,0,1,x);this._writeTriangle(a,c,d),this._writeTriangle(c,d,u),n=e,s=y}}_tessellate(t,i){const _=t[0],a=t[t.length-1],c=e(_,a),d=c?3:2;if(t.length<d)return;const u=i.pixelCoordRatio,v=null!=i.capType?i.capType:0,f=null!=i.joinType?i.joinType:2,w=null!=i.miterLimit?Math.min(i.miterLimit,4):2,g=null!=i.roundLimit?Math.min(i.roundLimit,1.05):1.05,T=null!=i.halfWidth?i.halfWidth:2,m=!!i.textured;let V,b,N,k=null;const p=this._prevNormal,M=this._nextNormal;let E=-1,L=-1;const B=this._joinNormal;let S,j;const P=this._textureNormalLeft,A=this._textureNormalRight,D=this._textureNormal;let U=-1,R=-1;const W=i.wrapDistance||65535;let q=i.initialDistance||0;const X=this._writeVertex,C=this._writeTriangle,z=(t,e,i,x,r,n)=>{const s=X(b,N,S,j,i,x,t,e,r,n,q);return U>=0&&R>=0&&s>=0&&C(U,R,s),U=R,R=s,s};c&&(V=t[t.length-2],M.x=a.x-V.x,M.y=a.y-V.y,L=y(M),M.x/=L,M.y/=L);let F=!1;for(let e=0;e<t.length;++e){if(F&&(F=!1,q=0),V&&(p.x=-M.x,p.y=-M.y,E=L,q+E>W&&(F=!0)),F){const i=(W-q)/E;E=W-q,V={x:(1-i)*V.x+i*t[e].x,y:(1-i)*V.y+i*t[e].y},--e}else V=t[e];b=V.x,N=V.y;const i=e<=0&&!F,_=e===t.length-1;if(i||(q+=E),k=_?c?t[1]:null:t[e+1],k?(M.x=k.x-b,M.y=k.y-N,L=y(M),M.x/=L,M.y/=L):(M.x=void 0,M.y=void 0),!c){if(i){r(B,M),S=B.x,j=B.y,2===v&&(z(-M.y-M.x,M.x-M.y,M.x,M.y,0,-1),z(M.y-M.x,-M.x-M.y,M.x,M.y,0,1)),1===v&&(z(-M.y-M.x,M.x-M.y,M.x,M.y,-1,-1),z(M.y-M.x,-M.x-M.y,M.x,M.y,-1,1)),1!==v&&0!==v||(z(-M.y,M.x,M.x,M.y,0,-1),z(M.y,-M.x,M.x,M.y,0,1));continue}if(_){x(B,p),S=B.x,j=B.y,1!==v&&0!==v||(z(p.y,-p.x,-p.x,-p.y,0,-1),z(-p.y,p.x,-p.x,-p.y,0,1)),2===v&&(z(p.y-p.x,-p.x-p.y,-p.x,-p.y,0,-1),z(-p.y-p.x,p.x-p.y,-p.x,-p.y,0,1)),1===v&&(z(p.y-p.x,-p.x-p.y,-p.x,-p.y,1,-1),z(-p.y-p.x,p.x-p.y,-p.x,-p.y,1,1));continue}}let a,d,X=-o(p,M);if(Math.abs(X)<.01)h(p,M)>0?(B.x=p.x,B.y=p.y,X=1,a=Number.MAX_VALUE,d=!0):(r(B,M),X=1,a=1,d=!1);else{B.x=(p.x+M.x)/X,B.y=(p.y+M.y)/X,a=y(B);const t=(a-1)*T*u;d=a>4||t>E&&t>L}S=B.x,j=B.y;let C=f;switch(f){case 0:a<1.05&&(C=2);break;case 1:a<g&&(C=2);break;case 2:a>w&&(C=0)}switch(C){case 2:if(z(B.x,B.y,-p.x,-p.y,0,-1),z(-B.x,-B.y,-p.x,-p.y,0,1),_)break;if(m){const t=F?0:q;U=this._writeVertex(b,N,S,j,M.x,M.y,B.x,B.y,0,-1,t),R=this._writeVertex(b,N,S,j,M.x,M.y,-B.x,-B.y,0,1,t)}break;case 0:{const t=X<0;let e,i,y,o;if(t){const t=U;U=R,R=t,e=P,i=A}else e=A,i=P;if(d)y=t?r(this._innerPrev,p):x(this._innerPrev,p),o=t?x(this._innerNext,M):r(this._innerNext,M);else{const e=t?s(this._inner,B):n(this._inner,B);y=e,o=e}const h=t?x(this._bevelStart,p):r(this._bevelStart,p);z(y.x,y.y,-p.x,-p.y,e.x,e.y);const a=z(h.x,h.y,-p.x,-p.y,i.x,i.y);if(_)break;const c=t?r(this._bevelEnd,M):x(this._bevelEnd,M);if(d){const t=this._writeVertex(b,N,S,j,-p.x,-p.y,0,0,0,0,q);U=this._writeVertex(b,N,S,j,M.x,M.y,o.x,o.y,e.x,e.y,q),R=this._writeVertex(b,N,S,j,M.x,M.y,c.x,c.y,i.x,i.y,q),this._writeTriangle(a,t,R)}else{if(m){const t=this._bevelMiddle;t.x=(h.x+c.x)/2,t.y=(h.y+c.y)/2,l(D,t,-p.x,-p.y),z(t.x,t.y,-p.x,-p.y,D.x,D.y),l(D,t,M.x,M.y),U=this._writeVertex(b,N,S,j,M.x,M.y,t.x,t.y,D.x,D.y,q),R=this._writeVertex(b,N,S,j,M.x,M.y,o.x,o.y,e.x,e.y,q)}else{const t=U;U=R,R=t}z(c.x,c.y,M.x,M.y,i.x,i.y)}if(t){const t=U;U=R,R=t}break}case 1:{const t=X<0;let e,i;if(t){const t=U;U=R,R=t,e=P,i=A}else e=A,i=P;const y=t?s(this._inner,B):n(this._inner,B);let o,c;d?(o=t?r(this._innerPrev,p):x(this._innerPrev,p),c=t?x(this._innerNext,M):r(this._innerNext,M)):(o=y,c=y);const u=t?x(this._roundStart,p):r(this._roundStart,p),v=t?r(this._roundEnd,M):x(this._roundEnd,M),f=z(o.x,o.y,-p.x,-p.y,e.x,e.y),w=z(u.x,u.y,-p.x,-p.y,i.x,i.y);if(_)break;const g=this._writeVertex(b,N,S,j,-p.x,-p.y,0,0,0,0,q);d||this._writeTriangle(U,R,g);const T=s(this._outer,y),V=this._writeVertex(b,N,S,j,M.x,M.y,v.x,v.y,i.x,i.y,q);let k,E;const L=a>2;if(L){let e;a!==Number.MAX_VALUE?(T.x/=a,T.y/=a,e=h(p,T),e=(a*(e*e-1)+1)/e):e=-1,k=t?x(this._startBreak,p):r(this._startBreak,p),k.x+=p.x*e,k.y+=p.y*e,E=t?r(this._endBreak,M):x(this._endBreak,M),E.x+=M.x*e,E.y+=M.y*e}l(D,T,-p.x,-p.y);const W=this._writeVertex(b,N,S,j,-p.x,-p.y,T.x,T.y,D.x,D.y,q);l(D,T,M.x,M.y);const C=m?this._writeVertex(b,N,S,j,M.x,M.y,T.x,T.y,D.x,D.y,q):W,F=g,G=m?this._writeVertex(b,N,S,j,M.x,M.y,0,0,0,0,q):g;let H=-1,I=-1;if(L&&(l(D,k,-p.x,-p.y),H=this._writeVertex(b,N,S,j,-p.x,-p.y,k.x,k.y,D.x,D.y,q),l(D,E,M.x,M.y),I=this._writeVertex(b,N,S,j,M.x,M.y,E.x,E.y,D.x,D.y,q)),m?L?(this._writeTriangle(F,w,H),this._writeTriangle(F,H,W),this._writeTriangle(G,C,I),this._writeTriangle(G,I,V)):(this._writeTriangle(F,w,W),this._writeTriangle(G,C,V)):L?(this._writeTriangle(g,w,H),this._writeTriangle(g,H,I),this._writeTriangle(g,I,V)):(this._writeTriangle(g,w,W),this._writeTriangle(g,C,V)),d?(U=this._writeVertex(b,N,S,j,M.x,M.y,c.x,c.y,e.x,e.y,q),R=V):(U=m?this._writeVertex(b,N,S,j,M.x,M.y,c.x,c.y,e.x,e.y,q):f,this._writeTriangle(U,G,V),R=V),t){const t=U;U=R,R=t}break}}}}}export{_ as LineTessellation};