1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- import {
- pointFromPair,
- type GlobalPoint,
- type LocalPoint,
- } from "@excalidraw/math";
- import type { NullableGridSize } from "@excalidraw/excalidraw/types";
- export const getSizeFromPoints = (
- points: readonly (GlobalPoint | LocalPoint)[],
- ) => {
- const xs = points.map((point) => point[0]);
- const ys = points.map((point) => point[1]);
- return {
- width: Math.max(...xs) - Math.min(...xs),
- height: Math.max(...ys) - Math.min(...ys),
- };
- };
- /** @arg dimension, 0 for rescaling only x, 1 for y */
- export const rescalePoints = <Point extends GlobalPoint | LocalPoint>(
- dimension: 0 | 1,
- newSize: number,
- points: readonly Point[],
- normalize: boolean,
- ): Point[] => {
- const coordinates = points.map((point) => point[dimension]);
- const maxCoordinate = Math.max(...coordinates);
- const minCoordinate = Math.min(...coordinates);
- const size = maxCoordinate - minCoordinate;
- const scale = size === 0 ? 1 : newSize / size;
- let nextMinCoordinate = Infinity;
- const scaledPoints = points.map((point): Point => {
- const newCoordinate = point[dimension] * scale;
- const newPoint = [...point];
- newPoint[dimension] = newCoordinate;
- if (newCoordinate < nextMinCoordinate) {
- nextMinCoordinate = newCoordinate;
- }
- return newPoint as Point;
- });
- if (!normalize) {
- return scaledPoints;
- }
- if (scaledPoints.length === 2) {
- // we don't translate two-point lines
- return scaledPoints;
- }
- const translation = minCoordinate - nextMinCoordinate;
- const nextPoints = scaledPoints.map((scaledPoint) =>
- pointFromPair<Point>(
- scaledPoint.map((value, currentDimension) => {
- return currentDimension === dimension ? value + translation : value;
- }) as [number, number],
- ),
- );
- return nextPoints;
- };
- // TODO: Rounding this point causes some shake when free drawing
- export const getGridPoint = (
- x: number,
- y: number,
- gridSize: NullableGridSize,
- ): [number, number] => {
- if (gridSize) {
- return [
- Math.round(x / gridSize) * gridSize,
- Math.round(y / gridSize) * gridSize,
- ];
- }
- return [x, y];
- };
|