points.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import { Point } from "./types";
  2. export const 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. /** @arg dimension, 0 for rescaling only x, 1 for y */
  11. export const rescalePoints = (
  12. dimension: 0 | 1,
  13. newSize: number,
  14. points: readonly Point[],
  15. normalize: boolean,
  16. ): Point[] => {
  17. const coordinates = points.map((point) => point[dimension]);
  18. const maxCoordinate = Math.max(...coordinates);
  19. const minCoordinate = Math.min(...coordinates);
  20. const size = maxCoordinate - minCoordinate;
  21. const scale = size === 0 ? 1 : newSize / size;
  22. let nextMinCoordinate = Infinity;
  23. const scaledPoints = points.map((point): Point => {
  24. const newCoordinate = point[dimension] * scale;
  25. const newPoint = [...point];
  26. newPoint[dimension] = newCoordinate;
  27. if (newCoordinate < nextMinCoordinate) {
  28. nextMinCoordinate = newCoordinate;
  29. }
  30. return newPoint as unknown as Point;
  31. });
  32. if (!normalize) {
  33. return scaledPoints;
  34. }
  35. if (scaledPoints.length === 2) {
  36. // we don't translate two-point lines
  37. return scaledPoints;
  38. }
  39. const translation = minCoordinate - nextMinCoordinate;
  40. const nextPoints = scaledPoints.map(
  41. (scaledPoint) =>
  42. scaledPoint.map((value, currentDimension) => {
  43. return currentDimension === dimension ? value + translation : value;
  44. }) as [number, number],
  45. );
  46. return nextPoints;
  47. };