UNPKG

pointscape

Version:

Points manipulation: distance & angle helpers, collisions, shapes, array & math utilities — 2D coordinate system

1 lines 41 kB
{"version":3,"sources":["../index.ts","../core/points/distance.ts","../core/points/collision.ts","../core/points/middle.ts","../core/points/pointWithoutCollision.ts","../core/points/collisionInArray.ts","../core/points/angle.ts","../core/randomization/randomNumber.ts","../core/points/randomPoints.ts","../core/points/triangleArea.ts","../core/points/area.ts","../core/points/randomPointInDistance.ts","../core/points/nearest.ts","../core/points/perimeter.ts","../core/points/positionInCircle.ts","../core/points/possibleConnections.ts","../core/points/circleArea.ts","../core/points/center.ts","../core/points/farthest.ts","../core/points/randomPoint.ts","../core/points/move.ts","../core/points/scale.ts","../core/points/inLine.ts","../core/points/getLine.ts","../core/points/cross.ts","../core/points/rotate.ts","../core/points/sort.ts","../core/points/square.ts","../core/points/rectangle.ts","../core/points/triangle.ts","../core/points/pentagon.ts","../core/points/lerp.ts","../core/math/inRange.ts","../core/math/roundToPrecision.ts","../core/math/degreesToRadians.ts","../core/math/radiansToDegrees.ts","../core/math/average.ts","../core/randomization/uniqueId.ts","../core/randomization/randomBoolean.ts","../core/arrays/intersection.ts","../core/arrays/difference.ts","../core/arrays/chunk.ts","../core/arrays/removeDuplicates.ts","../core/arrays/sample.ts","../utils/Point.ts"],"sourcesContent":["// points\nimport distance from \"./core/points/distance\";\nimport collision from \"./core/points/collision\";\nimport middle from \"./core/points/middle\";\nimport pointWithoutCollision from \"./core/points/pointWithoutCollision\";\nimport collisionInArray from \"./core/points/collisionInArray\";\nimport angle from \"./core/points/angle\";\nimport randomPoints from \"./core/points/randomPoints\";\nimport area from \"./core/points/area\";\nimport triangleArea from \"./core/points/triangleArea\";\nimport randomPointInDistance from \"./core/points/randomPointInDistance\";\nimport nearest from \"./core/points/nearest\";\nimport perimeter from \"./core/points/perimeter\";\nimport positionInCircle from \"./core/points/positionInCircle\";\nimport possibleConnections from \"./core/points/possibleConnections\";\nimport circleArea from \"./core/points/circleArea\";\nimport center from \"./core/points/center\";\nimport farthest from \"./core/points/farthest\";\nimport randomPoint from \"./core/points/randomPoint\";\nimport move from \"./core/points/move\";\nimport scale from \"./core/points/scale\";\nimport inLine from \"./core/points/inLine\";\nimport getLine from \"./core/points/getLine\";\nimport cross from \"./core/points/cross\";\nimport rotate from \"./core/points/rotate\";\nimport sort from \"./core/points/sort\";\nimport square from \"./core/points/square\";\nimport rectangle from \"./core/points/rectangle\";\nimport triangle from \"./core/points/triangle\";\nimport pentagon from \"./core/points/pentagon\";\nimport lerp from \"./core/points/lerp\";\n\n// math\nimport inRange from \"./core/math/inRange\";\nimport roundToPrecision from \"./core/math/roundToPrecision\";\nimport degreesToRadians from \"./core/math/degreesToRadians\";\nimport radiansToDegrees from \"./core/math/radiansToDegrees\";\nimport average from \"./core/math/average\";\n\n// randomization\nimport uniqueId from \"./core/randomization/uniqueId\";\nimport randomBoolean from \"./core/randomization/randomBoolean\";\nimport randomNumber from \"./core/randomization/randomNumber\";\n\n// arrays\nimport intersection from \"./core/arrays/intersection\";\nimport difference from \"./core/arrays/difference\";\nimport chunk from \"./core/arrays/chunk\";\nimport removeDuplicates from \"./core/arrays/removeDuplicates\";\nimport sample from \"./core/arrays/sample\";\n\n// utils\nimport Point from \"./utils/Point\";\n\n// types\nexport type { Point as PointType }; // ✅ class instance type\nexport type { Coordinate, Direction, Line, Bounds } from \"./types/global\";\n\n// named exports\nexport {\n // points\n Point,\n distance,\n middle,\n collision,\n pointWithoutCollision,\n collisionInArray,\n angle,\n randomPoint,\n randomPoints,\n area,\n triangleArea,\n circleArea,\n randomPointInDistance,\n nearest,\n farthest,\n perimeter,\n positionInCircle,\n possibleConnections,\n center,\n inLine,\n getLine,\n rotate,\n sort,\n move,\n scale,\n cross,\n square,\n rectangle,\n triangle,\n pentagon,\n lerp,\n\n // randomization\n uniqueId,\n randomNumber,\n randomBoolean,\n\n // math\n average,\n inRange,\n degreesToRadians,\n radiansToDegrees,\n roundToPrecision,\n\n // arrays\n intersection,\n difference,\n chunk,\n removeDuplicates,\n sample,\n};\n\n// default export\nexport default {\n // points\n Point,\n distance,\n middle,\n collision,\n pointWithoutCollision,\n collisionInArray,\n angle,\n randomPoint,\n randomPoints,\n area,\n triangleArea,\n circleArea,\n randomPointInDistance,\n nearest,\n farthest,\n perimeter,\n positionInCircle,\n possibleConnections,\n center,\n inLine,\n getLine,\n rotate,\n sort,\n move,\n scale,\n cross,\n square,\n rectangle,\n triangle,\n pentagon,\n lerp,\n\n // randomization\n uniqueId,\n randomNumber,\n randomBoolean,\n\n // math\n average,\n inRange,\n degreesToRadians,\n radiansToDegrees,\n roundToPrecision,\n\n // arrays\n intersection,\n difference,\n chunk,\n removeDuplicates,\n sample,\n};\n","import type { Point } from \"../../types/global\";\n\nconst distance = (point1: Point, point2: Point): number => {\n const dx = point1.x - point2.x;\n const dy = point1.y - point2.y;\n return Math.sqrt(dx * dx + dy * dy);\n};\n\nexport default distance;\n","import type { Point } from \"../../types/global\";\n\nconst collision = (\n point1: Point,\n point2: Point,\n collisionDistance: number,\n callback?: () => void\n): boolean => {\n const dx = point1.x - point2.x;\n const dy = point1.y - point2.y;\n const r = collisionDistance;\n const collides = dx * dx + dy * dy <= r * r;\n\n if (collides) {\n callback?.();\n return true;\n }\n return false;\n};\n\nexport default collision;\n","import type { Point } from \"../../types/global\";\n\nconst middle = (point1: Point, point2: Point): Point => {\n const { x: x1, y: y1 } = point1;\n const { x: x2, y: y2 } = point2;\n\n const xDistance = Math.abs(x1 - x2);\n const yDistance = Math.abs(y1 - y2);\n\n const middleX = x2 >= x1 ? xDistance / 2 : -xDistance / 2;\n const middleY = y2 >= y1 ? yDistance / 2 : -yDistance / 2;\n\n return {\n x: x1 + middleX,\n y: y1 + middleY,\n };\n};\n\nexport default middle;\n","import { distance, randomPoint } from \"../../index\";\nimport type { Bounds, Point } from \"../../types/global\";\n\nconst maxTryCount = 100;\n\nconst pointWithoutCollision = (\n xBounds: Bounds,\n yBounds: Bounds,\n distanceBetweenPoints: number,\n others: Point[],\n currentTryCount = maxTryCount\n): Point | string => {\n if (currentTryCount <= 1) {\n return \"Couldn't get the point\";\n }\n\n const { min: minX, max: maxX } = xBounds;\n const { min: minY, max: maxY } = yBounds;\n\n const initialPoint = randomPoint(\n { min: minX, max: maxX },\n { min: minY, max: maxY }\n );\n\n let hasCollides = false;\n others.forEach((point) => {\n if (distance(initialPoint, point) < distanceBetweenPoints) {\n hasCollides = true;\n }\n });\n\n if (hasCollides) {\n return pointWithoutCollision(\n {\n min: minX,\n max: maxX,\n },\n {\n min: minY,\n max: maxY,\n },\n distanceBetweenPoints,\n others,\n currentTryCount - 1\n );\n } else {\n return initialPoint;\n }\n};\n\nexport default pointWithoutCollision;\n","import collision from \"./collision\";\nimport type { Point } from \"../../types/global\";\n\nconst collisionInArray = (\n initialPoint: Point,\n arr: Point[],\n radius: number\n): Point[] => {\n const collisionsArr: Point[] = [];\n\n // Check for collision for every point in the array. If a collision is found store it to be used later.\n arr.forEach((point: Point) => {\n collision(initialPoint, point, radius, () => {\n collisionsArr.push(point);\n });\n });\n\n return collisionsArr;\n};\n\nexport default collisionInArray;\n","import type { Point } from \"../../types/global\";\n\nconst pi = Math.PI;\n\nconst angle = (point1: Point, point2: Point): number => {\n const { x: startX, y: startY } = point1;\n const { x: endX, y: endY } = point2;\n\n // Check for coincident points to avoid division by zero\n if (startX === endX && startY === endY) {\n return 0;\n }\n\n // Use Math.atan2 for efficient and accurate angle calculation\n const angleInRadians = Math.atan2(endY - startY, endX - startX);\n\n // Adjust angle to correct quadrant if necessary\n const quadrant = Math.ceil((Math.atan2(startY, startX) + 2 * pi) / pi / 2);\n const adjustedAngle = angleInRadians + ((quadrant - 1) * pi) / 2;\n\n return adjustedAngle;\n};\n\nexport default angle;\n","const randomNumber = (min: number, max: number): number => {\n return Math.round(Math.random() * (max - min)) + min;\n};\n\nexport default randomNumber;\n","import getRandomNumber from \"../randomization/randomNumber\";\nimport type { Bounds, Point } from \"../../types/global\";\n\nconst randomPoints = (\n xBounds: Bounds,\n yBounds: Bounds,\n quantity: number\n): Point[] => {\n const { min: minX, max: maxX } = xBounds;\n const { min: minY, max: maxY } = yBounds;\n\n const points: Point[] = [];\n\n for (let i = 0; i < quantity; i++) {\n const x = getRandomNumber(minX, maxX);\n const y = getRandomNumber(minY, maxY);\n\n points.push({ x, y });\n }\n\n return points;\n};\n\nexport default randomPoints;\n","import type { Point } from \"../../types/global\";\n\nconst triangleArea = (\n { x: x1, y: y1 }: Point,\n { x: x2, y: y2 }: Point,\n { x: x3, y: y3 }: Point\n) => Math.abs((x1 * y2 - x2 * y1 + x2 * y3 - x3 * y2 + x3 * y1 - x1 * y3) / 2);\n\nexport default triangleArea;\n","import triangleArea from \"./triangleArea\";\nimport type { Point } from \"../../types/global\";\n\nconst area = (points: Point[]): number => {\n let area = 0;\n\n // Calculate the area for every triangle inside the shape\n for (let i = 2; i < points.length; i++) {\n area += triangleArea(points[0], points[i - 1], points[i]);\n }\n\n return area;\n};\n\nexport default area;\n","import type { Point } from \"../../types/global\";\n\nconst randomPointInDistance = (point: Point, distance: number): Point => {\n const angle = Math.random() * 2 * Math.PI;\n const dx = distance * Math.cos(angle);\n const dy = distance * Math.sin(angle);\n return {\n x: point.x + dx,\n y: point.y + dy,\n };\n};\n\nexport default randomPointInDistance;\n","import distance from \"./distance\";\nimport type { Point } from \"../../types/global\";\n\nconst nearest = (initialPoint: Point, points: Point[]): Point | null => {\n if (!points.length) {\n return null;\n }\n\n let minDistance = Infinity;\n let nearestPoint = points[0];\n\n for (const point of points) {\n const distanceBetween = distance(initialPoint, point);\n if (distanceBetween < minDistance) {\n minDistance = distanceBetween;\n nearestPoint = point;\n }\n }\n\n return nearestPoint;\n};\n\nexport default nearest;\n","import distance from \"./distance\";\nimport type { Point } from \"../../types/global\";\n\nconst perimeter = (points: Point[]): number => {\n let overallDistance = 0;\n for (let i = 0; i < points.length; i++) {\n overallDistance += distance(points[i], points[(i + 1) % points.length]);\n }\n return overallDistance;\n};\n\nexport default perimeter;\n","import type { Point } from \"../../types/global\";\n\nconst positionInCircle = (\n centerPoint: Point,\n radius: number,\n angleInRadians: number\n): Point => {\n const { x: centerX, y: centerY } = centerPoint;\n\n const x = centerX + radius * Math.cos(angleInRadians);\n const y = centerY + radius * Math.sin(angleInRadians);\n\n return { x, y };\n};\n\nexport default positionInCircle;\n","const possibleConnections = (pointsCount: number) => {\n return (pointsCount * (pointsCount - 1)) / 2;\n};\n\nexport default possibleConnections;\n","const circleArea = (radius: number): number => {\n return Math.PI * radius ** 2;\n};\n\nexport default circleArea;\n","import type { Point } from \"../../types/global\";\n\nconst center = (points: Point[]): Point => {\n let sumX = 0;\n let sumY = 0;\n const numPoints = points.length;\n\n // Calculate the sum of x-coordinates and y-coordinates\n for (let i = 0; i < numPoints; i++) {\n const point = points[i];\n sumX += point.x;\n sumY += point.y;\n }\n\n // Find the average x and y coordinates\n const centerX = sumX / numPoints;\n const centerY = sumY / numPoints;\n\n return { x: centerX, y: centerY };\n};\n\nexport default center;\n","import distance from \"./distance\";\nimport type { Point } from \"../../types/global\";\n\nconst farthest = (initialPoint: Point, points: Point[]) => {\n let maxDistance = 0;\n let farthestPoint: Point | null = null;\n for (const point of points) {\n const distanceBetween = distance(initialPoint, point);\n if (distanceBetween > maxDistance) {\n maxDistance = distanceBetween;\n farthestPoint = point;\n }\n }\n\n return farthestPoint;\n};\n\nexport default farthest;\n","import { randomNumber } from \"../../index\";\nimport type { Bounds, Point } from \"../../types/global\";\n\nconst randomPoint = (xBounds?: Bounds, yBounds?: Bounds): Point => {\n const { min: minX, max: maxX } = xBounds || {};\n const { min: minY, max: maxY } = yBounds || {};\n\n return {\n x: maxX ? randomNumber(minX || 0, maxX) : Math.random() * 100,\n y: maxY ? randomNumber(minY || 0, maxY) : Math.random() * 100,\n };\n};\n\nexport default randomPoint;\n","import type { Point } from \"../../types/global\";\n\nconst move = (initialPoint: Point, xStep: number, yStep: number): Point => {\n const { x, y } = initialPoint;\n\n return {\n x: x + xStep,\n y: y + yStep,\n };\n};\n\nexport default move;\n","import type { Point } from \"../../types/global\";\n\nconst scale = (points: Point[], scaleFactorX: number, scaleFactorY: number) => {\n return points.map(({ x, y }) => ({\n x: x * scaleFactorX,\n y: y * scaleFactorY,\n }));\n};\n\nexport default scale;\n","import type { Line, Point } from \"../../types/global\";\n\nconst inLine = (point: Point, line: Line): boolean => {\n const { x, y } = point;\n const startPoint = line.start;\n const endPoint = line.end;\n\n const slope = (endPoint.y - startPoint.y) / (endPoint.x - startPoint.x);\n\n return y - startPoint.y === slope * (x - startPoint.x);\n};\n\nexport default inLine;\n","import type { Line, Point } from \"../../types/global\";\n\nconst getLine = (point1: Point, point2: Point): Line => {\n return {\n start: point1,\n end: point2,\n };\n};\n\nexport default getLine;\n","import type { Line } from \"../../types/global\";\n\nconst cross = (line1: Line, line2: Line): boolean => {\n const line1Start = line1.start;\n const line1End = line1.end;\n const line2Start = line2.start;\n const line2End = line2.end;\n\n // Calculate the direction vectors for both lines\n const line1Dir = {\n x: line1End.x - line1Start.x,\n y: line1End.y - line1Start.y,\n };\n const line2Dir = {\n x: line2End.x - line2Start.x,\n y: line2End.y - line2Start.y,\n };\n\n // Calculate the cross product of the direction vectors\n const crossProduct = line1Dir.x * line2Dir.y - line1Dir.y * line2Dir.x;\n\n // If the cross product is zero, the lines are parallel or coincident\n if (crossProduct === 0) {\n return false;\n }\n\n // Calculate the signed areas of triangles formed by each point and the other line's endpoints\n const area1 =\n (line2End.x - line1Start.x) * (line2Start.y - line1Start.y) -\n (line2Start.x - line1Start.x) * (line2End.y - line1Start.y);\n const area2 =\n (line1End.x - line2Start.x) * (line1Start.y - line2Start.y) -\n (line1Start.x - line2Start.x) * (line1End.y - line2Start.y);\n\n // If the signed areas have different signs, the lines intersect\n return area1 * area2 < 0;\n};\n\nexport default cross;\n","import type { Point } from \"../../types/global\";\n\nconst rotate = (\n points: Point[],\n centerPoint: Point,\n angleInRadians: number\n) => {\n const { x: centerX, y: centerY } = centerPoint;\n return points.map((point) => {\n const x =\n centerX +\n (point.x - centerX) * Math.cos(angleInRadians) -\n (point.y - centerY) * Math.sin(angleInRadians);\n const y =\n centerY +\n (point.x - centerX) * Math.sin(angleInRadians) +\n (point.y - centerY) * Math.cos(angleInRadians);\n return { x, y };\n });\n};\n\nexport default rotate;\n","import type { Point, Coordinate } from \"../../types/global\";\n\n// Helper function to compare points based on the given coordinate\nconst compareFunction = (\n point1: Point,\n point2: Point,\n coordinate?: Coordinate\n) => {\n const { x: x1, y: y1 } = point1;\n const { x: x2, y: y2 } = point2;\n\n if (coordinate === \"x\" || !coordinate) {\n return x1 - x2;\n }\n if (coordinate === \"y\" || !coordinate) {\n return y1 - y2;\n }\n return 0;\n};\n\nconst sort = (points: Point[], coordinate?: Coordinate) => {\n // Sort the points array using the compare function\n return points.sort((point1, point2) =>\n compareFunction(point1, point2, coordinate)\n ); // Return the sorted array\n};\n\nexport default sort;\n","import type { Direction, Point } from \"../../types/global\";\n\nconst sequence: Direction[] = [\"right\", \"down\", \"left\", \"up\"];\n\nconst steps = {\n left: [-1, 0],\n right: [1, 0],\n up: [0, 1],\n down: [0, -1],\n};\n\nconst square = (\n initialPoint: Point,\n size: number,\n direction: Direction = \"right\"\n) => {\n const points: Point[] = [initialPoint];\n let { x, y } = initialPoint;\n\n for (let i = 0; i < 3; i++) {\n const nextStep = steps[direction];\n x += nextStep[0] * size;\n y += nextStep[1] * size;\n points.push({ x, y });\n const nextDirectionIndex =\n sequence.indexOf(direction) + 1 < sequence.length\n ? sequence.indexOf(direction) + 1\n : 0;\n direction = sequence[nextDirectionIndex]; // cyclic rotation\n }\n\n return points;\n};\n\nexport default square;\n","import type { Direction, Point } from \"../../types/global\";\n\nconst sequence: Direction[] = [\"right\", \"down\", \"left\", \"up\"];\nconst steps = {\n left: [-1, 0],\n right: [1, 0],\n up: [0, 1],\n down: [0, -1],\n};\n\nconst rectangle = (\n initialPoint: Point,\n width: number,\n height: number,\n direction: Direction = \"right\"\n) => {\n const points: Point[] = [initialPoint];\n let { x, y } = initialPoint;\n\n for (let i = 0; i < 3; i++) {\n const nextStep = steps[direction];\n x += nextStep[0] * width;\n y += nextStep[1] * height;\n points.push({ x, y });\n\n const nextDirectionIndex =\n sequence.indexOf(direction) + 1 < sequence.length\n ? sequence.indexOf(direction) + 1\n : 0;\n direction = sequence[nextDirectionIndex]; // cyclic rotation\n }\n\n return points;\n};\n\nexport default rectangle;\n","import type { Direction, Point } from \"../../types/global\";\n\nconst steps = {\n left: [-1, 0],\n right: [1, 0],\n up: [0, 1],\n down: [0, -1],\n};\n\nconst triangle = (\n initialPoint: Point,\n size: number,\n direction: Direction = \"left\"\n): Point[] => {\n const height = (Math.sqrt(3) / 2) * size;\n const nextStep = steps[direction];\n\n const points: Point[] = [initialPoint];\n let { x, y } = initialPoint;\n\n for (let i = 0; i < 2; i++) {\n if (i === 0) {\n x += nextStep[0] * size;\n y += nextStep[1] * size; // The second point should have a y increment of 0\n } else {\n x += nextStep[0] ? size / 2 : height;\n y += nextStep[1] ? size / 2 : height;\n }\n points.push({ x, y });\n }\n\n return points;\n};\n\nexport default triangle;\n","import type { Point } from \"../../types/global\";\n\nconst pentagon = (centerPoint: Point, radius: number, angle: number = 0) => {\n const points = [];\n const numberOfSides = 5;\n const { x: centerX, y: centerY } = centerPoint;\n\n const angleRad = (angle % 360) * (Math.PI / 180);\n\n for (let i = 0; i < numberOfSides; i++) {\n const currentAngle = angleRad + (i * (2 * Math.PI)) / numberOfSides;\n const x = centerX + radius * Math.cos(currentAngle);\n const y = centerY + radius * Math.sin(currentAngle);\n points.push({ x, y });\n }\n\n return points;\n};\n\nexport default pentagon;\n","import type { Point } from \"../../types/global\";\n\nconst lerp = (point1: Point, point2: Point, t: number): Point => ({\n x: point1.x + (point2.x - point1.x) * t,\n y: point1.y + (point2.y - point1.y) * t,\n});\n\nexport default lerp;\n","const inRange = (\n number: number,\n minLimit: number,\n maxLimit: number\n): boolean => {\n return number >= minLimit && number <= maxLimit;\n};\n\nexport default inRange;\n","const roundToPrecision = (number: number, precision: number): number => {\n const multiplier = 10 ** precision;\n\n return (\n Math.round(number * multiplier) / // round using Math.round\n multiplier\n ); // scale back the decimal\n};\n\nexport default roundToPrecision;\n","const degreesToRadians = (degrees: number): number => {\n return (degrees * Math.PI) / 180;\n};\n\nexport default degreesToRadians;\n","const radiansToDegrees = (radians: number): number => {\n return (radians * 180) / Math.PI;\n};\n\nexport default radiansToDegrees;\n","const average = (numbers: number[]): number => {\n return numbers.reduce((a, b) => a + b) / numbers.length;\n};\n\nexport default average;\n","const uniqueId = (others?: string[]): string => {\n const newId = crypto.randomUUID();\n if (others) {\n let isTaken: boolean = false;\n // Check if the id exists in others array, if so generate a new one until it's not taken anymore\n others.forEach((id) => {\n if (newId === id) isTaken = true;\n });\n if (isTaken) return uniqueId(others);\n return newId;\n }\n return newId;\n};\n\nexport default uniqueId;\n","const randomBoolean = () => {\n return Boolean(Math.round(Math.random()));\n};\n\nexport default randomBoolean;\n","const intersection = (arr1: unknown[], arr2: unknown[]) => {\n return arr1.filter((value) => arr2.includes(value));\n};\n\nexport default intersection;\n","const difference = (arr1: unknown[], arr2: unknown[]): unknown[] => {\n return arr1.filter((value) => !arr2.includes(value));\n};\n\nexport default difference;\n","const chunk = (array: unknown[], perChunk: number) => {\n const chunks = [];\n for (let i = 0; i < array.length / perChunk; i++) {\n const startIndex = i * perChunk;\n const newChunk = array.slice(startIndex, startIndex + perChunk);\n chunks.push(newChunk);\n }\n return chunks;\n};\n\nexport default chunk;\n","const removeDuplicates = (arr: unknown[]) => {\n return [...new Set(arr)];\n};\n\nexport default removeDuplicates;\n","import randomNumber from \"../randomization/randomNumber\";\n\nconst sample = (arr: unknown[], size: number = 1) => {\n if (size > arr.length)\n throw new Error(\"Sample size is larger than the array length\");\n if (size <= 0) throw new Error(\"Size must be a positive integer\");\n if (size === 1) {\n const randomStart = randomNumber(0, arr.length - 1);\n return arr[randomStart];\n }\n const randomStart = randomNumber(0, arr.length - size);\n return arr.slice(randomStart, randomStart + size);\n};\n\nexport default sample;\n","import distance from \"../core/points/distance\";\nimport collision from \"../core/points/collision\";\nimport middle from \"../core/points/middle\";\nimport angle from \"../core/points/angle\";\nimport move from \"../core/points/move\";\nimport farthest from \"../core/points/farthest\";\nimport nearest from \"../core/points/nearest\";\nimport collisionInArray from \"../core/points/collisionInArray\";\nimport inLine from \"../core/points/inLine\";\nimport getLine from \"../core/points/getLine\";\nimport lerpFn from \"../core/points/lerp\";\nimport rotateFn from \"../core/points/rotate\";\nimport type { Line, Point as PointType } from \"../types/global\";\n\nexport class Point implements PointType {\n constructor(\n public x: number,\n public y: number\n ) {}\n\n static from(point: PointType): Point {\n return new Point(point.x, point.y);\n }\n\n clone(): Point {\n return new Point(this.x, this.y);\n }\n\n equals(other: PointType): boolean {\n return this.x === other.x && this.y === other.y;\n }\n\n toString(): string {\n return `Point(${this.x}, ${this.y})`;\n }\n\n distanceTo(other: PointType): ReturnType<typeof distance> {\n return distance(this, other);\n }\n\n isCollidingWith(\n other: PointType,\n collisionDistance: number\n ): ReturnType<typeof collision> {\n return collision(this, other, collisionDistance);\n }\n\n isCollidingWithAny(\n points: PointType[],\n collisionDistance: number\n ): ReturnType<typeof collisionInArray> {\n return collisionInArray(this, points, collisionDistance);\n }\n\n middleTo(other: PointType): Point {\n const mid = middle(this, other);\n return new Point(mid.x, mid.y);\n }\n\n angleTo(other: PointType): ReturnType<typeof angle> {\n return angle(this, other);\n }\n\n move(x: number, y: number): Point {\n const moved = move(this, x, y);\n return new Point(moved.x, moved.y);\n }\n\n lerp(other: PointType, t: number): Point {\n const p = lerpFn(this, other, t);\n return new Point(p.x, p.y);\n }\n\n rotateAround(center: PointType, angleRad: number): Point {\n const pts = rotateFn([this], center, angleRad);\n return new Point(pts[0].x, pts[0].y);\n }\n\n nearestFromPoints(points: PointType[]): Point | null {\n const near = nearest(this, points);\n return near ? new Point(near.x, near.y) : null;\n }\n\n farthestFromPoints(points: PointType[]): Point | null {\n const far = farthest(this, points);\n return far ? new Point(far.x, far.y) : null;\n }\n\n isInLine(line: Line): ReturnType<typeof inLine> {\n return inLine(this, line);\n }\n\n buildLineWith(point: PointType): ReturnType<typeof getLine> {\n return getLine(this, point);\n }\n}\n\nexport default Point;\n"],"mappings":"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","names":["area","distance","angle","sequence","steps","steps","angle","randomStart","center"]}