points.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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 = nextDimensionSize / prevDimensionSize;
  20. let nextMinDimension = Infinity;
  21. const scaledPoints = prevPoints.map(prevPoint =>
  22. prevPoint.map((value, currentDimension) => {
  23. if (currentDimension !== dimension) {
  24. return value;
  25. }
  26. const scaledValue = value * dimensionScaleFactor;
  27. nextMinDimension = Math.min(scaledValue, nextMinDimension);
  28. return scaledValue;
  29. }),
  30. );
  31. const translation = prevMinDimension - nextMinDimension;
  32. const nextPoints = scaledPoints.map(
  33. scaledPoint =>
  34. scaledPoint.map((value, currentDimension) => {
  35. return currentDimension === dimension ? value + translation : value;
  36. }) as [number, number],
  37. );
  38. return nextPoints;
  39. }