Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

intersect.js 3.1KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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 applyTransform = 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. SVGGraphicsElement.prototype.transformedBBox = function (scale=1) {
  36. bbox = this.getBBox();
  37. tmatrix = this.getCTM();
  38. return {
  39. r: [bbox.x + tmatrix.e/scale, bbox.y + tmatrix.f/scale],
  40. a: applyTransform(tmatrix,[bbox.width/scale,0]),
  41. b: applyTransform(tmatrix,[0,bbox.height/scale])
  42. }
  43. }
  44. SVGSVGElement.prototype.transformedBBox = function (scale=1) {
  45. bbox = {
  46. x: this.x.baseVal.value,
  47. y: this.y.baseVal.value,
  48. width: this.width.baseVal.value,
  49. height: this.height.baseVal.value
  50. };
  51. tmatrix = this.getCTM();
  52. return {
  53. r: [bbox.x + tmatrix.e/scale, bbox.y + tmatrix.f/scale],
  54. a: applyTransform(tmatrix,[bbox.width/scale,0]),
  55. b: applyTransform(tmatrix,[0,bbox.height/scale])
  56. }
  57. }
  58. var pointInTransformedBBox = function ([x,y],{r,a,b}) {
  59. var d = [x-r[0],y-r[1]];
  60. var idet = (a[0]*b[1]-a[1]*b[0]);
  61. var c1 = (d[0]*b[1]-d[1]*b[0]) / idet;
  62. var c2 = (d[1]*a[0]-d[0]*a[1]) / idet;
  63. return (c1>=0 && c1<=1 && c2>=0 && c2<=1)
  64. }
  65. SVGGraphicsElement.prototype.transformedBBoxContains = function (x,y) {
  66. return pointInTransformedBBox([x, y], this.transformedBBox())
  67. }
  68. function transformedBBoxIntersects(bbox_a,bbox_b) {
  69. var corners = [
  70. bbox_b.r,
  71. [bbox_b.r[0] + bbox_b.a[0], bbox_b.r[1] + bbox_b.a[1]],
  72. [bbox_b.r[0] + bbox_b.b[0], bbox_b.r[1] + bbox_b.b[1]],
  73. [bbox_b.r[0] + bbox_b.a[0] + bbox_b.b[0], bbox_b.r[1] + bbox_b.a[1] + bbox_b.b[1]]
  74. ]
  75. return corners.every(function(corner) {
  76. return pointInTransformedBBox(corner, bbox_a);
  77. })
  78. }
  79. SVGGraphicsElement.prototype.transformedBBoxIntersects= function (bbox) {
  80. return transformedBBoxIntersects(this.transformedBBox(),bbox)
  81. }
  82. return [pointInTransformedBBox,
  83. transformedBBoxIntersects]
  84. })();
  85. }