item.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import {
  2. rectRadius,
  3. isPointInsideRect,
  4. isPointInPolygon,
  5. distance,
  6. } from "./geometry";
  7. export const isItemInsideElement = (itemElement, otherElem) => {
  8. const rect = otherElem.getBoundingClientRect();
  9. const fourElem = Array.from(itemElement.querySelectorAll(".corner"));
  10. return fourElem.every((corner) => {
  11. const { top: y, left: x } = corner.getBoundingClientRect();
  12. return isPointInsideRect({ x, y }, rect);
  13. });
  14. };
  15. export const pointInItem = (itemElement, point) => {
  16. return isPointInPolygon(point, getItemPolygon(itemElement));
  17. };
  18. export const getItemPolygon = (itemElement, asArray = false) => {
  19. const fourElem = Array.from(itemElement.querySelectorAll(".corner"));
  20. if (asArray) {
  21. return fourElem.map((corner) => {
  22. const { top: y, left: x } = corner.getBoundingClientRect();
  23. return [x, y];
  24. });
  25. }
  26. return fourElem.map((corner) => {
  27. const { top: y, left: x } = corner.getBoundingClientRect();
  28. return { x, y };
  29. });
  30. };
  31. export const getItemCenter = (itemElement) => {
  32. const center = Array.from(itemElement.querySelectorAll(".center"))[0];
  33. const { top: y, left: x } = center.getBoundingClientRect();
  34. return { x, y };
  35. };
  36. export const fastItemIntersect = (item1, item2) => {
  37. const p1 = getItemPolygon(item1);
  38. const c1 = getItemCenter(item1);
  39. const p2 = getItemPolygon(item2);
  40. const c2 = getItemCenter(item2);
  41. const r1 = rectRadius(p1, c1);
  42. const r2 = rectRadius(p2, c2);
  43. const dist = distance(c1, c2);
  44. return dist <= r1 + r2;
  45. };
  46. export const getItemElement = (id) => {
  47. const elem = document.getElementsByClassName(`item ${id}`)[0];
  48. if (!elem) {
  49. console.warn(`Missing element for id ${id}`);
  50. }
  51. return elem;
  52. };