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