@obliczeniowo/elementary
Version:
Library made in Angular version 19
1 lines • 56.8 kB
Source Map (JSON)
{"version":3,"file":"obliczeniowo-elementary-classes.mjs","sources":["../../../../projects/components/classes/colors/ColorRGB.ts","../../../../projects/components/classes/colors/ColorHSV.ts","../../../../projects/components/classes/dates/dates.class.ts","../../../../projects/components/classes/vectors/Point2D.ts","../../../../projects/components/classes/vectors/Point3D.ts","../../../../projects/components/classes/text-transform/text-transform.class.ts","../../../../projects/components/classes/linaar-function-2d/linear-function.2d.ts","../../../../projects/components/classes/domains/abstract-search-domain.ts","../../../../projects/components/classes/domains/default-search-domain.ts","../../../../projects/components/classes/geometries/rectangle.ts","../../../../projects/components/classes/geometries/polygon.ts","../../../../projects/components/classes/obliczeniowo-elementary-classes.ts"],"sourcesContent":["import { ElementaryMath } from '@obliczeniowo/elementary/math';\r\n\r\nexport class ColorRGB {\r\n private r = 0;\r\n private g = 0;\r\n private b = 0;\r\n protected a = 255;\r\n\r\n /**\r\n * Calculate color with linear interpolation using factor parameter\r\n */\r\n static proportionalColor(\r\n firstColor: ColorRGB,\r\n secondColor: ColorRGB,\r\n factor: number\r\n ): ColorRGB {\r\n factor = Math.min(1, Math.max(0, factor));\r\n return new ColorRGB(\r\n firstColor.red * factor + secondColor.red * (1 - factor),\r\n firstColor.green * factor + secondColor.green * (1 - factor),\r\n firstColor.blue * factor + secondColor.blue * (1 - factor)\r\n );\r\n }\r\n\r\n static fromHex(hexColor: string) {\r\n const color = hexColor.slice(1);\r\n\r\n const red = parseInt(color.substr(0, 2), 16);\r\n const green = parseInt(color.substr(2, 2), 16);\r\n const blue = parseInt(color.substr(4, 2), 16);\r\n\r\n return new ColorRGB(red, green, blue);\r\n }\r\n\r\n static fromHtmlColor(htmlColor: string) {\r\n const d = document.createElement('div');\r\n d.style.color = htmlColor;\r\n window.document.body.appendChild(d);\r\n const parts = (window.getComputedStyle(d).color || '').match(/\\d+/g) || ['00' ,'00', '00'];\r\n \r\n const f = (n: string) => { return parseInt(n, 10); };\r\n window.document.body.removeChild(d);\r\n return new ColorRGB(f(parts[0]), f(parts[1]), f(parts[2]));\r\n }\r\n\r\n constructor(\r\n red: number | string,\r\n green: number | string,\r\n blue: number | string,\r\n alpha: number | string = 255\r\n ) {\r\n this.red = +red;\r\n this.green = +green;\r\n this.blue = +blue;\r\n this.a = +alpha;\r\n }\r\n\r\n private getHex(value: number): string {\r\n return ('0' + value.toString(16)).substr(-2);\r\n }\r\n\r\n /** set red value of color with handling min/max */\r\n set red(red: number) {\r\n this.r = ElementaryMath.minmax(Math.round(red), 0, 255);\r\n }\r\n\r\n get red(): number {\r\n return this.r;\r\n }\r\n\r\n /** set green value of color with handling min/max */\r\n set green(green: number) {\r\n this.g = ElementaryMath.minmax(Math.round(green), 0, 255);\r\n }\r\n\r\n get green(): number {\r\n return this.g;\r\n }\r\n\r\n /** set blue value of color with handling min/max */\r\n set blue(blue: number) {\r\n this.b = ElementaryMath.minmax(Math.round(blue), 0, 255);\r\n }\r\n\r\n get blue(): number {\r\n return this.b;\r\n }\r\n\r\n get alpha(): number {\r\n return this.a;\r\n }\r\n\r\n /** set alpha value of color with handling min/max */\r\n set alpha(alpha: number) {\r\n this.a = ElementaryMath.minmax(Math.floor(alpha), 0, 255);\r\n }\r\n\r\n /**\r\n * Return color in hex format including transparency\r\n * @return - format #ffccbbaa (last one is alpha)\r\n */\r\n get getHexColor(): string {\r\n return this.getHexColorBase + this.getHex(Math.round(this.a));\r\n }\r\n\r\n /**\r\n * Return hex format of color without alpha\r\n * @return color in format: #ff00bb\r\n */\r\n get getHexColorBase(): string {\r\n return '#' + this.getHex(this.r) + this.getHex(this.g) + this.getHex(this.b);\r\n }\r\n\r\n /**\r\n * Return rgba(100, 200, 255, 0.5) color format as string\r\n */\r\n getRGBAColor(): string {\r\n return 'rgba(' + this.r + ', ' + this.g + ', ' + this.b + ', ' + (this.a / 255).toString().substring(0, 5) + ')';\r\n }\r\n\r\n toString(): string {\r\n return this.getHexColorBase;\r\n }\r\n\r\n /**\r\n * create object copy\r\n */\r\n copy(): ColorRGB {\r\n return new ColorRGB(this.red, this.green, this.blue, this.alpha);\r\n }\r\n\r\n /**\r\n * Multiply every single value of colors by factor parameter with handling min/max cases\r\n */\r\n multiply(factor: number): ColorRGB {\r\n return new ColorRGB(this.r * factor, this.g * factor, this.b * factor, this.alpha);\r\n }\r\n\r\n negative(): ColorRGB {\r\n return new ColorRGB(255 - this.r, 255 - this.b, 255 - this.g, this.alpha);\r\n }\r\n}\r\n","import { ColorRGB } from './ColorRGB';\r\n\r\nexport class ColorHSV {\r\n h: number;\r\n s: number;\r\n v: number;\r\n\r\n protected constructor(h: number, s: number, v: number) {\r\n this.h = Math.max(Math.min(ColorHSV.fmod(h, 360), 360), 0);\r\n this.s = Math.max(Math.min(s, 1), 0);\r\n this.v = Math.max(Math.min(v, 255), 0);\r\n }\r\n\r\n /**\r\n * Calculate color with linear interpolation using factor parameter\r\n */\r\n static proportionalColor(\r\n firstColor: ColorHSV,\r\n secondColor: ColorHSV,\r\n factor: number\r\n ): ColorHSV {\r\n factor = Math.min(1, Math.max(0, factor));\r\n return ColorHSV.createColorHSV(\r\n firstColor.h * factor + secondColor.h * (1 - factor),\r\n firstColor.s * factor + secondColor.s * (1 - factor),\r\n firstColor.v * factor + secondColor.v * (1 - factor)\r\n );\r\n }\r\n\r\n /**\r\n * Static constructor for creating ColorHSV object\r\n * @param h hue - value from 0 - 360 degrees\r\n * @param s saturation - value from 0 - 1\r\n * @param v value 0 - 255\r\n * @returns ColorHSV object\r\n */\r\n static createColorHSV(h: number, s: number, v: number): ColorHSV {\r\n return new ColorHSV(h, s, v);\r\n }\r\n\r\n static fmod(a: number, b: number): number {\r\n return a - Math.floor(a / b) * b;\r\n }\r\n\r\n /**\r\n * Static constructor for creating ColorHSV object\r\n * @param colorRGB object of RGB color\r\n * @returns brand, brand new object of ColorHSV\r\n */\r\n static createColorHSVfromRGB(colorRGB: ColorRGB): ColorHSV {\r\n const x: number = Math.min(Math.min(colorRGB.red, colorRGB.green), colorRGB.blue);\r\n let f: number;\r\n let i: number;\r\n\r\n const v = Math.max(Math.max(colorRGB.red, colorRGB.green), colorRGB.blue);\r\n let h: number;\r\n let s: number;\r\n if (x === v) {\r\n h = 0;\r\n s = 0;\r\n } else {\r\n f =\r\n colorRGB.red === x\r\n ? colorRGB.green - colorRGB.blue\r\n : colorRGB.green === x\r\n ? colorRGB.blue - colorRGB.red\r\n : colorRGB.red - colorRGB.green;\r\n i = colorRGB.red === x ? 3 : colorRGB.green === x ? 5 : 1;\r\n h = ColorHSV.fmod((i - f / (v - x)) * 60, 360);\r\n s = (v - x) / v;\r\n }\r\n\r\n return new ColorHSV(h, s, v);\r\n }\r\n\r\n convertToRGB(): ColorRGB {\r\n let i: number;\r\n let f: number;\r\n let p: number;\r\n let q: number;\r\n let t: number;\r\n let r = 0;\r\n let g = 0;\r\n let b = 0;\r\n let h = this.h;\r\n const v = this.v;\r\n const s = this.s;\r\n\r\n if (v === 0) {\r\n r = 0;\r\n g = 0;\r\n } else {\r\n h /= 60;\r\n i = Math.floor(h);\r\n f = h - i;\r\n p = v * (1 - s);\r\n q = v * (1 - s * f);\r\n t = v * (1 - s * (1 - f));\r\n if (i === 0) {\r\n r = v;\r\n g = t;\r\n b = p;\r\n } else if (i === 1) {\r\n r = q;\r\n g = v;\r\n b = p;\r\n } else if (i === 2) {\r\n r = p;\r\n g = v;\r\n b = t;\r\n } else if (i === 3) {\r\n r = p;\r\n g = q;\r\n b = v;\r\n } else if (i === 4) {\r\n r = t;\r\n g = p;\r\n b = v;\r\n } else if (i === 5) {\r\n r = v;\r\n g = p;\r\n b = q;\r\n }\r\n }\r\n return new ColorRGB(r, g, b);\r\n }\r\n\r\n addHue(hue: number): ColorHSV {\r\n return ColorHSV.createColorHSV(this.h + hue, this.s, this.v);\r\n }\r\n\r\n toString(): string {\r\n return this.convertToRGB().toString();\r\n }\r\n}\r\n","export type CompareOperators = '<' | '=' | '>' | '!=' | '<=' | '>=';\r\n\r\nexport class Dates {\r\n static countDays(start: Date, end: Date): number {\r\n let iterator = new Date(start);\r\n let i = 0;\r\n\r\n if (start.getTime() > end.getTime()) {\r\n throw new Error('start date must be smaller then end date')\r\n }\r\n\r\n while (!Dates.equalToDayLevel(iterator, end)) {\r\n // (24 hours * 60 min * 60 sec * 1000 ms * 2) in dividing part\r\n const dt = Math.ceil((end.getTime() - iterator.getTime()) / 172800000);\r\n iterator.setDate(iterator.getDate() + dt);\r\n i += dt;\r\n }\r\n\r\n return i;\r\n }\r\n\r\n static countWeeks(start: Date, end: Date): number {\r\n return (end.getTime() - start.getTime()) / 604800000;\r\n }\r\n\r\n static getWeekDate(date: Date, type: 'last' | 'first' = 'first', offset: number = 0): Date {\r\n const weekDay = (date.getDay() + offset) % 7;\r\n\r\n return new Date(date.getTime() + (type === 'first' ? -1 : 1) * 86400000 * weekDay);\r\n }\r\n\r\n static equalToDayLevel(first: Date, last: Date): boolean {\r\n return first.getMonth() === last.getMonth() && first.getDate() === last.getDate() && first.getFullYear() === last.getFullYear();\r\n }\r\n\r\n static equalToTimeLevel(first: Date, last: Date): boolean {\r\n return first.getHours() === last.getHours() && first.getMinutes() === last.getMinutes() && first.getSeconds() === last.getSeconds();\r\n }\r\n\r\n protected static compare(first: number, last: number, operator: CompareOperators, error: Error): boolean {\r\n switch (operator) {\r\n case '<':\r\n return first < last;\r\n case '<=':\r\n return first <= last;\r\n case '=':\r\n return first === last;\r\n case '>=':\r\n return first >= last;\r\n case '>':\r\n return first > last;\r\n case '!=':\r\n return first !== last;\r\n default:\r\n throw error;\r\n }\r\n }\r\n\r\n static compareToTimeLevel(first: Date, last: Date, operator: CompareOperators): boolean {\r\n const f = Dates.setDateToZero(new Date(first)).getTime();\r\n const l = Dates.setDateToZero(new Date(last)).getTime();\r\n\r\n return Dates.compare(f, l, operator, new Error('Wrong operator in Dates.compareToTimeLevel method'));\r\n }\r\n\r\n /**\r\n * Compare two dates on time level that consider only hours, minutes and seconds (no milliseconds)\r\n */\r\n static compareToDateLevel(first: Date, last: Date, operator: CompareOperators): boolean {\r\n const f = Dates.setTimeToZero(new Date(first)).getTime();\r\n const l = Dates.setTimeToZero(new Date(last)).getTime();\r\n\r\n return Dates.compare(f, l, operator, new Error('Wrong operator in Dates.compareToDateLevel method'));\r\n }\r\n\r\n /**\r\n * set date \r\n */\r\n static setTimeToZero(date: Date): Date {\r\n return new Date(date.getFullYear(), date.getMonth(), date.getDate());\r\n }\r\n\r\n /**\r\n * clear date part and milliseconds part\r\n */\r\n static setDateToZero(date: Date): Date {\r\n const copy = new Date(date);\r\n copy.setTime(Math.floor((date.getTime() % 86400000) / 1000) * 1000);\r\n\r\n return copy;\r\n }\r\n\r\n static timeFromArray(time: [number, number, number]): Date {\r\n const date = new Date();\r\n\r\n date.setTime(0);\r\n date.setHours(time[0], time[1], time[2]);\r\n\r\n return date;\r\n }\r\n}\r\n","import { ColorType } from '../colors/color-interface';\r\n\r\nexport interface IPoint2D {\r\n x: number;\r\n y: number;\r\n}\r\n\r\nexport interface IDrawText {\r\n drawText: (\r\n text: string,\r\n handlePosition: Point2D,\r\n color: ColorType,\r\n angle: number,\r\n options?: any\r\n ) => void;\r\n\r\n setFontSize: (size: number) => void;\r\n}\r\n\r\nexport class Point2D implements IPoint2D {\r\n x: number;\r\n y: number;\r\n\r\n static isCorrectPoint(point: IPoint2D): boolean {\r\n return (\r\n // eslint-disable-next-line @typescript-eslint/prefer-optional-chain\r\n point &&\r\n point.x !== undefined &&\r\n point.y !== undefined &&\r\n point.x !== null &&\r\n point.y !== null\r\n );\r\n }\r\n\r\n static fromInterface(iPoint: IPoint2D): Point2D {\r\n return new Point2D(iPoint.x, iPoint.y);\r\n }\r\n\r\n /**\r\n * Check if two lines described by pairs of points intersects with each other\r\n * @param pt1 first line start point\r\n * @param pt2 first line end point\r\n * @param pt3 second line start point\r\n * @param pt4 second line end point\r\n * @returns true if intersection exist\r\n */\r\n static linesIntersect(pt1: Point2D, pt2: Point2D, pt3: Point2D, pt4: Point2D) {\r\n if (\r\n Math.sign(pt1.subtract(pt2).determinant(pt3.subtract(pt2))) !==\r\n Math.sign(pt1.subtract(pt2).determinant(pt4.subtract(pt2))) &&\r\n Math.sign(pt3.subtract(pt4).determinant(pt1.subtract(pt4))) !==\r\n Math.sign(pt3.subtract(pt4).determinant(pt2.subtract(pt4)))\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n constructor(x: number = 0, y: number = 0) {\r\n this.x = x;\r\n this.y = y;\r\n }\r\n\r\n get isZeroLength(): boolean {\r\n return this.x === 0 && this.y === 0;\r\n }\r\n\r\n isPtInCircle(centralPoint: Point2D, ray: number): boolean {\r\n return this.subtract(centralPoint).sickLength() < ray * ray;\r\n }\r\n\r\n isPtInRect(x: number, y: number, width: number, height: number) {\r\n return this.x >= x && this.x <= x + width && this.y >= y && this.y <= y + height;\r\n }\r\n\r\n isEqual(point2D: Point2D): boolean {\r\n return this.x === point2D.x && this.y === point2D.y;\r\n }\r\n\r\n multiply(value: number): Point2D {\r\n return new Point2D(value * this.x, value * this.y);\r\n }\r\n\r\n scalarMultiple(other: Point2D): number {\r\n return this.x * other.x + this.y * other.y;\r\n }\r\n\r\n determinant(other: Point2D): number {\r\n return this.x * other.y - this.y * other.x;\r\n }\r\n\r\n scale(xs: number, ys: number): Point2D {\r\n return new Point2D(this.x * xs, this.y * ys);\r\n }\r\n\r\n add(point: Point2D): Point2D {\r\n return new Point2D(this.x + point.x, this.y + point.y);\r\n }\r\n\r\n subtract(point: Point2D): Point2D {\r\n return new Point2D(this.x - point.x, this.y - point.y);\r\n }\r\n\r\n length(): number {\r\n return Math.sqrt(this.scalarMultiple(this));\r\n }\r\n\r\n /**\r\n * Set vector length\r\n * @param length new length to set\r\n * @returns new instance of Point2D with new length if current length of vector is !== 0 in this case\r\n * return degenerated { x: 0, y: 0 } vector\r\n */\r\n setLength(length: number): Point2D {\r\n const k = length / (this.length() || 1);\r\n\r\n return new Point2D(k * this.x, k * this.y);\r\n }\r\n\r\n /**\r\n * Calculate x * x + y * y = scalarMultiple(this)\r\n * @returns return sick length that can be useful to compare distance between points without calculate sqrt.\r\n * for example if you have two points P1, P2 then P1.sickLength() < P2.sickLength() means P1 is closer to beginning of\r\n * x = 0, y = 0 point then P2 (not require calculate sqrt)\r\n */\r\n sickLength(): number {\r\n return this.scalarMultiple(this);\r\n }\r\n\r\n angle(reverseX: boolean = false): number {\r\n return Math.atan2(this.y, reverseX ? -this.x : this.x);\r\n }\r\n\r\n /**\r\n * rotate point by angle\r\n * @param angle - in radians\r\n * @returns new Instance of Point2D\r\n */\r\n rotate(angle: number): Point2D {\r\n const sin = Math.sin(angle);\r\n const cos = Math.cos(angle);\r\n\r\n return new Point2D(\r\n this.x * cos - this.y * sin,\r\n this.x * sin + this.y * cos\r\n );\r\n }\r\n\r\n /**\r\n * Calculate Point2D containing coordinates of point thrown perpendicularly on line\r\n * @param startLinePoint first point of line\r\n * @param endLinePoint last point of line\r\n * @returns if points are equal then null, if not then new instance of Point2D containing coordinates of point thrown\r\n * perpendicularly on line\r\n */\r\n getPointOnLine(startLinePoint: Point2D, endLinePoint: Point2D): Point2D | null {\r\n if (startLinePoint.isEqual(endLinePoint)) {\r\n return null;\r\n }\r\n\r\n const lineVector: Point2D = startLinePoint.subtract(endLinePoint);\r\n const u: number =\r\n this.subtract(startLinePoint).scalarMultiple(\r\n startLinePoint.subtract(endLinePoint)\r\n ) / lineVector.scalarMultiple(lineVector);\r\n\r\n return startLinePoint.add(lineVector.multiply(u));\r\n }\r\n\r\n /**\r\n * Method to draw point position using IDrawingInterface (require only DrawText method)\r\n * @param ctx can be any IDrawingInterface or your own class containing drawing method\r\n * @param options options to control drawing:\r\n * x, y - position coordinates to display (can be different then coordinates)\r\n * precision - 2 for value 2.3333 display 2.33\r\n * color - of text\r\n * angle - of text\r\n */\r\n drawPointPos(\r\n ctx: IDrawText,\r\n options: {\r\n x?: number;\r\n y?: number;\r\n precision?: number;\r\n color?: string;\r\n angle?: number;\r\n fontSize?: number;\r\n }\r\n ): void {\r\n ctx.setFontSize(options?.fontSize || 5);\r\n ctx.drawText(\r\n `X: ${this.x.toFixed(options?.precision || 3)}; Y: ${this.y.toFixed(\r\n options?.precision || 3\r\n )}`,\r\n new Point2D(options?.x || this.x, options?.y || this.y),\r\n options?.color || 'black',\r\n options?.angle || 0,\r\n );\r\n }\r\n\r\n /**\r\n * Make brand brand new copy of object\r\n * @returns new instance\r\n */\r\n copy(): Point2D {\r\n return new Point2D(this.x, this.y);\r\n }\r\n\r\n /**\r\n * Simplify to interface\r\n *\r\n * @returns IPoint2D interface\r\n */\r\n toInterface(): IPoint2D {\r\n return { x: this.x, y: this.y };\r\n }\r\n\r\n /**\r\n * Convert to string\r\n * @param separator separator to use for coordinates\r\n * @returns string in format: ' 10, 23.5'\r\n */\r\n toString(separator: string = ','): string {\r\n return ' ' + this.x + separator + this.y;\r\n }\r\n\r\n toCssTranslate(unit: '' | 'px' | 'rem' = '') {\r\n return `translate(${this.x}${unit}, ${this.y}${unit})`\r\n }\r\n}\r\n\r\nexport interface IPoint2DData<T = any> extends IPoint2D {\r\n extData: T;\r\n}\r\n\r\nexport class Point2DData<T = any> extends Point2D {\r\n extData?: T;\r\n\r\n constructor(x: number = 0, y: number = 0, extData?: T) {\r\n super(x, y);\r\n\r\n this.extData = extData;\r\n }\r\n}\r\n","export class Point3D {\r\n x = 0;\r\n y = 0;\r\n z = 0;\r\n\r\n constructor(x: number = 0, y: number = 0, z: number = 0) {\r\n this.x = x;\r\n this.y = y;\r\n this.z = z;\r\n }\r\n\r\n add(point: Point3D): Point3D {\r\n return new Point3D(\r\n this.x + point.x,\r\n this.y + point.y,\r\n this.z + point.z\r\n );\r\n }\r\n\r\n subtract(point: Point3D): Point3D {\r\n return new Point3D(\r\n this.x - point.x,\r\n this.y - point.y,\r\n this.z - point.z\r\n );\r\n }\r\n\r\n sickLength(): number {\r\n return this.x * this.x + this.y * this.y + this.z * this.z;\r\n }\r\n\r\n length(): number {\r\n return Math.sqrt(this.sickLength());\r\n }\r\n\r\n copy(p3d: Point3D): Point3D {\r\n return new Point3D(p3d.x, p3d.y, p3d.z);\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/non-nullable-type-assertion-style */\r\nexport class TextTransform {\r\n /**\r\n * Split text only on space sign and if length of more then 1 word in one line is greater then maxLength\r\n * @param text - text to split\r\n * @param maxLength - max length of line\r\n * @returns table of splitted text\r\n */\r\n static splitByLengthAndWords(text: string, maxLength: number) {\r\n const strings = text.split(' ');\r\n\r\n const arr: string[] = [];\r\n\r\n arr[0] = strings.shift() || '';\r\n\r\n while (strings.length) {\r\n if (arr[arr.length - 1].length + 1 + strings[0].length < maxLength) {\r\n arr[arr.length - 1] = arr[arr.length - 1] + (strings.shift() as string);\r\n } else {\r\n arr.push(strings.shift() as string);\r\n }\r\n }\r\n\r\n return arr;\r\n }\r\n\r\n /**\r\n * Transform text `some text {to-replace-1}, by using other object {to-replace-2}` using object properties keys\r\n * to replace in text by given properties object\r\n * @param text - text with hidden {key} value\r\n * @param properties - object properties\r\n * @returns text with replaced by keys part, if key not exist in properties object then matching text is put there\r\n */\r\n static prepare(\r\n text: string,\r\n properties: { [key: string]: string },\r\n prepareProps: (\r\n key: string,\r\n properties: { [key: string]: string }\r\n ) => string | undefined = (\r\n key: string,\r\n properties: { [key: string]: string }\r\n ) => properties[key]?.toString()\r\n ) {\r\n const pattern = /{(\\w+)}/g;\r\n\r\n const replacePlaceholders = (match: any, fieldName: string) => {\r\n const fieldValue = prepareProps(fieldName, properties);\r\n\r\n return fieldValue !== undefined ? String(fieldValue) : match;\r\n };\r\n\r\n return text.replace(pattern, replacePlaceholders);\r\n }\r\n\r\n static splitByMathOperator(text: string): string[] {\r\n const operators = ['+', '-', '*', '/', '%', '^', '(', ')'];\r\n const operatorTable = [];\r\n\r\n let currentFragment = '';\r\n for (let i = 0; i < text.length; i++) {\r\n const char = text.charAt(i);\r\n\r\n if (operators.includes(char)) {\r\n if (currentFragment !== '') {\r\n operatorTable.push(currentFragment);\r\n currentFragment = '';\r\n }\r\n operatorTable.push(char);\r\n } else {\r\n currentFragment += char;\r\n }\r\n }\r\n\r\n if (currentFragment !== '') {\r\n operatorTable.push(currentFragment);\r\n }\r\n\r\n return operatorTable;\r\n }\r\n}\r\n","import { Point2D } from '../vectors/Point2D';\r\n\r\nexport class LinearFunction2D {\r\n static fromTwoPoints(p1: Point2D, p2: Point2D): LinearFunction2D | undefined {\r\n // if pt.x === p2.x then there is no way to define proper f(x) function\r\n if (p1.x === p2.x) {\r\n return undefined;\r\n }\r\n\r\n const a = (p2.y - p1.y) / (p2.x - p1.x);\r\n const b = p1.y - a * p1.x;\r\n\r\n return new LinearFunction2D(a, b);\r\n }\r\n\r\n constructor(public a: number, public b: number) {}\r\n\r\n zeroPoint() {\r\n const { a, b } = this;\r\n return -b / a;\r\n }\r\n\r\n xPoint(y: number) {\r\n const { a, b } = this;\r\n return (y - b) / a;\r\n }\r\n\r\n yPoint(x: number) {\r\n const { a, b } = this;\r\n return x * a + b;\r\n }\r\n}\r\n","export abstract class AbstractSearchDomain<T> {\r\n items: T[] = [];\r\n regExpOn = false;\r\n\r\n filtered: T[] = [];\r\n abstract search(filter: string): void;\r\n}\r\n","import { AbstractSearchDomain } from './abstract-search-domain';\r\n\r\nexport class DefaultSearchDomain<T extends { id: string | number; text: string }> extends AbstractSearchDomain<T> {\r\n constructor(items: T[]) {\r\n super();\r\n\r\n this.items = items;\r\n this.filtered = [...this.items];\r\n }\r\n\r\n search(filter: string): void {\r\n if (filter?.length) {\r\n filter = filter.toLowerCase();\r\n if (this.regExpOn) {\r\n const reg = new RegExp(filter, 'i');\r\n this.filtered = this.items.filter(item => reg.test(item.text))\r\n } else {\r\n this.filtered = this.items.filter(item => item.text.toLocaleLowerCase().includes(filter));\r\n }\r\n } else {\r\n this.filtered = [...this.items];\r\n }\r\n }\r\n}\r\n","import { ColorType } from '../colors/color-interface';\r\nimport { Point2D } from '../vectors/Point2D';\r\n\r\ninterface IDrawRectangle {\r\n drawRect: (\r\n x: number,\r\n y: number,\r\n width: number,\r\n height: number,\r\n stroke: number,\r\n strokeColor: ColorType,\r\n fillColor: ColorType,\r\n options?: any\r\n ) => void;\r\n}\r\n\r\nexport class Rectangle {\r\n width = 0;\r\n height = 0;\r\n start!: Point2D;\r\n end!: Point2D;\r\n constructor(start = new Point2D(), width = 0, height = 0) {\r\n Object.assign(this, { start, width, height });\r\n }\r\n\r\n get left() {\r\n return this.start.x;\r\n }\r\n\r\n get bottom() {\r\n return this.start.y;\r\n }\r\n\r\n get top() {\r\n return this.start.y + this.height;\r\n }\r\n\r\n get right() {\r\n return this.start.x + this.width;\r\n }\r\n\r\n isPointIn(point = new Point2D()) {\r\n const { left, right, bottom, top } = this;\r\n if (\r\n point.x >= left &&\r\n point.x <= right &&\r\n point.y >= bottom &&\r\n point.y <= top\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n isRectanglesOverlapping(rectangle = new Rectangle()) {\r\n if (\r\n this.isPointIn(rectangle.start) ||\r\n this.isPointIn(new Point2D(rectangle.right, rectangle.bottom)) ||\r\n this.isPointIn(new Point2D(rectangle.right, rectangle.top)) ||\r\n this.isPointIn(new Point2D(rectangle.left, rectangle.top)) ||\r\n rectangle.isPointIn(this.start) ||\r\n rectangle.isPointIn(new Point2D(this.right, this.bottom)) ||\r\n rectangle.isPointIn(new Point2D(this.right, this.top)) ||\r\n rectangle.isPointIn(new Point2D(this.left, this.top)) ||\r\n Point2D.linesIntersect(this.start, new Point2D(this.right, this.top), rectangle.start, new Point2D(rectangle.right, rectangle.top))\r\n ) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n drawRectangle(ctx: IDrawRectangle, stroke: number, strokeColor: ColorType, fillColor: ColorType) {\r\n const { start, width, height } = this;\r\n ctx.drawRect(start.x, start.y, width, height, stroke, strokeColor, fillColor);\r\n }\r\n}","import { ColorType } from '../colors/color-interface';\r\nimport { Point2D } from '../vectors/Point2D';\r\nimport { Rectangle } from './rectangle';\r\n\r\ninterface IDrawPolyline {\r\n drawPolyline: (\r\n points: Point2D[],\r\n stroke: number,\r\n color: ColorType,\r\n options?: { close?: boolean, [key: string]: any }\r\n ) => {}\r\n}\r\n\r\nexport class Polygon {\r\n static random = (spaceWidth: number, spaceHeight: number, size = 20) => {\r\n const maxRadius = size;\r\n const points: Point2D[] = [];\r\n const center = new Point2D(\r\n Math.random() * (spaceWidth - 2 * maxRadius) + maxRadius,\r\n Math.random() * (spaceHeight - 2 * maxRadius) + maxRadius\r\n );\r\n\r\n const nrOfPoints = Math.ceil(Math.random() * 5) + 5;\r\n\r\n for (let i = 0; i < nrOfPoints; i++) {\r\n const angle = (i / nrOfPoints) * Math.PI * 2;\r\n const radius = Math.random() * maxRadius;\r\n points.push(\r\n new Point2D(\r\n radius * Math.cos(angle) + center.x,\r\n radius * Math.sin(angle) + center.y\r\n )\r\n );\r\n }\r\n\r\n return new Polygon(points);\r\n };\r\n\r\n points: Point2D[] = [];\r\n\r\n constructor(points: Point2D[] = []) {\r\n this.points = points;\r\n }\r\n\r\n getBondingRect() {\r\n const polygon = this.points;\r\n\r\n // detecting if in bounding box\r\n let minX = polygon[0].x;\r\n let maxX = polygon[0].x;\r\n let minY = polygon[0].y;\r\n let maxY = polygon[0].y;\r\n\r\n for (let i = 1; i < polygon.length; i++) {\r\n const q = polygon[i];\r\n minX = Math.min(q.x, minX);\r\n maxX = Math.max(q.x, maxX);\r\n minY = Math.min(q.y, minY);\r\n maxY = Math.max(q.y, maxY);\r\n }\r\n\r\n return new Rectangle(new Point2D(minX, minY), maxX - minX, maxY - minY);\r\n }\r\n\r\n isPointIn(point: Point2D) {\r\n const polygon = this.points;\r\n\r\n // detecting if in bounding box\r\n let minX = polygon[0].x;\r\n let maxX = polygon[0].x;\r\n let minY = polygon[0].y;\r\n let maxY = polygon[0].y;\r\n\r\n for (let i = 1; i < polygon.length; i++) {\r\n const q = polygon[i];\r\n minX = Math.min(q.x, minX);\r\n maxX = Math.max(q.x, maxX);\r\n minY = Math.min(q.y, minY);\r\n maxY = Math.max(q.y, maxY);\r\n }\r\n\r\n if (point.x < minX || point.x > maxX || point.y < minY || point.y > maxY) {\r\n return false;\r\n }\r\n\r\n // https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html\r\n let inside = false;\r\n let j = polygon.length - 1;\r\n for (let i = 0; i < polygon.length; j = i++) {\r\n if (\r\n polygon[i].y > point.y !== polygon[j].y > point.y &&\r\n point.x <\r\n ((polygon[j].x - polygon[i].x) * (point.y - polygon[i].y)) /\r\n (polygon[j].y - polygon[i].y) +\r\n polygon[i].x\r\n ) {\r\n inside = !inside;\r\n }\r\n }\r\n\r\n return inside;\r\n }\r\n\r\n isIntersect(polygon = new Polygon()) {\r\n const { points } = this;\r\n const { points: pPoints } = polygon;\r\n\r\n for (\r\n let start = 0, end = points.length - 1;\r\n start < points.length - 1;\r\n end = start++\r\n ) {\r\n const fp = points[start];\r\n const lp = points[end];\r\n for (\r\n let pStart = 0, pEnd = pPoints.length - 1;\r\n pStart < pPoints.length - 1;\r\n pEnd = pStart++\r\n ) {\r\n const pfp = pPoints[pStart];\r\n const plp = pPoints[pEnd];\r\n if (Point2D.linesIntersect(fp, lp, pfp, plp)) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n subtract(point: Point2D) {\r\n return new Polygon(this.points.map((pt) => pt.subtract(point)));\r\n }\r\n\r\n multiply(scalar: number) {\r\n return new Polygon(this.points.map((point) => point.multiply(scalar)));\r\n }\r\n\r\n drawPolygon(ctx: IDrawPolyline, stroke: number, color: ColorType) {\r\n ctx.drawPolyline(this.points, stroke, color);\r\n }\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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