points.ts 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import { Point } from "./types";
  2. export function getSizeFromPoints(points: readonly Point[]) {
  3. const xs = points.map((point) => point[0]);
  4. const ys = points.map((point) => point[1]);
  5. return {
  6. width: Math.max(...xs) - Math.min(...xs),
  7. height: Math.max(...ys) - Math.min(...ys),
  8. };
  9. }
  10. export function rescalePoints(
  11. dimension: 0 | 1,
  12. nextDimensionSize: number,
  13. prevPoints: readonly Point[],
  14. ): Point[] {
  15. const prevDimValues = prevPoints.map((point) => point[dimension]);
  16. const prevMaxDimension = Math.max(...prevDimValues);
  17. const prevMinDimension = Math.min(...prevDimValues);
  18. const prevDimensionSize = prevMaxDimension - prevMinDimension;
  19. const dimensionScaleFactor =
  20. prevDimensionSize === 0 ? 1 : nextDimensionSize / prevDimensionSize;
  21. let nextMinDimension = Infinity;
  22. const scaledPoints = prevPoints.map(
  23. (prevPoint) =>
  24. prevPoint.map((value, currentDimension) => {
  25. if (currentDimension !== dimension) {
  26. return value;
  27. }
  28. const scaledValue = value * dimensionScaleFactor;
  29. nextMinDimension = Math.min(scaledValue, nextMinDimension);
  30. return scaledValue;
  31. }) as [number, number],
  32. );
  33. if (scaledPoints.length === 2) {
  34. // we don't tranlate two-point lines
  35. return scaledPoints;
  36. }
  37. const translation = prevMinDimension - nextMinDimension;
  38. const nextPoints = scaledPoints.map(
  39. (scaledPoint) =>
  40. scaledPoint.map((value, currentDimension) => {
  41. return currentDimension === dimension ? value + translation : value;
  42. }) as [number, number],
  43. );
  44. return nextPoints;
  45. }