@obliczeniowo/elementary
Version:
Library made in Angular version 20
1 lines • 13.6 kB
Source Map (JSON)
{"version":3,"file":"obliczeniowo-elementary-simple-diagram2-d.mjs","sources":["../../../../projects/components/simple-diagram2-d/components/simple-diagram2-d/simple-diagram2-d.component.ts","../../../../projects/components/simple-diagram2-d/components/simple-diagram2-d/simple-diagram2-d.component.html","../../../../projects/components/simple-diagram2-d/simple-diagram2-d.module.ts","../../../../projects/components/simple-diagram2-d/obliczeniowo-elementary-simple-diagram2-d.ts"],"sourcesContent":["import { ElementaryMath, MinMax } from '@obliczeniowo/elementary/math';\nimport { ChangeDetectionStrategy, Component, ElementRef, Input, OnChanges, Output, SimpleChanges, EventEmitter } from '@angular/core';\nimport { GradientDef } from '@obliczeniowo/elementary/svg';\nimport { IPoint2D, Point2D } from '@obliczeniowo/elementary/classes';\n\nexport interface SimpleDiagramHover { converted: Point2D, original: Point2D }\n\n@Component({\n selector: 'obl-simple-diagram2-d',\n templateUrl: './simple-diagram2-d.component.html',\n styleUrls: ['./simple-diagram2-d.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class SimpleDiagram2DComponent implements OnChanges {\n svg!: SVGSVGElement;\n\n /**\n * Points2D array table as diagram points\n */\n @Input() points: Point2D[] = [];\n /**\n * Gradient definition description including:\n * array of:\n * - colors;\n * - opacity;\n * - offset;\n * coordinates of gradient:\n * - x, y start/end position (optional)\n */\n @Input() gradient: GradientDef | undefined;\n /**\n * When undefined or not set it will 1 on X is 100% object width, and similar on Y\n * When 'userSpaceOnUse' it use space units system (not related to object size)\n */\n @Input() gradientUnits: 'userSpaceOnUse' | undefined;\n /**\n * diagram padding\n */\n @Input() padding = 0;\n /**\n * bottom diagram padding (includes as part of diagram shape)\n */\n @Input() diagramBottomPadding = 5;\n /** */\n @Input() height = 50;\n /** */\n @Input() width = 200;\n /**\n * When set to true emit cursor position value in diagram space coordinates\n */\n @Input() interactive: boolean = false;\n /**\n * Emit when require recalculation\n */\n @Output() recalculate: EventEmitter<{ component: SimpleDiagram2DComponent }> =\n new EventEmitter<{ component: SimpleDiagram2DComponent }>();\n\n @Output() hover = new EventEmitter<SimpleDiagramHover>();\n\n protected convertedShape = '';\n protected convertedLines = '';\n\n protected gradientId = `SimpleDiagram2D-${Math.floor(Math.random() * 100000)}`;\n\n protected xMinMax!: MinMax;\n protected yMinMax!: MinMax;\n protected dx!: number;\n protected dy!: number;\n protected sx!: number;\n protected sy!: number;\n\n constructor(protected element: ElementRef<HTMLElement>) { }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.points) {\n this.convert();\n }\n if (changes.width || changes.height) {\n this.convert();\n }\n }\n\n transform(p: Point2D): Point2D {\n const dHeight = (this.height - this.diagramBottomPadding);\n return new Point2D((p.x - this.xMinMax.min) * this.sx * (this.width - 2 * this.padding) / this.width + this.padding,\n (dHeight - (p.y - this.yMinMax.min) * this.sy) * (this.height - 2 * this.padding) / this.height + this.padding);\n }\n\n mouseToDiagram(p: IPoint2D): Point2D {\n const width = +this.width;\n const height = +this.height;\n const dHeight = height - +this.diagramBottomPadding;\n const padding = +this.padding;\n\n return new Point2D((((p.x - padding) / this.sx) * width) / (width - padding * 2) + this.xMinMax.min, (dHeight - p.y + padding) / this.sy + this.yMinMax.min);\n }\n\n interpolate(x: number): number {\n if (x < this.xMinMax.min && x > this.xMinMax.max) {\n return NaN;\n }\n const index = this.points.findIndex(pt => pt.x >= x) - 1;\n\n if (index === -1) {\n return this.points[0].y;\n }\n\n const fp = this.points[index];\n const sp = this.points[index + 1];\n\n const a = (sp.y - fp.y) / (sp.x - fp.x);\n const b = fp.y - a * fp.x;\n\n return a * x + b;\n }\n\n protected mouseMove(event: MouseEvent) {\n if (this.interactive && !this.points) {\n return;\n }\n\n const element = this.element.nativeElement;\n const mousePos = { x: event.x - element.offsetLeft, y: event.y - element.offsetTop };\n const converted = this.mouseToDiagram(mousePos);\n\n const original = this.points.reduce((p, c) => {\n p = (p && Math.abs(p.x - converted.x) < Math.abs(c.x - converted.x) && p) || c;\n return p;\n })\n\n const hovered = this.transform(original);\n\n this.hover.emit({ converted: hovered, original });\n }\n\n protected convert(): void {\n this.xMinMax = ElementaryMath.getMinMax(this.points.map(p => p.x));\n this.yMinMax = ElementaryMath.getMinMax(this.points.map(p => p.y));\n\n this.dx = (this.xMinMax.max - this.xMinMax.min) || 1;\n this.dy = (this.yMinMax.max - this.yMinMax.min) || 1;\n\n const dHeight = (this.height - this.diagramBottomPadding);\n\n this.sx = this.width / this.dx;\n this.sy = dHeight / this.dy;\n\n const points = this.points.map(p => new Point2D((p.x - this.xMinMax.min) * this.sx, dHeight - (p.y - this.yMinMax.min) * this.sy));\n\n this.convertedLines = 'M' + points.map(p => p.toString(' ')).join('');\n this.convertedShape = points.concat([\n new Point2D((this.xMinMax.max - this.xMinMax.min) * this.sx, (this.yMinMax.max - this.yMinMax.min) * this.sy +\n this.diagramBottomPadding),\n new Point2D(0, (this.yMinMax.max - this.yMinMax.min) * this.sy + this.diagramBottomPadding)]).map(p => p.toString()).join('');\n\n this.recalculate.emit({ component: this });\n }\n}\n","<svg width=\"100%\" [attr.viewBox]=\"'0 0 ' + this.width + ' ' + this.height\" (mousemove)=\"mouseMove($event)\">\n <defs>\n @if (gradient) {\n <g\n obl-svg-linear-gradient\n [gradient]=\"gradient\"\n [name]=\"gradientId\"\n [gradientUnits]=\"gradientUnits\"\n ></g>\n }\n </defs>\n <g\n [attr.transform]=\"\n 'translate(' +\n padding +\n ',' +\n padding +\n ') scale(' +\n (width - padding * 2) / width +\n ', ' +\n (height - padding * 2) / height +\n ')'\n \"\n >\n <polygon\n [attr.points]=\"convertedShape\"\n [style.fill]=\"gradient ? 'URL(#' + gradientId + ')' : undefined\"\n ></polygon>\n <path [attr.d]=\"convertedLines\"></path>\n </g>\n <ng-content></ng-content>\n</svg>\n","import { SvgModule } from '@obliczeniowo/elementary/svg';\nimport { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SimpleDiagram2DComponent } from './components/simple-diagram2-d/simple-diagram2-d.component';\n\n@NgModule({\n declarations: [\n SimpleDiagram2DComponent\n ],\n imports: [\n CommonModule,\n SvgModule\n ],\n exports: [\n SimpleDiagram2DComponent\n ]\n})\nexport class SimpleDiagram2DModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}