delta-calc.mjs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { mixNumber } from '../../utils/mix/number.mjs';
  2. const SCALE_PRECISION = 0.0001;
  3. const SCALE_MIN = 1 - SCALE_PRECISION;
  4. const SCALE_MAX = 1 + SCALE_PRECISION;
  5. const TRANSLATE_PRECISION = 0.01;
  6. const TRANSLATE_MIN = 0 - TRANSLATE_PRECISION;
  7. const TRANSLATE_MAX = 0 + TRANSLATE_PRECISION;
  8. function calcLength(axis) {
  9. return axis.max - axis.min;
  10. }
  11. function isNear(value, target, maxDistance) {
  12. return Math.abs(value - target) <= maxDistance;
  13. }
  14. function calcAxisDelta(delta, source, target, origin = 0.5) {
  15. delta.origin = origin;
  16. delta.originPoint = mixNumber(source.min, source.max, delta.origin);
  17. delta.scale = calcLength(target) / calcLength(source);
  18. delta.translate =
  19. mixNumber(target.min, target.max, delta.origin) - delta.originPoint;
  20. if ((delta.scale >= SCALE_MIN && delta.scale <= SCALE_MAX) ||
  21. isNaN(delta.scale)) {
  22. delta.scale = 1.0;
  23. }
  24. if ((delta.translate >= TRANSLATE_MIN &&
  25. delta.translate <= TRANSLATE_MAX) ||
  26. isNaN(delta.translate)) {
  27. delta.translate = 0.0;
  28. }
  29. }
  30. function calcBoxDelta(delta, source, target, origin) {
  31. calcAxisDelta(delta.x, source.x, target.x, origin ? origin.originX : undefined);
  32. calcAxisDelta(delta.y, source.y, target.y, origin ? origin.originY : undefined);
  33. }
  34. function calcRelativeAxis(target, relative, parent) {
  35. target.min = parent.min + relative.min;
  36. target.max = target.min + calcLength(relative);
  37. }
  38. function calcRelativeBox(target, relative, parent) {
  39. calcRelativeAxis(target.x, relative.x, parent.x);
  40. calcRelativeAxis(target.y, relative.y, parent.y);
  41. }
  42. function calcRelativeAxisPosition(target, layout, parent) {
  43. target.min = layout.min - parent.min;
  44. target.max = target.min + calcLength(layout);
  45. }
  46. function calcRelativePosition(target, layout, parent) {
  47. calcRelativeAxisPosition(target.x, layout.x, parent.x);
  48. calcRelativeAxisPosition(target.y, layout.y, parent.y);
  49. }
  50. export { calcAxisDelta, calcBoxDelta, calcLength, calcRelativeAxis, calcRelativeAxisPosition, calcRelativeBox, calcRelativePosition, isNear };