webgl2-sdf 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/browser/index.min.js +1 -0
  2. package/node/bezier/bezier-curves-to-line-segs.js +31 -0
  3. package/node/bezier/bezier-curves-to-line-segs.js.map +1 -0
  4. package/node/bezier/eval-de-casteljau.js +61 -0
  5. package/node/bezier/eval-de-casteljau.js.map +1 -0
  6. package/node/bezier/from-to/from-to-2.js +134 -0
  7. package/node/bezier/from-to/from-to-2.js.map +1 -0
  8. package/node/bezier/from-to/from-to-3.js +159 -0
  9. package/node/bezier/from-to/from-to-3.js.map +1 -0
  10. package/node/bezier/from-to/from-to.js +21 -0
  11. package/node/bezier/from-to/from-to.js.map +1 -0
  12. package/node/bezier/is-cubic-obtuse.js +24 -0
  13. package/node/bezier/is-cubic-obtuse.js.map +1 -0
  14. package/node/bezier/is-quad-obtuse.js +20 -0
  15. package/node/bezier/is-quad-obtuse.js.map +1 -0
  16. package/node/bezier/is-really-point.js +19 -0
  17. package/node/bezier/is-really-point.js.map +1 -0
  18. package/node/bezier/split-by-deviation-from-straight-line-cubic.js +85 -0
  19. package/node/bezier/split-by-deviation-from-straight-line-cubic.js.map +1 -0
  20. package/node/bezier/split-by-deviation-from-straight-line-quad.js +50 -0
  21. package/node/bezier/split-by-deviation-from-straight-line-quad.js.map +1 -0
  22. package/node/bezier/split-into-line-segments.js +29 -0
  23. package/node/bezier/split-into-line-segments.js.map +1 -0
  24. package/node/generate-sdf.js +57 -0
  25. package/node/generate-sdf.js.map +1 -0
  26. package/node/index.js +2 -0
  27. package/node/index.js.map +1 -0
  28. package/node/main-program.js +100 -0
  29. package/node/main-program.js.map +1 -0
  30. package/node/max-aspect-ratio-before-stretch.js +3 -0
  31. package/node/max-aspect-ratio-before-stretch.js.map +1 -0
  32. package/node/prepare-buffers.js +114 -0
  33. package/node/prepare-buffers.js.map +1 -0
  34. package/node/row-count.js +4 -0
  35. package/node/row-count.js.map +1 -0
  36. package/node/shaders/main.fragment.js +149 -0
  37. package/node/shaders/main.fragment.js.map +1 -0
  38. package/node/shaders/main.vertex.js +53 -0
  39. package/node/shaders/main.vertex.js.map +1 -0
  40. package/node/svg/get-beziers-from-raw-paths.js +91 -0
  41. package/node/svg/get-beziers-from-raw-paths.js.map +1 -0
  42. package/node/svg/get-paths-from-str.js +14 -0
  43. package/node/svg/get-paths-from-str.js.map +1 -0
  44. package/node/svg/path-data-polyfill/parse-number.js +101 -0
  45. package/node/svg/path-data-polyfill/parse-number.js.map +1 -0
  46. package/node/svg/path-data-polyfill/parse-path-data-string.js +21 -0
  47. package/node/svg/path-data-polyfill/parse-path-data-string.js.map +1 -0
  48. package/node/svg/path-data-polyfill/source.js +147 -0
  49. package/node/svg/path-data-polyfill/source.js.map +1 -0
  50. package/node/svg/path-segment/c.js +29 -0
  51. package/node/svg/path-segment/c.js.map +1 -0
  52. package/node/svg/path-segment/h.js +23 -0
  53. package/node/svg/path-segment/h.js.map +1 -0
  54. package/node/svg/path-segment/l.js +24 -0
  55. package/node/svg/path-segment/l.js.map +1 -0
  56. package/node/svg/path-segment/q.js +23 -0
  57. package/node/svg/path-segment/q.js.map +1 -0
  58. package/node/svg/path-segment/s.js +34 -0
  59. package/node/svg/path-segment/s.js.map +1 -0
  60. package/node/svg/path-segment/t.js +28 -0
  61. package/node/svg/path-segment/t.js.map +1 -0
  62. package/node/svg/path-segment/v.js +23 -0
  63. package/node/svg/path-segment/v.js.map +1 -0
  64. package/node/svg/path-segment/z.js +21 -0
  65. package/node/svg/path-segment/z.js.map +1 -0
  66. package/node/svg/path-state.js +2 -0
  67. package/node/svg/path-state.js.map +1 -0
  68. package/node/tex-width.js +12 -0
  69. package/node/tex-width.js.map +1 -0
  70. package/node/types/attribute.js +2 -0
  71. package/node/types/attribute.js.map +1 -0
  72. package/node/types/cell.js +2 -0
  73. package/node/types/cell.js.map +1 -0
  74. package/node/types/gl-context.js +2 -0
  75. package/node/types/gl-context.js.map +1 -0
  76. package/node/types/gl-type.js +2 -0
  77. package/node/types/gl-type.js.map +1 -0
  78. package/node/types/gl-usage.js +2 -0
  79. package/node/types/gl-usage.js.map +1 -0
  80. package/node/types/program.d.ts +2 -2
  81. package/node/types/program.js +2 -0
  82. package/node/types/program.js.map +1 -0
  83. package/node/types/strip.js +2 -0
  84. package/node/types/strip.js.map +1 -0
  85. package/node/types/texture.js +2 -0
  86. package/node/types/texture.js.map +1 -0
  87. package/node/utils/calc-circs.js +97 -0
  88. package/node/utils/calc-circs.js.map +1 -0
  89. package/node/utils/clip-line-segment-to-grid.d.ts +1 -1
  90. package/node/utils/clip-line-segment-to-grid.js +98 -0
  91. package/node/utils/clip-line-segment-to-grid.js.map +1 -0
  92. package/node/utils/clip-line-segment-to-strips.d.ts +1 -1
  93. package/node/utils/clip-line-segment-to-strips.js +150 -0
  94. package/node/utils/clip-line-segment-to-strips.js.map +1 -0
  95. package/node/utils/create-empty-grid.d.ts +1 -1
  96. package/node/utils/create-empty-grid.js +24 -0
  97. package/node/utils/create-empty-grid.js.map +1 -0
  98. package/node/utils/create-empty-strips.d.ts +1 -1
  99. package/node/utils/create-empty-strips.js +16 -0
  100. package/node/utils/create-empty-strips.js.map +1 -0
  101. package/node/utils/distance-seg-to-p.js +35 -0
  102. package/node/utils/distance-seg-to-p.js.map +1 -0
  103. package/node/utils/find-close-cells.d.ts +1 -1
  104. package/node/utils/find-close-cells.js +130 -0
  105. package/node/utils/find-close-cells.js.map +1 -0
  106. package/node/utils/find-crossing-cells.d.ts +1 -1
  107. package/node/utils/find-crossing-cells.js +31 -0
  108. package/node/utils/find-crossing-cells.js.map +1 -0
  109. package/node/utils/get-distance-to-line-function.js +45 -0
  110. package/node/utils/get-distance-to-line-function.js.map +1 -0
  111. package/node/utils/jump-idx.js +81 -0
  112. package/node/utils/jump-idx.js.map +1 -0
  113. package/node/utils/map-to-viewbox.js +29 -0
  114. package/node/utils/map-to-viewbox.js.map +1 -0
  115. package/node/utils/seg-box-x.js +69 -0
  116. package/node/utils/seg-box-x.js.map +1 -0
  117. package/node/utils/seg-strip-x.js +58 -0
  118. package/node/utils/seg-strip-x.js.map +1 -0
  119. package/node/vector/dot.js +11 -0
  120. package/node/vector/dot.js.map +1 -0
  121. package/node/vector/from-to-vec.js +11 -0
  122. package/node/vector/from-to-vec.js.map +1 -0
  123. package/node/vector/len.js +9 -0
  124. package/node/vector/len.js.map +1 -0
  125. package/node/webgl-utils/compile-shader.js +8 -0
  126. package/node/webgl-utils/compile-shader.js.map +1 -0
  127. package/node/webgl-utils/get-gl-context.d.ts +1 -1
  128. package/node/webgl-utils/get-gl-context.js +43 -0
  129. package/node/webgl-utils/get-gl-context.js.map +1 -0
  130. package/node/webgl-utils/set-attribute.d.ts +3 -3
  131. package/node/webgl-utils/set-attribute.js +52 -0
  132. package/node/webgl-utils/set-attribute.js.map +1 -0
  133. package/node/webgl-utils/set-uniform-block.d.ts +1 -1
  134. package/node/webgl-utils/set-uniform-block.js +31 -0
  135. package/node/webgl-utils/set-uniform-block.js.map +1 -0
  136. package/node/webgl-utils/set-uniform.d.ts +2 -2
  137. package/node/webgl-utils/set-uniform.js +11 -0
  138. package/node/webgl-utils/set-uniform.js.map +1 -0
  139. package/node/webgl-utils/uniform-block.js +2 -0
  140. package/node/webgl-utils/uniform-block.js.map +1 -0
  141. package/node/webgl-utils/uniform-type.js +2 -0
  142. package/node/webgl-utils/uniform-type.js.map +1 -0
  143. package/node/webgl-utils/use-program.d.ts +2 -2
  144. package/node/webgl-utils/use-program.js +31 -0
  145. package/node/webgl-utils/use-program.js.map +1 -0
  146. package/node/webgl-utils/use-texture.js +25 -0
  147. package/node/webgl-utils/use-texture.js.map +1 -0
  148. package/package.json +4 -5
  149. package/src/bezier/is-cubic-obtuse.ts +2 -2
  150. package/src/bezier/is-quad-obtuse.ts +2 -2
  151. package/src/bezier/split-by-deviation-from-straight-line-quad.ts +3 -3
  152. package/src/bezier/split-into-line-segments.ts +3 -3
  153. package/src/debug-shaders.ts +2 -2
  154. package/src/shaders/main.fragment.ts +1 -1
  155. package/src/shaders/main.vertex.ts +1 -1
  156. package/src/types/program.ts +2 -2
  157. package/src/utils/calc-circs.ts +3 -3
  158. package/src/utils/clip-line-segment-to-grid.ts +2 -3
  159. package/src/utils/clip-line-segment-to-strips.ts +2 -2
  160. package/src/utils/create-empty-grid.ts +2 -2
  161. package/src/utils/create-empty-strips.ts +2 -2
  162. package/src/utils/find-close-cells.ts +5 -5
  163. package/src/utils/find-crossing-cells.ts +2 -2
  164. package/src/utils/jump-idx.ts +1 -1
  165. package/src/webgl-utils/get-gl-context.ts +3 -3
  166. package/src/webgl-utils/set-attribute.ts +3 -3
  167. package/src/webgl-utils/set-uniform-block.ts +1 -1
  168. package/src/webgl-utils/set-uniform.ts +2 -2
  169. package/src/webgl-utils/use-program.ts +5 -5
  170. package/node/helpers/calc-circs.d.ts +0 -11
  171. package/node/helpers/clip-line-segment-to-grid.d.ts +0 -14
  172. package/node/helpers/clip-line-segment-to-strips.d.ts +0 -13
  173. package/node/helpers/create-empty-grid.d.ts +0 -8
  174. package/node/helpers/create-empty-strips.d.ts +0 -7
  175. package/node/helpers/distance-seg-to-p.d.ts +0 -5
  176. package/node/helpers/find-close-cells.d.ts +0 -3
  177. package/node/helpers/find-crossing-cells.d.ts +0 -3
  178. package/node/helpers/get-distance-to-line-function.d.ts +0 -10
  179. package/node/helpers/jump-idx.d.ts +0 -2
  180. package/node/helpers/map-to-viewbox.d.ts +0 -2
  181. package/node/helpers/seg-box-x.d.ts +0 -10
  182. package/node/helpers/seg-strip-x.d.ts +0 -9
  183. package/src/utils/path.ts +0 -137
@@ -0,0 +1 @@
1
+ const n=new WeakMap;function e(n){Object.keys(n).forEach(e=>{delete n[e]})}const t=32,r={};function o(n,e,t){const r=n.createShader(t);return n.shaderSource(r,e),n.compileShader(r),r}function s(n,e,t){const{gl:r,textures:o}=n;r.activeTexture(r.TEXTURE0+e);let s=o[t];return s?r.bindTexture(r.TEXTURE_2D,s.tex):(s=o[t]={tex:r.createTexture()},r.bindTexture(r.TEXTURE_2D,s.tex),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MIN_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_MAG_FILTER,r.NEAREST),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,r.CLAMP_TO_EDGE),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,r.CLAMP_TO_EDGE)),s}const{BYTE:i,UNSIGNED_BYTE:c,SHORT:l,UNSIGNED_SHORT:u,INT:a,UNSIGNED_INT:d,FLOAT:f,HALF_FLOAT:g,INT_2_10_10_10_REV:h,UNSIGNED_INT_2_10_10_10_REV:I}=WebGL2RenderingContext;function x(n){return(e,t,r)=>{const{gl:o,uniformBlocks:s,program:i}=n;let c=s[e];if(void 0===s[e]){const n=o.getUniformBlockIndex(i,e);o.uniformBlockBinding(i,n,t);const r=o.createBuffer();o.bindBuffer(o.UNIFORM_BUFFER,r),c={blockName:e,blockIndex:n,buf:r},s[e]=c}else o.bindBuffer(o.UNIFORM_BUFFER,c.buf);const{buf:l}=c;o.bufferData(o.UNIFORM_BUFFER,r,o.DYNAMIC_DRAW),o.bindBufferBase(o.UNIFORM_BUFFER,t,l)}}function _(n){const e=n[0][0],t=n[0][1];for(let r=1;r<n.length;r++)if(e!==n[r][0]||t!==n[r][1])return!1;return!0}function p(n,e){if(0===e)return n[0];if(1===e)return n[n.length-1];if(4===n.length){const[[t,r],[o,s],[i,c],[l,u]]=n,a=t+(o-t)*e,d=o+(i-o)*e,f=a+(d-a)*e,g=r+(s-r)*e,h=s+(c-s)*e,I=g+(h-g)*e;return[f+(d+(i+(l-i)*e-d)*e-f)*e,I+(h+(c+(u-c)*e-h)*e-I)*e]}if(3===n.length){const[[t,r],[o,s],[i,c]]=n,l=t+(o-t)*e,u=r+(s-r)*e;return[l+(o+(i-o)*e-l)*e,u+(s+(c-s)*e-u)*e]}if(2===n.length){const[[t,r],[o,s]]=n;return[t+(o-t)*e,r+(s-r)*e]}if(1===n.length)return n[0];throw new Error("The given bezier curve must be of order <= 3.")}const{sqrt:v}=Math;function m(n,e){const t=n[0],r=n[1],o=e[0],s=e[1],i=r-s,c=o-t,l=t*s-o*r,u=v(i*i+c*c);return function(n){const e=n[0],o=n[1];return 0!==u?(i*e+c*o+l)/u:v((e-t)**2+(o-r)**2)}}{const n=[10,1];m([6,2],[6,2])(n)}function C(n,e,t){if(4===n.length)return function(n,e,t){return 0===e?1===t?n:function(n,e){const t=n[0],r=n[1],o=n[2],s=n[3],i=t[0],c=t[1],l=r[0],u=r[1],a=o[0],d=o[1],f=i-e*(i-l),g=l-e*(l-a),h=f-e*(f-g),I=c-e*(c-u),x=u-e*(u-d),_=I-e*(I-x);return[t,[f,I],[h,_],[h-e*(h-(g-e*(g-(a-e*(a-s[0]))))),_-e*(_-(x-e*(x-(d-e*(d-s[1])))))]]}(n,t):1===t?function(n,e){const t=n[0],r=n[1],o=n[2],s=n[3],i=t[0],c=t[1],l=r[0],u=r[1],a=o[0],d=o[1],f=i-e*(i-l),g=l-e*(l-a),h=a-e*(a-s[0]),I=f-e*(f-g),x=g-e*(g-h),_=c-e*(c-u),p=u-e*(u-d),v=d-e*(d-s[1]),m=_-e*(_-p),C=p-e*(p-v);return[[I-e*(I-x),m-e*(m-C)],[x,C],[h,v],s]}(n,e):function(n,e,t){const r=n[0],o=n[1],s=n[2],i=n[3],c=r[0],l=r[1],u=o[0],a=o[1],d=s[0],f=s[1],g=e*e,h=e*g,I=t*t,x=t*I,_=e*t,p=c-u,v=d-u,m=p+v,C=e*p,S=t*p,R=i[0]-c-3*v,E=l-a,T=f-a,b=E+T,w=e*E,P=t*E,A=i[1]-l-3*T;return[[h*R+(3*e*(e*m-p)+c),h*A+(3*e*(e*b-E)+l)],[_*(e*R+2*m)+(g*m+c-(S+2*C)),_*(e*A+2*b)+(g*b+l-(P+2*w))],[_*(t*R+2*m)+(I*m+c-(2*S+C)),_*(t*A+2*b)+(I*b+l-(2*P+w))],[x*R+(3*t*(t*m-p)+c),x*A+(3*t*(t*b-E)+l)]]}(n,e,t)}(n,e,t);if(3===n.length)return function(n,e,t){return 0===e?1===t?n:function(n,e){const t=n[0],r=n[1],o=n[2],s=t[0],i=t[1],c=r[0],l=r[1],u=e*e,a=s-c,d=i-l;return[t,[-e*a+s,-e*d+i],[u*(a+(o[0]-c))-(2*e*a-s),u*(d+(o[1]-l))-(2*e*d-i)]]}(n,t):1===t?function(n,e){const t=n[0],r=n[1],o=n[2],s=t[0],i=t[1],c=r[0],l=r[1],u=e*e,a=s-c,d=o[0]-c,f=i-l,g=o[1]-l;return[[u*(a+d)-(2*e*a-s),u*(f+g)-(2*e*f-i)],[e*d+c,e*g+l],o]}(n,e):function(n,e,t){const r=n[0],o=n[1],s=n[2],i=r[0],c=r[1],l=o[0],u=o[1],a=e*e,d=t*t,f=e*t,g=i-l,h=g+(s[0]-l),I=c-u,x=I+(s[1]-u);return[[a*h-(2*e*g-i),a*x-(2*e*I-c)],[f*h-(g*(t+e)-i),f*x-(I*(t+e)-c)],[d*h-(2*t*g-i),d*x-(2*t*I-c)]]}(n,e,t)}(n,e,t);throw new Error("The given bezier curve must be of order 2 or 3.")}function S(n,e){return[e[0]-n[0],e[1]-n[1]]}function R(n,e){return n[0]*e[0]+n[1]*e[1]}function E(n){const e=S(n[0],n[1]),t=S(n[1],n[3]),r=S(n[3],n[0]),o=S(n[0],n[2]),s=S(n[2],n[3]);return R(r,e)>0||R(t,r)>0||R(r,o)>0||R(s,r)>0}const{abs:T,max:b}=Math;function w(n){const e=m(n[0],n[3]),t=e(n[1]),r=e(n[2]);return(t*r<=0?4/9:3/4)*b(T(t),T(r))}function P(n){const e=S(n[0],n[1]),t=S(n[1],n[2]),r=S(n[2],n[0]);return R(r,e)>0||R(t,r)>0}const{abs:A}=Math;function D(n){if(n[0][0]===n[1][0]&&n[0][1]===n[1][1])return 0;const e=p(n,.5),t=m(n[0],n[2]);return A(t(e))}function y(n,e){const t=3===n.length?function(n,e){const t=[0],r=[1];for(;;){const o=t[t.length-1],s=r[r.length-1],i=C(n,o,s);if(!P(i)&&D(i)<=e){if(t.push(r.pop()),1===s)return t;continue}const c=(o+s)/2;r.push(c)}}(n,e):function(n,e){const t=[0],r=[1];for(;;){const o=t[t.length-1],s=r[r.length-1],i=C(n,o,s);if(!E(i)&&w(i)<=e){if(t.push(r.pop()),1===s)return t;continue}const c=(o+s)/2;r.push(c)}}(n,e),r=[];for(let e=0;e<t.length-1;e++){const o=p(n,t[e]),s=p(n,t[e+1]);r.push([o,s])}return r}function F(n){return Math.sqrt(n[0]*n[0]+n[1]*n[1])}const N=function(){const n=[{from:0,u:0,v:0}];for(let e=0;e<128;e++){n.push({from:e+.5,u:e+1,v:0}),n.push({from:e+.5,u:-e-1,v:0}),n.push({from:e+.5,u:0,v:e+1}),n.push({from:e+.5,u:0,v:-e-1});for(let r=0;r<t;r++){const t=F([.5+e,.5+r]),o=e+1,s=r+1;n.push({from:t,u:o,v:s}),0!==o&&n.push({from:t,u:-o,v:s}),0!==s&&n.push({from:t,u:o,v:-s}),0!==o&&0!==s&&n.push({from:t,u:-o,v:-s})}n.sort((n,e)=>n.from-e.from)}return n}(),{min:U,max:M,sqrt:L}=Math;function k(n,e){const t=n[0],r=n[1],o=t[0],s=t[1],i=r[0],c=r[1],l=e[0],u=e[1],a=o-l,d=s-u,f=i-l-a,g=c-u-d,h=M(0,U(1,-(a*f+d*g)/(f*f+g*g))),I=a+h*f,x=d+h*g;return L(I*I+x*x)}const{trunc:O,max:B,E:X}=Math;function Y(n){let e=function(n){let e=0,t=N.length-1,r=0;for(;e<=t;){r=e+t>>>1;const o=N[r].from;if(o===n)return r;n>o?e=r+1:t=r-1}return r}(n);for(n=B(0,n);0!==e&&N[e].from>=n;)e--;for(;e<N.length-2&&N[e+1].from<n;)e++;return e}const{min:G,SQRT2:j}=Math;const{floor:V,ceil:Q}=Math;function z(n,e,t,r,o,s,i){const c=o*i,[[l,u],[a,d]]=s,f=e+c,g=t+c,h=function(n,e){const[t,r]=n,[o,s]=t,[i,c]=r,[[l,u],[a,d]]=e,f=i-o,g=c-s,h=[],I=[];if(0!==f){const n=(l-o)/f;if(n>=0&&n<=1){const e=s+n*g;e>=u&&e<=d&&(h.push(n),I.push([l,e]))}const e=(a-o)/f;if(e>=0&&e<=1){const n=s+e*g;n>=u&&n<=d&&(h.push(e),I.push([a,n]))}}if(0!==g){const n=(u-s)/g;if(n>=0&&n<=1){const e=o+n*f;e>=l&&e<=a&&(h.push(n),I.push([e,u]))}const e=(d-s)/g;if(e>=0&&e<=1){const n=o+e*f;n>=l&&n<=a&&(h.push(e),I.push([n,d]))}}return 2===h.length?h[0]<h[1]?I:[I[1],I[0]]:I}(s,[[-c,-c],[f,g]]),I=l>-c&&l<f&&u>-c&&u<g,x=a>-c&&a<f&&d>-c&&d<g;if(h.length<2&&!I&&!x)return;const _=a-l,p=d-u,v=a>l?o:-o,m=d>u?o:-o;let C=l,S=u,R=0;const E=v>0,T=m>0,b=E?V:Q,w=T?V:Q;for(;;){let e=o*b((C+v)/o),t=o*w((S+m)/o);const r=(e-l)/_,s=(t-u)/p,x=r<s&&0!==_||0===p,P=x?e:l+s*_,A=x?u+r*p:t;if((r>1||0===_)&&(s>1||0===p)){const e=V(a/o)+i,t=V(d/o)+i;n[e]?.[t]?.lineSegs.push([[C,S],[a,d]]);break}if(P<=-c||A<=-c||P>=f||A>=g){if(!I&&0===R){[C,S]=h[0],R++;continue}{const e=b(C/o)-(E?0:1)+i,t=w(S/o)-(T?0:1)+i,r=[[C,S],h[R]];n[e]?.[t]?.lineSegs.push(r);break}}const D=b(C/o)-(E?0:1)+i,y=w(S/o)-(T?0:1)+i;n[D]?.[y]?.lineSegs.push([[C,S],[P,A]]),C=P,S=A}}const W=256,{floor:H,ceil:q}=Math;function Z(n,e,t){const r=e/n.length,[o,s]=t,i=function(n,e){const[t,r]=n,[o,s]=t,[i,c]=r,[l,u,a]=e,d=i-o,f=c-s,g=[],h=[];if(0!==d){const n=(l-o)/d;if(n>=0&&n<=1){const e=s+n*f;e>=u&&e<=a&&(g.push(n),h.push([l,e]))}}if(0!==f){const n=(u-s)/f;if(n>=0&&n<=1){const e=o+n*d;e<=l&&(g.push(n),h.push([e,u]))}const e=(a-s)/f;if(e>=0&&e<=1){const n=o+e*d;n<=l&&(g.push(e),h.push([n,a]))}}return 2===g.length?g[0]<g[1]?h:[h[1],h[0]]:h}(t,[0,0,e]),[c,l]=o,[u,a]=s,d=u-c,f=a-l,g=c<0&&l>0&&l<e,h=u<0&&a>0&&a<e;if(i.length<2&&!g&&!h&&(0!==c||0!==d||l<=0&&a<=0||l>=e&&a>=e))return;if(0===f)return;const I=a>l?r:-r;let x=c,_=l,p=0;const v=u>c,m=a>l,C=m?H:q;for(;;){let t=v&&x<0||!v&&x>0?0:Number.NEGATIVE_INFINITY,o=r*C((_+I)/r);const u=(t-c)/d,a=(o-l)/f,h=u<a&&0!==d,S=h?0:c+a*d,R=h?l+u*f:o;if((u>1||0===d)&&a>1){const e=H(s[1]/r);n[e]?.lineSegs.push([[x,_],s]);break}if(S>=0&&(0!==c||0!==d)||R<=0||R>=e){if(!g&&0===p){[x,_]=i[0],p++;continue}{const e=C(_/r)-(m?0:1),t=[[x,_],i[p]];n[e]?.lineSegs.push(t);break}}const E=C(_/r)-(m?0:1);n[E]?.lineSegs.push([[x,_],[S,R]]),x=S,_=R}}function $(n,e,r,o,s,i,c,l=.5,u=[0,0,e,r],a=1){const d=function(n,e,t,r){if(0===n[0]&&0===n[1]&&n[2]===e&&n[3]===t)return r;const[o,s,i,c]=n,l=e/i,u=t/c,a=[];for(let n=0;n<r.length;n++){const e=r[n],t=[];for(let n=0;n<e.length;n++){const r=e[n],i=[];for(let n=0;n<r.length;n++){const[e,t]=r[n],c=l*e-o,a=u*t-s;i.push([c,a])}t.push(i)}a.push(t)}return a}(u,e,r/a,n),f=function(n,e){let t=[];for(let r=0;r<n.length;r++){const o=n[r];for(let n=0;n<o.length;n++){const r=o[n];if(_(r))continue;if(2===r.length){t.push(r);continue}const s=y(r,e);t.push(...s.filter(n=>!_(n)))}}return t}(d,l),g=function(n,e){const r=[];for(let o=0;o<n+2*e;o++){const n=[];for(let r=0;r<t+2*e;r++)n.push({lineSegs:[],closeCells:[],crossingCells:[]});r.push(n)}return r}(o,c),h=function(){const n=[];for(let e=0;e<t;e++)n.push({lineSegs:[]});return n}();for(let n=0;n<f.length;n++){const t=f[n];z(g,e,r,0,s,t,c),Z(h,r,t)}(function(n,e,r,o,s){const i=function(n,e,r,o,s){return function(i,c,l){let u=Y((l-j*r)/r),a=Number.POSITIVE_INFINITY;for(;u<N.length;){const l=N[u].from;if(r*l>o+j*r)break;const{u:d,v:f}=N[u],g=d+i,h=f+c;if(g<0||g>=e+2*s||h<0||h>=t+2*s){u++;continue}const{lineSegs:I}=n[g][h];for(let n=0;n<I.length;n++){const e=[(i-s+.5)*r,(c-s+.5)*r],t=k(I[n],e);t<a&&(a=t)}if(u++,a!==Number.POSITIVE_INFINITY)break}if(a===Number.POSITIVE_INFINITY)return G(o+j*r,r*N[N.length-1].from);const{closeCells:d}=n[i][c];let f=Y((l-2*j*r)/r);for(;f<N.length;){const{from:l,u,v:g}=N[f];if(r*l>G(a,o)+j*r)break;const h=u+i,I=g+c;if(h<0||h>=e+2*s||I<0||I>=t+2*s){f++;continue}const{lineSegs:x}=n[h][I];x.length>0&&d.push((2*s+t)*h+I),f++}return a}}(n,e,r,o,s);let c=0,l=0;for(let n=s;n<e+s;n++){l=c;for(let e=s;e<t+s;e++)l=i(n,e,l),e===s&&(c=l)}})(g,o,s,i,c),function(n,e,r){for(let o=r;o<e+r;o++)for(let e=r;e<t+r;e++){const s=n[o][e].crossingCells;for(let i=r;i<=o;i++)0!==n[i][e].lineSegs.length&&s.push((t+2*r)*i+e)}}(g,o,c);const I=[],x=[],p=[],v=[],m=[],C=[];let S=0,R=0,E=0;for(let n=0;n<o+2*c;n++)for(let e=0;e<t+2*c;e++){const r=g[n][e];if(n>=c&&n<o+c&&e>=c&&e<t+c){const{closeCells:n,crossingCells:e}=r,t=e.length;m.push(...e),C.push([S,t]),S+=t;const o=n.length;p.push(...n),v.push([R,o]),R+=o}const{lineSegs:s}=r,i=s.length;x.push([E,i]),E+=i,I.push(...s)}for(;p.length%W!==0;)p.push(0);for(;m.length%W!==0;)m.push(0);const T=[];for(let n=0;n<t;n++){const e=h[n],{lineSegs:t}=e,r=t.length;T.push([E,r]),E+=r,I.push(...t)}const b=new Float32Array(I.flat(2)),w=new Int32Array(x.flat()),P=new Int32Array(v.flat());return{lineSegPtCoords_Arr:b,segIdxs_PerCell_Range_Arr:w,closeCellIdxs_PerCell_Arr:new Int32Array(p),closeCellIdxs_PerCell_Range_Arr:P,crossCellIdxs_PerCell_Arr:new Int32Array(m),crossCellIdxs_perCell_Range_Arr:new Int32Array(C.flat()),segIdxs_PerStrip_Range_Arr:new Int32Array(T.flat())}}function J(n){const e=[n.p,n.initialPoint];return n.prev2ndCubicControlPoint=void 0,n.prev2ndQuadraticControlPoint=void 0,e}const K={c:function(n){const e=[n.p,[n.vals[0],n.vals[1]],[n.vals[2],n.vals[3]],[n.vals[4],n.vals[5]]];return n.prev2ndCubicControlPoint=e[2],n.prev2ndQuadraticControlPoint=void 0,e},h:function(n){const e=[n.p,[n.vals[0],n.p[1]]];return n.prev2ndCubicControlPoint=void 0,n.prev2ndQuadraticControlPoint=void 0,e},l:function(n){const e=[n.p,n.vals];return n.prev2ndCubicControlPoint=void 0,n.prev2ndQuadraticControlPoint=void 0,e},q:function(n){const e=[n.vals[0],n.vals[1]],t=[n.vals[2],n.vals[3]];return n.prev2ndCubicControlPoint=void 0,n.prev2ndQuadraticControlPoint=e,[n.p,e,t]},s:function(n){const e=n.prev2ndCubicControlPoint?[n.p[0]-n.prev2ndCubicControlPoint[0]+n.p[0],n.p[1]-n.prev2ndCubicControlPoint[1]+n.p[1]]:n.p,t=[n.p,e,[n.vals[0],n.vals[1]],[n.vals[2],n.vals[3]]];return n.prev2ndCubicControlPoint=t[2],n.prev2ndQuadraticControlPoint=void 0,t},t:function(n){const e=n.prev2ndQuadraticControlPoint?[n.p[0]-n.prev2ndQuadraticControlPoint[0]+n.p[0],n.p[1]-n.prev2ndQuadraticControlPoint[1]+n.p[1]]:n.p,t=[n.vals[0],n.vals[1]];return n.prev2ndCubicControlPoint=void 0,n.prev2ndQuadraticControlPoint=e,[n.p,e,t]},v:function(n){const e=[n.p,[n.p[0],n.vals[0]]];return n.prev2ndCubicControlPoint=void 0,n.prev2ndQuadraticControlPoint=void 0,e},z:J};function nn(n){let e=0,t=0,r=1,o=0,s=1,i=1;const c=n._currentIndex;if(n._skipOptionalSpaces(),n._currentIndex<n._endIndex&&"+"===n._string[n._currentIndex]?n._currentIndex+=1:n._currentIndex<n._endIndex&&"-"===n._string[n._currentIndex]&&(n._currentIndex+=1,s=-1),n._currentIndex===n._endIndex||(n._string[n._currentIndex]<"0"||n._string[n._currentIndex]>"9")&&"."!==n._string[n._currentIndex])throw new Error("The first character of a number must be one of [0-9+-.].");const l=n._currentIndex;for(;n._currentIndex<n._endIndex&&n._string[n._currentIndex]>="0"&&n._string[n._currentIndex]<="9";)n._currentIndex+=1;if(n._currentIndex!==l){let e=n._currentIndex-1,r=1;for(;e>=l;)t+=r*(Number(n._string[e])-0),e-=1,r*=10}if(n._currentIndex<n._endIndex&&"."===n._string[n._currentIndex]){if(n._currentIndex+=1,n._currentIndex>=n._endIndex||n._string[n._currentIndex]<"0"||n._string[n._currentIndex]>"9")throw new Error("There must be a least one digit following the .");for(;n._currentIndex<n._endIndex&&n._string[n._currentIndex]>="0"&&n._string[n._currentIndex]<="9";)r*=10,o+=Number(n._string.charAt(n._currentIndex))/r,n._currentIndex+=1}if(n._currentIndex!==c&&n._currentIndex+1<n._endIndex&&("e"===n._string[n._currentIndex]||"E"===n._string[n._currentIndex])&&"x"!==n._string[n._currentIndex+1]&&"m"!==n._string[n._currentIndex+1]){if(n._currentIndex+=1,"+"===n._string[n._currentIndex]?n._currentIndex+=1:"-"===n._string[n._currentIndex]&&(n._currentIndex+=1,i=-1),n._currentIndex>=n._endIndex||n._string[n._currentIndex]<"0"||n._string[n._currentIndex]>"9")throw new Error("There must be an exponent.");for(;n._currentIndex<n._endIndex&&n._string[n._currentIndex]>="0"&&n._string[n._currentIndex]<="9";)e*=10,e+=Number(n._string[n._currentIndex]),n._currentIndex+=1}let u=t+o;if(u*=s,e&&(u*=Math.pow(10,i*e)),c===n._currentIndex)throw new Error("Internal error: startIndex === source._currentIndex");return n._skipOptionalSpacesOrDelimiter(),u}const en={Z:"Z",M:"M",L:"L",C:"C",Q:"Q",A:"A",H:"H",V:"V",S:"S",T:"T",z:"Z",m:"m",l:"l",c:"c",q:"q",a:"a",h:"h",v:"v",s:"s",t:"t"};class tn{_string;_currentIndex;_endIndex;_prevCommand;constructor(n){this._string=n,this._currentIndex=0,this._endIndex=this._string.length,this._prevCommand=void 0,this._skipOptionalSpaces()}parseSegment(){const n=this._string[this._currentIndex];let e,t=en[n];if(void 0===t){if(void 0===this._prevCommand)throw new Error("Implicit command not allowed for first commands.");if(!("+"===n||"-"===n||"."===n||n>="0"&&n<="9")||"Z"===this._prevCommand)throw new Error("Remaining coordinates not found for implicit command");t="M"===this._prevCommand?"L":"m"===this._prevCommand?"l":this._prevCommand}else this._currentIndex+=1;this._prevCommand=t;const r=t.toUpperCase();if("H"===r||"V"===r?e=[nn(this)]:"M"===r||"L"===r||"T"===r?e=[nn(this),nn(this)]:"S"===r||"Q"===r?e=[nn(this),nn(this),nn(this),nn(this)]:"C"===r?e=[nn(this),nn(this),nn(this),nn(this),nn(this),nn(this)]:"A"===r?e=[nn(this),nn(this),nn(this),this._parseArcFlag(),this._parseArcFlag(),nn(this),nn(this)]:"Z"===r&&(this._skipOptionalSpaces(),e=[]),void 0===e)throw new Error("Unknown command");return{type:t,values:e}}hasMoreData(){return this._currentIndex<this._endIndex}initialCommandIsMoveTo(){if(!this.hasMoreData())return!0;const n=en[this._string[this._currentIndex]];return"M"===n||"m"===n}_isCurrentSpace(){const n=this._string[this._currentIndex];return n<=" "&&(" "===n||"\n"===n||"\t"===n||"\r"===n||"\f"===n)}_skipOptionalSpaces(){for(;this._currentIndex<this._endIndex&&this._isCurrentSpace();)this._currentIndex+=1;return this._currentIndex<this._endIndex}_skipOptionalSpacesOrDelimiter(){return!(this._currentIndex<this._endIndex&&!this._isCurrentSpace()&&","!==this._string[this._currentIndex])&&(this._skipOptionalSpaces()&&this._currentIndex<this._endIndex&&","===this._string[this._currentIndex]&&(this._currentIndex+=1,this._skipOptionalSpaces()),this._currentIndex<this._endIndex)}_parseArcFlag(){if(this._currentIndex>=this._endIndex)throw new Error("Unable to parse arc flag");let n;const e=this._string[this._currentIndex];if(this._currentIndex+=1,"0"===e)n=0;else{if("1"!==e)throw new Error("Unable to parse arc flag - arc flag must be 0 or 1");n=1}return this._skipOptionalSpacesOrDelimiter(),n}}const{ceil:rn,min:on,max:sn}=Math;function cn(i,c,l,u,a,d,h=1,I=!0,_=!0,p=0,v=0,m=0,C=.5){const S="string"==typeof c?function(n){if(0===n.length)return[];if("m"!==n[0].type.toLowerCase())throw new Error("Invalid SVG - every new path must start with an M or m.");const e={p:[0,0]},t=[];let r,o=[];for(let s=0;s<n.length;s++){const i=n[s],c=i.type.toLowerCase();if(e.vals=i.values,i.type===c)if("v"===c)e.vals[0]+=e.p[1];else if("a"===c)e.vals[5]+=e.p[0],e.vals[6]+=e.p[1];else for(let n=0;n<e.vals.length;n++)e.vals[n]+=e.p[n%2];if("m"===c){o.length&&("z"!==r&&o.push(J(e)),t.push(o),o=[]),e.initialPoint=e.p=e.vals,r=c;continue}const l=K[c];if(!l)throw new Error("Invalid SVG - command not recognized.");const u=l(e);e.p=u[u.length-1],o.push(u),r=c}return o.length>0&&("z"!==r&&o.push(J(e)),t.push(o)),t}(function(n){if(!n.length)return[];const e=new tn(n),t=[];if(!e.initialCommandIsMoveTo())throw new Error("Path must start with m or M");for(;e.hasMoreData();)t.push(e.parseSegment());return t}(c)):c,R=function(t){{const e=n.get(t);if(e)return e}const r={},o={},s=[];t.canvas.addEventListener("webglcontextlost",n=>{c(),n.preventDefault()},!1);const i={gl:t,onContextLoss:c,textures:o,programs:r,framebufferStack:s};return n.set(t,i),i;function c(){e(r),e(o),s.length=0}}(i),{onContextLoss:E}=R;let T=1;if(l/u>4){const n=l/4;T=n/u,u=n}const b=u/t,w=sn(l,u),P=rn(l/b),A=2*rn(on(d,w)/b/2),D=function(n,e,t,r){const{gl:s,programs:i}=n;if(i[e])return i[e];const c=s.createProgram();return s.attachShader(c,o(s,"#version 300 es\n\nprecision highp float;\n\nuniform vec2 uWidthHeight;\nuniform float uStretch;\nin vec2 aUV;\nin ivec2 aCloseCellIdxRangePerCell;\nin ivec2 aCrossIdxRangePerCell;\nout vec2 vXY;\nflat out int instanceId;\nflat out ivec2 closeCellIdxRange;\nflat out ivec2 crossCellIdxRange;\n\n\nvoid main() {\n instanceId = gl_InstanceID;\n closeCellIdxRange = aCloseCellIdxRangePerCell;\n crossCellIdxRange = aCrossIdxRangePerCell;\n\n // drawn column-by-column\n float i = float(instanceId / 32); // column index\n float j = float(instanceId % 32); // row index\n\n vec2 trans = vec2(\n i / float(32),\n j / float(32)\n );\n\n vec2 uv = aUV + trans;\n\n float width = uWidthHeight.x;\n float height = uWidthHeight.y;\n\n vXY = vec2(\n height * uv.x,\n height * uv.y\n );\n\n float aspectRatio = width / height;\n\n gl_Position = vec4(\n vec2(\n (2.0*(uv.x / aspectRatio) - 1.0),\n 2.0*uv.y - 1.0\n ),\n 0.0, 1.0\n );\n}\n",s.VERTEX_SHADER)),s.attachShader(c,o(s,r,s.FRAGMENT_SHADER)),s.linkProgram(c),i[e]={gl:s,program:c,attributes:{},uniforms:{},uniformBlocks:{}},i[e]}(R,`main${P}-${A}`,0,function(n,e){const o=r[1024*n+e];if(void 0!==o)return o;const s=`#version 300 es\n\nprecision highp float;\n\nuniform float uMaxDistance;\nuniform float uExponent;\nuniform highp sampler2D uSegs;\nuniform highp isampler2D uCloseCellIdxs;\nuniform highp isampler2D uCrossCellIdxs;\nuniform int uIncl; // bit 0 -> incl inside, bit 1 -> incl outside\n\nuniform SegIdxRangePerCellBlock {\n ivec4 uSegIdxRangePerCell[${(t+2*e)*(n+2*e)/2}];\n};\nuniform SegIdxRangePerStripBlock {\n ivec4 uSegIdxRangePerStrip[16];\n};\n\nin vec2 vXY;\nflat in int instanceId;\nflat in ivec2 closeCellIdxRange;\nflat in ivec2 crossCellIdxRange;\nout vec4 FragColor;\n\n\nfloat absDistToSegment(vec2 point, vec2 lineA, vec2 lineB) {\n vec2 lineDir = lineB - lineA;\n float lenSq = dot(lineDir, lineDir);\n float t = clamp(dot(point - lineA, lineDir) / lenSq, 0.0, 1.0);\n vec2 linePt = lineA + t * lineDir;\n\n return distance(point, linePt);\n}\n\n\nvoid main() {\n ///////////////////////////////////////////////////////////////////////////\n // Project a ray to the left to check if it crosses the segment in order\n // to find the fragment's winding number to determine whether fragment\n // is inside or outside the shape.\n\n int crossIdxS = crossCellIdxRange.x;\n int crossLen = crossCellIdxRange.y;\n float winds = 0.0;\n // Iterate over all relevant cell indexes\n for (int i = crossIdxS; i < crossIdxS + crossLen; i++) {\n int crossIdx = texelFetch(uCrossCellIdxs, ivec2(i%256, i/256), 0).x;\n\n bool isEven = crossIdx % 2 == 0;\n\n ivec4 uSegIdxRange = uSegIdxRangePerCell[crossIdx / 2];\n int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;\n int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;\n\n for (int j = segIdx; j < segIdx + segLen; j++) {\n // Fetch segment from texture\n vec4 seg = texelFetch(uSegs, ivec2(j, 0), 0);\n\n // line segment's min-y is excluded\n bool crossing =\n (seg.y > vXY.y != seg.w > vXY.y) &&\n (vXY.x > (seg.z - seg.x)*(vXY.y - seg.y) / (seg.w - seg.y) + seg.x);\n\n bool crossingUp = seg.y < seg.w;\n\n winds += crossing ? (crossingUp ? 1.0 : -1.0) : 0.0;\n }\n }\n\n {\n bool isEven = (instanceId % 32) % 2 == 0;\n\n ivec4 uSegIdxRange = uSegIdxRangePerStrip[(instanceId % 32) / 2];\n int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;\n int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;\n\n for (int j = segIdx; j < segIdx + segLen; j++) {\n // Fetch segment from texture\n vec4 seg = texelFetch(uSegs, ivec2(j, 0), 0);\n\n // line segment's min-y is excluded\n bool crossing =\n (seg.y > vXY.y != seg.w > vXY.y) &&\n (vXY.x > (seg.z - seg.x)*(vXY.y - seg.y) / (seg.w - seg.y) + seg.x);\n\n bool crossingUp = seg.y < seg.w;\n\n winds += crossing ? (crossingUp ? 1.0 : -1.0) : 0.0;\n }\n }\n\n\n bool inside = winds != 0.0;\n ///////////////////////////////////////////////////////////////////////////\n\n ///////////////////////////////////////////////////////////////////////////\n float res = 1.0; // sdf result\n\n if ((inside && (uIncl % 2 != 0)) || (!inside && (uIncl > 1))) {\n int cellIdxS = closeCellIdxRange.x;\n int cellLen = closeCellIdxRange.y;\n // Iterate over all relevant cell indexes\n for (int i = cellIdxS; i < cellIdxS + cellLen; i++) {\n int cellIdx = texelFetch(uCloseCellIdxs, ivec2(i%256, i/256), 0).x;\n\n bool isEven = cellIdx % 2 == 0;\n ivec4 uSegIdxRange = uSegIdxRangePerCell[cellIdx / 2];\n int segIdx = isEven ? uSegIdxRange.x : uSegIdxRange.z;\n int segLen = isEven ? uSegIdxRange.y : uSegIdxRange.w;\n\n for (int j = segIdx; j < segIdx + segLen; j++) {\n // Fetch segment from texture\n vec4 seg = texelFetch(uSegs, ivec2(j, 0), 0);\n\n // Find unsigned distance to the segment; only the nearest will be kept\n float d = absDistToSegment(vXY, seg.xy, seg.zw);\n // Apply exponential transform TODO\n // val = pow(1.0 - clamp(d / uMaxDistance, 0.0, 1.0), uExponent) * 0.5;\n float val = clamp(d / uMaxDistance, 0.0, 1.0);\n res = min(res, val);\n }\n }\n }\n ///////////////////////////////////////////////////////////////////////////\n\n // DEBUG!\n float alpha = ((instanceId + instanceId/32) % 2 == 0 ? 0.3 : 0.5);\n\n float red = inside ? 0.2 : 0.8;\n float green = abs(sin(50.0 * res));\n float blue = 0.5;\n // float alpha = inside ? 0.5 : 0.0;\n\n FragColor = vec4(red, green, blue, alpha);\n}\n`;return r[1024*n+e]=s,s}(P,A));if(i.useProgram(D.program),function(n,e,r,o,i,c,l=1,u,a,d,h,I,_,p,v){const{gl:m}=n,C=[],S=.03125,R=.03125;C.push(0,0,S,0,0,R),C.push(S,0,S,R,0,R);const E=new Float32Array(C),T=(b=e,(n,e,...t)=>{const{gl:r,uniforms:o}=b,s=o[e]||(o[e]=r.getUniformLocation(b.program,e));r[`uniform${n}`](s,...t)});var b;const w=function(n){return(e,t,r,o,s,i=0,c=0,l=0)=>{const{gl:u,attributes:a}=n,d=a[e]=a[e]??{buf:u.createBuffer(),loc:u.getAttribLocation(n.program,e),data:null},{loc:h,buf:I}=d;u.bindBuffer(u.ARRAY_BUFFER,I),r===f||r===g?u.vertexAttribPointer(h,t,r,!1,c,l):u.vertexAttribIPointer(h,t,r,c,l),u.enableVertexAttribArray(h),0!==i&&u.vertexAttribDivisor(h,i),s!==d.data&&(u.bufferData(u.ARRAY_BUFFER,s,o),d.data=s)}}(e),{lineSegPtCoords_Arr:P,segIdxs_PerCell_Range_Arr:A,closeCellIdxs_PerCell_Arr:D,closeCellIdxs_PerCell_Range_Arr:y,crossCellIdxs_PerCell_Arr:F,crossCellIdxs_perCell_Range_Arr:N,segIdxs_PerStrip_Range_Arr:U}=$(o,u,a,d,h,c,p,r,i,v);w("aUV",2,m.FLOAT,m.STATIC_DRAW,E),w("aCrossIdxRangePerCell",2,m.INT,m.STATIC_DRAW,N,1),w("aCloseCellIdxRangePerCell",2,m.INT,m.STATIC_DRAW,y,1),T("2f","uWidthHeight",u,a),T("1f","uMaxDistance",c),T("1f","uExponent",l),T("1i","uIncl",(I?1:0)+(_?2:0)),T("1f","uStretch",v),x(e)("SegIdxRangePerCellBlock",0,A),x(e)("SegIdxRangePerStripBlock",1,U),s(n,0,"segs"),m.texImage2D(m.TEXTURE_2D,0,m.RGBA32F,P.length/4,1,0,m.RGBA,m.FLOAT,P);const M=m.getUniformLocation(e.program,"uSegs");m.uniform1i(M,0),s(n,1,"closeCellIdxsPerCell"),m.texImage2D(m.TEXTURE_2D,0,m.R32I,W,D.length/W,0,m.RED_INTEGER,m.INT,D);const L=m.getUniformLocation(e.program,"uCloseCellIdxs");m.uniform1i(L,1),s(n,2,"crossCellIdxsPerCell"),m.texImage2D(m.TEXTURE_2D,0,m.R32I,W,F.length/W,0,m.RED_INTEGER,m.INT,F);const k=m.getUniformLocation(e.program,"uCrossCellIdxs");m.uniform1i(k,2),v>1&&(m.enable(m.SCISSOR_TEST),m.scissor(0,0,u,a/v)),m.viewport(0,0,u,a),m.drawArraysInstanced(m.TRIANGLES,0,6,d*t),v>1&&m.disable(m.SCISSOR_TEST)}(R,D,C,S,a,d,h,l,u,P,b,I,_,A,T),i.isContextLost())throw E(),new Error("Webgl2 context lost.")}export{cn as generateIntoFramebuffer};
@@ -0,0 +1,31 @@
1
+ import { isReallyPoint } from "./is-really-point.js";
2
+ import { splitIntoLineSegments } from "./split-into-line-segments.js";
3
+ /**
4
+ * Returns an array of line segments that is an approximation of the given
5
+ * bezier curves up to `PIXEL_ACCURACY` accuracy.
6
+ *
7
+ * @param bezierLoops
8
+ * @param resolution each bezier curve is split until its hausdorff distance
9
+ * from the line connecting it's endpoints are less than this value
10
+ */
11
+ function bezierCurvesToLineSegs(bezierLoops, resolution) {
12
+ let lineSegs = [];
13
+ for (let i = 0; i < bezierLoops.length; i++) {
14
+ const pss = bezierLoops[i];
15
+ for (let j = 0; j < pss.length; j++) {
16
+ const ps = pss[j];
17
+ if (isReallyPoint(ps)) {
18
+ continue;
19
+ }
20
+ if (ps.length === 2) {
21
+ lineSegs.push(ps);
22
+ continue;
23
+ }
24
+ const lineSegs_ = splitIntoLineSegments(ps, resolution);
25
+ lineSegs.push(...lineSegs_.filter(ps => !isReallyPoint(ps)));
26
+ }
27
+ }
28
+ return lineSegs;
29
+ }
30
+ export { bezierCurvesToLineSegs };
31
+ //# sourceMappingURL=bezier-curves-to-line-segs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bezier-curves-to-line-segs.js","sourceRoot":"","sources":["../../src/bezier/bezier-curves-to-line-segs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAGtE;;;;;;;GAOG;AACH,SAAS,sBAAsB,CACvB,WAA6B,EAC7B,UAAiB;IAErB,IAAI,QAAQ,GAAiB,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,IAAI,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC;gBAAC,SAAS;YAAC,CAAC;YAEpC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAClB,SAAS;YACb,CAAC;YAED,MAAM,SAAS,GAAG,qBAAqB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;YAExD,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AACpB,CAAC;AAGD,OAAO,EAAE,sBAAsB,EAAE,CAAA"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Returns the resulting point of evaluating the given bezier curve at the
3
+ * given parameter `t`.
4
+ *
5
+ * * uses [De Casteljau's algorithm](https://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm)
6
+ * in double precision floating point arithmetic
7
+ *
8
+ * The resulting point `p` is returned as the pair `[x,y]`, where `x` and `y` are
9
+ * double precision floating point numbers.
10
+ *
11
+ * @param ps an order 1,2 or 3 bezier curve, e.g. `[[0,0],[1,1],[2,1],[2,0]]`
12
+ * @param t the parameter value where the bezier should be evaluated
13
+ *
14
+ * @doc mdx
15
+ **/
16
+ function evalDeCasteljau(ps, t) {
17
+ if (t === 0) {
18
+ return ps[0];
19
+ }
20
+ else if (t === 1) {
21
+ return ps[ps.length - 1];
22
+ }
23
+ if (ps.length === 4) {
24
+ const [[x0, y0], [x1, y1], [x2, y2], [x3, y3]] = ps;
25
+ const a01 = x0 + (x1 - x0) * t;
26
+ const a11 = x1 + (x2 - x1) * t;
27
+ const a21 = x2 + (x3 - x2) * t;
28
+ const a02 = a01 + (a11 - a01) * t;
29
+ const a12 = a11 + (a21 - a11) * t;
30
+ const x = a02 + (a12 - a02) * t;
31
+ const b01 = y0 + (y1 - y0) * t;
32
+ const b11 = y1 + (y2 - y1) * t;
33
+ const b21 = y2 + (y3 - y2) * t;
34
+ const b02 = b01 + (b11 - b01) * t;
35
+ const b12 = b11 + (b21 - b11) * t;
36
+ const y = b02 + (b12 - b02) * t;
37
+ return [x, y];
38
+ }
39
+ if (ps.length === 3) {
40
+ const [[x0, y0], [x1, y1], [x2, y2]] = ps;
41
+ const a01 = x0 + (x1 - x0) * t;
42
+ const a11 = x1 + (x2 - x1) * t;
43
+ const x = a01 + (a11 - a01) * t;
44
+ const b01 = y0 + (y1 - y0) * t;
45
+ const b11 = y1 + (y2 - y1) * t;
46
+ const y = b01 + (b11 - b01) * t;
47
+ return [x, y];
48
+ }
49
+ if (ps.length === 2) {
50
+ const [[x0, y0], [x1, y1]] = ps;
51
+ const x = x0 + (x1 - x0) * t;
52
+ const y = y0 + (y1 - y0) * t;
53
+ return [x, y];
54
+ }
55
+ if (ps.length === 1) {
56
+ return ps[0];
57
+ }
58
+ throw new Error('The given bezier curve must be of order <= 3.');
59
+ }
60
+ export { evalDeCasteljau };
61
+ //# sourceMappingURL=eval-de-casteljau.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eval-de-casteljau.js","sourceRoot":"","sources":["../../src/bezier/eval-de-casteljau.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Returns a bezier curve that starts and ends at the given `t` parameters.
3
+ *
4
+ * @param ps a quadratic bezier curve given as an ordered array of its
5
+ * control point coordinates, e.g. `[[0,0], [1,1], [2,1]]`
6
+ * @param tS the `t` parameter where the resultant bezier should start
7
+ * @param tE the `t` parameter where the resultant bezier should end
8
+ *
9
+ * @internal
10
+ */
11
+ function fromTo2(ps, tS, tE) {
12
+ if (tS === 0) {
13
+ if (tE === 1) {
14
+ return ps;
15
+ }
16
+ return splitLeft2(ps, tE);
17
+ }
18
+ if (tE === 1) {
19
+ return splitRight2(ps, tS);
20
+ }
21
+ return splitAtBoth2(ps, tS, tE);
22
+ }
23
+ /**
24
+ * Returns a bezier curve that starts at the given t parameter and ends
25
+ * at `t === 1`.
26
+ *
27
+ * @param ps a quadratic bezier curve given as an ordered array of its
28
+ * control point coordinates, e.g. `[[0,0], [1,1], [2,1]]`
29
+ * @param t the `t` parameter where the resultant bezier should start
30
+ *
31
+ * @internal
32
+ */
33
+ function splitRight2(ps, t) {
34
+ // --------------------------------------------------------
35
+ // const [[x0, y0], [x1, y1], [x2, y2]] = ps;
36
+ const p0 = ps[0];
37
+ const p1 = ps[1];
38
+ const p2 = ps[2];
39
+ const x0 = p0[0];
40
+ const y0 = p0[1];
41
+ const x1 = p1[0];
42
+ const y1 = p1[1];
43
+ const x2 = p2[0];
44
+ const y2 = p2[1];
45
+ // --------------------------------------------------------
46
+ const tt = t * t;
47
+ const xA = x0 - x1;
48
+ const xB = x2 - x1;
49
+ const yA = y0 - y1;
50
+ const yB = y2 - y1;
51
+ return [
52
+ [tt * (xA + xB) - (2 * t * xA - x0), // xx0, split point x
53
+ tt * (yA + yB) - (2 * t * yA - y0)], // yy0, split point y
54
+ [t * xB + x1, // xx1
55
+ t * yB + y1], // yy1
56
+ p2
57
+ ];
58
+ }
59
+ /**
60
+ * Returns a bezier curve that starts at `t === 0` and ends at the given `t`
61
+ * parameter.
62
+ *
63
+ * @param ps a quadratic bezier curve given as an ordered array of its
64
+ * control point coordinates, e.g. `[[0,0], [1,1], [2,1]]`
65
+ * @param t the `t` parameter where the resultant bezier should end
66
+ *
67
+ * @internal
68
+ */
69
+ function splitLeft2(ps, t) {
70
+ // --------------------------------------------------------
71
+ // const [[x0, y0], [x1, y1], [x2, y2]] = ps;
72
+ const p0 = ps[0];
73
+ const p1 = ps[1];
74
+ const p2 = ps[2];
75
+ const x0 = p0[0];
76
+ const y0 = p0[1];
77
+ const x1 = p1[0];
78
+ const y1 = p1[1];
79
+ const x2 = p2[0];
80
+ const y2 = p2[1];
81
+ // --------------------------------------------------------
82
+ const tt = t * t;
83
+ const xA = x0 - x1;
84
+ const yA = y0 - y1;
85
+ return [
86
+ p0,
87
+ [-t * xA + x0, // xx1
88
+ -t * yA + y0], // yy1
89
+ [tt * (xA + (x2 - x1)) - (2 * t * xA - x0), // xx2 - split point x
90
+ tt * (yA + (y2 - y1)) - (2 * t * yA - y0)] // yy2 - split point y
91
+ ];
92
+ }
93
+ /**
94
+ * Returns a bezier curve that starts and ends at the given `t` parameters.
95
+ *
96
+ * @param ps a quadratic bezier curve given as an ordered array of its
97
+ * control point coordinates, e.g. `[[0,0], [1,1], [2,1]]`
98
+ * @param tS the `t` parameter where the resultant bezier should start
99
+ * @param tE the `t` parameter where the resultant bezier should end
100
+ *
101
+ * @internal
102
+ */
103
+ function splitAtBoth2(ps, tS, tE) {
104
+ // --------------------------------------------------------
105
+ // const [[x0, y0], [x1, y1], [x2, y2]] = ps;
106
+ const p0 = ps[0];
107
+ const p1 = ps[1];
108
+ const p2 = ps[2];
109
+ const x0 = p0[0];
110
+ const y0 = p0[1];
111
+ const x1 = p1[0];
112
+ const y1 = p1[1];
113
+ const x2 = p2[0];
114
+ const y2 = p2[1];
115
+ // --------------------------------------------------------
116
+ const ttS = tS * tS;
117
+ const ttE = tE * tE;
118
+ const tStE = tS * tE;
119
+ const xA = x0 - x1;
120
+ const xB = x2 - x1;
121
+ const xC = xA + xB;
122
+ const yA = y0 - y1;
123
+ const yB = y2 - y1;
124
+ const yC = yA + yB;
125
+ const xx0 = ttS * xC - (2 * tS * xA - x0);
126
+ const xx1 = tStE * xC - (xA * (tE + tS) - x0);
127
+ const xx2 = ttE * xC - (2 * tE * xA - x0);
128
+ const yy0 = ttS * yC - (2 * tS * yA - y0);
129
+ const yy1 = tStE * yC - (yA * (tE + tS) - y0);
130
+ const yy2 = ttE * yC - (2 * tE * yA - y0);
131
+ return [[xx0, yy0], [xx1, yy1], [xx2, yy2]];
132
+ }
133
+ export { fromTo2 };
134
+ //# sourceMappingURL=from-to-2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-to-2.js","sourceRoot":"","sources":["../../../src/bezier/from-to/from-to-2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Returns a bezier curve that starts and ends at the given t parameters.
3
+ *
4
+ * @param ps a cubic bezier curve given as an ordered array of its
5
+ * control point coordinates, e.g. `[[0,0], [1,1], [2,1], [2,0]]`
6
+ * @param tS the `t` parameter where the resultant bezier should start
7
+ * @param tE the `t` parameter where the resultant bezier should end
8
+ *
9
+ * @internal
10
+ */
11
+ function fromTo3(ps, tS, tE) {
12
+ if (tS === 0) {
13
+ if (tE === 1) {
14
+ return ps;
15
+ }
16
+ return splitLeft3(ps, tE);
17
+ }
18
+ if (tE === 1) {
19
+ return splitRight3(ps, tS);
20
+ }
21
+ return splitAtBoth3(ps, tS, tE);
22
+ }
23
+ /**
24
+ * Returns a bezier curve that starts at the given t parameter and ends
25
+ * at `t === 1`.
26
+ *
27
+ * @param ps a cubic bezier curve given as an ordered array of its
28
+ * control point coordinates, e.g. `[[0,0], [1,1], [2,1], [2,0]]`
29
+ * @param t the `t` parameter where the resultant bezier should start
30
+ *
31
+ * @internal
32
+ */
33
+ function splitRight3(ps, t) {
34
+ // --------------------------------------------------------
35
+ // const [[x0, y0], [x1, y1], [x2, y2], [x3, y3]] = ps;
36
+ const p0 = ps[0];
37
+ const p1 = ps[1];
38
+ const p2 = ps[2];
39
+ const p3 = ps[3];
40
+ const x00 = p0[0];
41
+ const y00 = p0[1];
42
+ const x10 = p1[0];
43
+ const y10 = p1[1];
44
+ const x20 = p2[0];
45
+ const y20 = p2[1];
46
+ const x30 = p3[0];
47
+ const y30 = p3[1];
48
+ // --------------------------------------------------------
49
+ const x01 = x00 - t * (x00 - x10);
50
+ const x11 = x10 - t * (x10 - x20);
51
+ const x21 = x20 - t * (x20 - x30);
52
+ const x02 = x01 - t * (x01 - x11);
53
+ const x12 = x11 - t * (x11 - x21);
54
+ const x03 = x02 - t * (x02 - x12);
55
+ const y01 = y00 - t * (y00 - y10);
56
+ const y11 = y10 - t * (y10 - y20);
57
+ const y21 = y20 - t * (y20 - y30);
58
+ const y02 = y01 - t * (y01 - y11);
59
+ const y12 = y11 - t * (y11 - y21);
60
+ const y03 = y02 - t * (y02 - y12);
61
+ return [[x03, y03], [x12, y12], [x21, y21], p3];
62
+ }
63
+ /**
64
+ * Returns a bezier curve that starts at `t === 0` and ends at the given t
65
+ * parameter.
66
+ *
67
+ * @param ps a cubic bezier curve given as an ordered array of its
68
+ * control point coordinates, e.g. `[[0,0], [1,1], [2,1], [2,0]]`
69
+ * @param t the `t` parameter where the resultant bezier should end
70
+ *
71
+ * @internal
72
+ */
73
+ function splitLeft3(ps, t) {
74
+ // --------------------------------------------------------
75
+ // const [[x0, y0], [x1, y1], [x2, y2], [x3, y3]] = ps;
76
+ const p0 = ps[0];
77
+ const p1 = ps[1];
78
+ const p2 = ps[2];
79
+ const p3 = ps[3];
80
+ const x00 = p0[0];
81
+ const y00 = p0[1];
82
+ const x10 = p1[0];
83
+ const y10 = p1[1];
84
+ const x20 = p2[0];
85
+ const y20 = p2[1];
86
+ const x30 = p3[0];
87
+ const y30 = p3[1];
88
+ // --------------------------------------------------------
89
+ const x01 = x00 - t * (x00 - x10);
90
+ const x11 = x10 - t * (x10 - x20);
91
+ const x21 = x20 - t * (x20 - x30);
92
+ const x02 = x01 - t * (x01 - x11);
93
+ const x12 = x11 - t * (x11 - x21);
94
+ const x03 = x02 - t * (x02 - x12);
95
+ const y01 = y00 - t * (y00 - y10);
96
+ const y11 = y10 - t * (y10 - y20);
97
+ const y21 = y20 - t * (y20 - y30);
98
+ const y02 = y01 - t * (y01 - y11);
99
+ const y12 = y11 - t * (y11 - y21);
100
+ const y03 = y02 - t * (y02 - y12);
101
+ return [p0, [x01, y01], [x02, y02], [x03, y03]];
102
+ }
103
+ /**
104
+ * Returns a bezier curve that starts and ends at the given `t` parameters.
105
+ *
106
+ * @param ps a cubic bezier curve given as an ordered array of its
107
+ * control point coordinates, e.g. `[[0,0], [1,1], [2,1], [2,0]]`
108
+ * @param tS the `t` parameter where the resultant bezier should start
109
+ * @param tE the `t` parameter where the resultant bezier should end
110
+ *
111
+ * @internal
112
+ */
113
+ function splitAtBoth3(ps, tS, tE) {
114
+ // --------------------------------------------------------
115
+ // const [[x0, y0], [x1, y1], [x2, y2], [x3, y3]] = ps;
116
+ const p0 = ps[0];
117
+ const p1 = ps[1];
118
+ const p2 = ps[2];
119
+ const p3 = ps[3];
120
+ const x0 = p0[0];
121
+ const y0 = p0[1];
122
+ const x1 = p1[0];
123
+ const y1 = p1[1];
124
+ const x2 = p2[0];
125
+ const y2 = p2[1];
126
+ const x3 = p3[0];
127
+ const y3 = p3[1];
128
+ // --------------------------------------------------------
129
+ const ttS = tS * tS;
130
+ const tttS = tS * ttS;
131
+ const ttE = tE * tE;
132
+ const tttE = tE * ttE;
133
+ const tStE = tS * tE;
134
+ const xA = x0 - x1;
135
+ const xB = x2 - x1;
136
+ const xC = x3 - x0;
137
+ const xD = xA + xB;
138
+ const tSxA = tS * xA;
139
+ const tExA = tE * xA;
140
+ const xC3xB = xC - 3 * xB;
141
+ const yA = y0 - y1;
142
+ const yB = y2 - y1;
143
+ const yC = y3 - y0;
144
+ const yD = yA + yB;
145
+ const tSyA = tS * yA;
146
+ const tEyA = tE * yA;
147
+ const yC3yB = yC - 3 * yB;
148
+ const xx0 = tttS * xC3xB + (3 * tS * (tS * xD - xA) + x0);
149
+ const xx1 = tStE * (tS * xC3xB + 2 * xD) + ((ttS * xD + x0) - (tExA + 2 * tSxA));
150
+ const xx2 = tStE * (tE * xC3xB + 2 * xD) + ((ttE * xD + x0) - (2 * tExA + tSxA));
151
+ const xx3 = tttE * xC3xB + (3 * tE * (tE * xD - xA) + x0);
152
+ const yy0 = tttS * yC3yB + (3 * tS * (tS * yD - yA) + y0);
153
+ const yy1 = tStE * (tS * yC3yB + 2 * yD) + ((ttS * yD + y0) - (tEyA + 2 * tSyA));
154
+ const yy2 = tStE * (tE * yC3yB + 2 * yD) + ((ttE * yD + y0) - (2 * tEyA + tSyA));
155
+ const yy3 = tttE * yC3yB + (3 * tE * (tE * yD - yA) + y0);
156
+ return [[xx0, yy0], [xx1, yy1], [xx2, yy2], [xx3, yy3]];
157
+ }
158
+ export { fromTo3 };
159
+ //# sourceMappingURL=from-to-3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-to-3.js","sourceRoot":"","sources":["../../../src/bezier/from-to/from-to-3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { fromTo2 } from './from-to-2.js';
2
+ import { fromTo3 } from './from-to-3.js';
3
+ /**
4
+ * Returns a bezier curve that starts and ends at the given `t` parameters.
5
+ *
6
+ * @param ps an order 2 or 3 bezier curve given as an ordered array of its
7
+ * control point coordinates, e.g. `[[0,0], [1,1], [2,1], [2,0]]`
8
+ * @param tS the `t` parameter where the resultant bezier should start
9
+ * @param tE the `t` parameter where the resultant bezier should end
10
+ */
11
+ function fromTo(ps, tS, tE) {
12
+ if (ps.length === 4) {
13
+ return fromTo3(ps, tS, tE);
14
+ }
15
+ if (ps.length === 3) {
16
+ return fromTo2(ps, tS, tE);
17
+ }
18
+ throw new Error('The given bezier curve must be of order 2 or 3.');
19
+ }
20
+ export { fromTo };
21
+ //# sourceMappingURL=from-to.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-to.js","sourceRoot":"","sources":["../../../src/bezier/from-to/from-to.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAGzC;;;;;;;GAOG;AACF,SAAS,MAAM,CACR,EAAc,EACd,EAAU,EACV,EAAU;IAEd,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAClB,OAAO,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;AACvE,CAAC;AAGD,OAAO,EAAE,MAAM,EAAE,CAAA"}
@@ -0,0 +1,24 @@
1
+ import { fromToVec } from '../vector/from-to-vec.js';
2
+ import { dot } from "../vector/dot.js";
3
+ /**
4
+ * Returns `true` if the given cubic bezier is obtuse, `false` otherwise (i.e.
5
+ * `false` if acute).
6
+ *
7
+ * Obtuse here is defined as follows: let the cubic form triangles through its
8
+ * control points P0, P1, P3 where P0 and P3 are the endpoints. If both interior
9
+ * angles ∠P0 and ∠P2 are <= 90 degrees then the cubic is considered acute,
10
+ * otherwise it is considered obtuse. The same should be true for P0, P2, P3.
11
+ */
12
+ function isCubicObtuse(ps) {
13
+ const v0 = fromToVec(ps[0], ps[1]);
14
+ const v1 = fromToVec(ps[1], ps[3]);
15
+ const v2 = fromToVec(ps[3], ps[0]);
16
+ const v3 = fromToVec(ps[0], ps[2]);
17
+ const v4 = fromToVec(ps[2], ps[3]);
18
+ return (dot(v2, v0) > 0 ||
19
+ dot(v1, v2) > 0 ||
20
+ dot(v2, v3) > 0 ||
21
+ dot(v4, v2) > 0);
22
+ }
23
+ export { isCubicObtuse };
24
+ //# sourceMappingURL=is-cubic-obtuse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-cubic-obtuse.js","sourceRoot":"","sources":["../../src/bezier/is-cubic-obtuse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAGvC;;;;;;;;GAQG;AACH,SAAS,aAAa,CAAC,EAAc;IACjC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,OAAO,CACH,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;QACf,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;QACf,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;QACf,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAClB,CAAC;AACN,CAAC;AAGD,OAAO,EAAE,aAAa,EAAE,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { fromToVec } from '../vector/from-to-vec.js';
2
+ import { dot } from "../vector/dot.js";
3
+ /**
4
+ * Returns `true` if the given quadratic bezier is obtuse, `false` otherwise (i.e.
5
+ * `false` if acute).
6
+ *
7
+ * Obtuse here is defined as follows: let the quad form a triangle through its
8
+ * control points P0, P1, P2 where P0 and P2 are the endpoints. If both interior
9
+ * angles ∠P0 and ∠P2 are <= 90 degrees then the quad is considered acute,
10
+ * otherwise it is considered obtuse.
11
+ */
12
+ function isQuadObtuse(ps) {
13
+ const v0 = fromToVec(ps[0], ps[1]);
14
+ const v1 = fromToVec(ps[1], ps[2]);
15
+ const v2 = fromToVec(ps[2], ps[0]);
16
+ return (dot(v2, v0) > 0 ||
17
+ dot(v1, v2) > 0);
18
+ }
19
+ export { isQuadObtuse };
20
+ //# sourceMappingURL=is-quad-obtuse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-quad-obtuse.js","sourceRoot":"","sources":["../../src/bezier/is-quad-obtuse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAGvC;;;;;;;;GAQG;AACH,SAAS,YAAY,CAAC,EAAc;IAChC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnC,OAAO,CACH,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC;QACf,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAClB,CAAC;AACN,CAAC;AAGD,OAAO,EAAE,YAAY,EAAE,CAAA"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Returns `true` if the given bezier curve has all control points coincident,
3
+ * `false` otherwise.
4
+ *
5
+ * @param ps an order 0,1,2 or 3 bezier curve given as an array of its control
6
+ * points, e.g. `[[0,0],[1,1],[2,1],[2,0]]`
7
+ */
8
+ function isReallyPoint(ps) {
9
+ const x = ps[0][0];
10
+ const y = ps[0][1];
11
+ for (let i = 1; i < ps.length; i++) {
12
+ if (x !== ps[i][0] || y !== ps[i][1]) {
13
+ return false;
14
+ }
15
+ }
16
+ return true;
17
+ }
18
+ export { isReallyPoint };
19
+ //# sourceMappingURL=is-really-point.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-really-point.js","sourceRoot":"","sources":["../../src/bezier/is-really-point.ts"],"names":[],"mappings":"AACA;;;;;;GAMG;AACH,SAAS,aAAa,CACd,EAAc;IAElB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACnB,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAC,CAAC,EAAE,CAAC,GAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAGD,OAAO,EAAE,aAAa,EAAE,CAAA"}