Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

intersect.js 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /**
  2. * INTERSEC
  3. *********************************************************
  4. * @licstart The following is the entire license notice for the
  5. * JavaScript code in this page.
  6. *
  7. * Copyright (C) 2021 Ophir LOJKINE
  8. *
  9. *
  10. * The JavaScript code in this page is free software: you can
  11. * redistribute it and/or modify it under the terms of the GNU
  12. * General Public License (GNU GPL) as published by the Free Software
  13. * Foundation, either version 3 of the License, or (at your option)
  14. * any later version. The code is distributed WITHOUT ANY WARRANTY;
  15. * without even the implied warranty of MERCHANTABILITY or FITNESS
  16. * FOR A PARTICULAR PURPOSE. See the GNU GPL for more details.
  17. *
  18. * As additional permission under GNU GPL version 3 section 7, you
  19. * may distribute non-source (e.g., minimized or compacted) forms of
  20. * that code without the copy of the GNU GPL normally required by
  21. * section 4, provided you include this license notice and a URL
  22. * through which recipients can access the Corresponding Source.
  23. *
  24. * @licend
  25. */
  26. if (!SVGGraphicsElement.prototype.transformedBBox || !SVGGraphicsElement.prototype.transformedBBoxContains) {
  27. [pointInTransformedBBox,
  28. transformedBBoxIntersects] = (function () {
  29. var transformRelative = function (m,t) {
  30. return [
  31. m.a*t[0]+m.c*t[1],
  32. m.b*t[0]+m.d*t[1]
  33. ]
  34. }
  35. var transformAbsolute = function (m,t) {
  36. return [
  37. m.a*t[0]+m.c*t[1]+m.e,
  38. m.b*t[0]+m.d*t[1]+m.f
  39. ]
  40. }
  41. SVGGraphicsElement.prototype.transformedBBox = function (scale=1) {
  42. bbox = this.getBBox();
  43. tmatrix = this.getCTM();
  44. tmatrix.e /= scale;
  45. tmatrix.f /= scale;
  46. return {
  47. r: transformAbsolute(tmatrix,[bbox.x/scale,bbox.y/scale]),
  48. a: transformRelative(tmatrix,[bbox.width/scale,0]),
  49. b: transformRelative(tmatrix,[0,bbox.height/scale])
  50. }
  51. }
  52. SVGSVGElement.prototype.transformedBBox = function (scale=1) {
  53. bbox = {
  54. x: this.x.baseVal.value,
  55. y: this.y.baseVal.value,
  56. width: this.width.baseVal.value,
  57. height: this.height.baseVal.value
  58. };
  59. tmatrix = this.getCTM();
  60. tmatrix.e /= scale;
  61. tmatrix.f /= scale;
  62. return {
  63. r: transformAbsolute(tmatrix,[bbox.x/scale,bbox.y/scale]),
  64. a: transformRelative(tmatrix,[bbox.width/scale,0]),
  65. b: transformRelative(tmatrix,[0,bbox.height/scale])
  66. }
  67. }
  68. var pointInTransformedBBox = function ([x,y],{r,a,b}) {
  69. var d = [x-r[0],y-r[1]];
  70. var idet = (a[0]*b[1]-a[1]*b[0]);
  71. var c1 = (d[0]*b[1]-d[1]*b[0]) / idet;
  72. var c2 = (d[1]*a[0]-d[0]*a[1]) / idet;
  73. return (c1>=0 && c1<=1 && c2>=0 && c2<=1)
  74. }
  75. SVGGraphicsElement.prototype.transformedBBoxContains = function (x,y) {
  76. return pointInTransformedBBox([x, y], this.transformedBBox())
  77. }
  78. function transformedBBoxIntersects(bbox_a,bbox_b) {
  79. var corners = [
  80. bbox_b.r,
  81. [bbox_b.r[0] + bbox_b.a[0], bbox_b.r[1] + bbox_b.a[1]],
  82. [bbox_b.r[0] + bbox_b.b[0], bbox_b.r[1] + bbox_b.b[1]],
  83. [bbox_b.r[0] + bbox_b.a[0] + bbox_b.b[0], bbox_b.r[1] + bbox_b.a[1] + bbox_b.b[1]]
  84. ]
  85. return corners.every(function(corner) {
  86. return pointInTransformedBBox(corner, bbox_a);
  87. })
  88. }
  89. SVGGraphicsElement.prototype.transformedBBoxIntersects= function (bbox) {
  90. return transformedBBoxIntersects(this.transformedBBox(),bbox)
  91. }
  92. return [pointInTransformedBBox,
  93. transformedBBoxIntersects]
  94. })();
  95. }