UNPKG

@obliczeniowo/elementary

Version:
1 lines 23.3 kB
{"version":3,"file":"obliczeniowo-elementary-radar.mjs","sources":["../../../../projects/components/radar/classes/radar.class.ts","../../../../projects/components/radar/radar-picker/radar-picker.component.ts","../../../../projects/components/radar/radar-picker/radar-picker.component.html","../../../../projects/components/radar/radar.module.ts","../../../../projects/components/radar/obliczeniowo-elementary-radar.ts"],"sourcesContent":["import { ColorType, Point2D } from '@obliczeniowo/elementary/classes';\nimport { DrawingContextInterface, LinePattern, TextAlign } from '@obliczeniowo/elementary/drawing';\nimport { ElementaryMath } from '@obliczeniowo/elementary/math';\n\nexport interface RadarGroup {\n values: number[];\n stroke: number;\n color: ColorType | 'none',\n fill: ColorType | 'none',\n opacity?: number;\n}\n\nexport class Radar {\n private greedColor = 'var(--obl-radar-greed-color, var(--obl-linear-diagram-greed-color))';\n\n closestSet?: { closest: Point2D, category: number, newLevel: number };\n\n constructor(\n private ctx: DrawingContextInterface,\n private levels: number | (string | number)[] = 5,\n private categories: string[] = [],\n private groups: RadarGroup[] = [],\n private size: number = 500\n ) {\n }\n\n getCenter() {\n return new Point2D(this.size / 2, this.size / 2);\n }\n\n getRay() {\n return this.size / 2 - 50;\n }\n\n getMaxLevel(): number {\n return typeof this.levels === 'number' ? this.levels : this.levels.length;\n }\n\n getDRawy() {\n return this.getRay() / (this.getMaxLevel() || 1);\n }\n\n getDAngle() {\n return Math.PI * 2 / (this.categories.length || 1)\n }\n\n draw(ctx: DrawingContextInterface = this.ctx) {\n ctx.clear();\n\n const { categories, greedColor } = this;\n\n if (categories.length < 3) {\n throw new Error('Number of categories must be >= 3');\n }\n\n const count = categories.length;\n const center = this.getCenter();\n const ray = this.getRay();\n const dr = this.getDRawy();\n const dA = this.getDAngle();\n const maxLevel = this.getMaxLevel();\n\n ctx.setFontSize(8);\n\n if (this.groups) {\n ctx.setLinePattern(LinePattern.NONE);\n this.groups.forEach((group, index) => {\n let polygon: Point2D[] = [];\n const { values } = group;\n if (values.length === count) {\n values.forEach(\n (item, index) => {\n const angle = index * dA;\n const r = ray * item / maxLevel;\n polygon = polygon.concat([\n center.add(new Point2D(r * Math.sin(angle), r * Math.cos(angle)).rotate(Math.PI))\n ])\n }\n )\n }\n\n ctx.drawPolygon(polygon, group.stroke, group.color, group.fill,\n { close: true, opacity: group.opacity || 0.5 })\n .drawPolyline(polygon, group.stroke, group.color, { close: true });\n })\n }\n ctx.setTextAlign(TextAlign.LEFT)\n .group();\n\n let mapping = typeof this.levels === 'number' ? [] : this.levels;\n const offset = new Point2D(5, 4);\n\n for (let dRay = 1; dRay <= maxLevel; dRay++) {\n const ray = dr * dRay;\n for (let dAngle = 0; dAngle < count; dAngle++) {\n const angle = dAngle * dA;\n ctx.setLinePattern(LinePattern.DASHED)\n .drawLine(\n center.add(new Point2D(ray * Math.sin(angle), ray * Math.cos(angle)).rotate(Math.PI)),\n center.add(new Point2D(ray * Math.sin(angle + dA), ray * Math.cos(angle + dA)).rotate(Math.PI)),\n 0.25,\n greedColor\n )\n }\n ctx.drawText(`${mapping[dRay - 1] || dRay}`, center.add(new Point2D(0, -ray)).add(offset), greedColor, 0);\n }\n\n ctx.setTextAlign(TextAlign.CENTER)\n\n for (let dAngle = 0; dAngle < count; dAngle++) {\n const angle = dAngle * dA;\n ctx.setLinePattern(LinePattern.DASHED)\n .drawLine(\n center.add(new Point2D(ray * Math.sin(angle), ray * Math.cos(angle)).rotate(Math.PI)),\n center,\n 0.25,\n greedColor\n );\n const angleCondition = angle > Math.PI / 2 && angle < Math.PI / 2 * 3;\n const r = ray + (angleCondition && 10 || 5);\n const start = new Point2D(r * Math.sin(angle), r * Math.cos(angle)).rotate(Math.PI);\n const angleText = angleCondition ? Math.PI : 0;\n const value = this.groups[0].values[dAngle];\n ctx.drawText(categories[dAngle] + (this.groups.length === 1 ? `: ${mapping[value - 1] ?? this.groups[0].values[dAngle]}` : ''), start.add(center), 'gray', ElementaryMath.radiansToDegrees(angle + angleText), {});\n }\n\n ctx.endGroup();\n\n if (this.closestSet) {\n ctx.setLinePattern(LinePattern.NONE);\n const pos = this.closestSet.closest.add(center);\n ctx.drawCircle(pos, 2, 1, 'red', 'white')\n .setTextAlign(this.closestSet.closest.x > 0 ? TextAlign.RIGHT : TextAlign.LEFT)\n .drawText(\n `${mapping[this.closestSet.newLevel - 1] ?? this.closestSet.newLevel}`,\n pos.add(new Point2D(this.closestSet.closest.x > 0 ? -5 : 5, 4)),\n 'red',\n 0\n )\n }\n }\n\n onMove(point: Point2D) {\n this.closestSet = this.getClosest(point);\n this.draw()\n }\n\n getClosest(point: Point2D): {\n closest: Point2D,\n category: number,\n newLevel: number\n } {\n const center = this.getCenter();\n point = point.subtract(center);\n let closest = center.copy();\n let distance = Infinity;\n let newLevel = 0;\n let category = 0;\n\n if (this.groups.length === 1) {\n const { categories } = this;\n const count = categories.length;\n const dr = this.getDRawy();\n const dA = this.getDAngle();\n const maxLevel = this.getMaxLevel();\n for (let rayIndex = 1; rayIndex <= maxLevel; rayIndex++) {\n const ray = dr * rayIndex;\n for (let angleIndex = 0; angleIndex < count; angleIndex++) {\n const angle = angleIndex * dA;\n const checkPoint = new Point2D(ray * Math.sin(angle), ray * Math.cos(angle)).rotate(Math.PI);\n\n const dist = checkPoint.subtract(point).sickLength();\n if (distance > dist) {\n closest = checkPoint;\n newLevel = rayIndex;\n distance = dist;\n category = angleIndex;\n }\n }\n }\n }\n\n return {\n closest,\n category,\n newLevel\n }\n }\n\n clicked(point: Point2D): null | RadarGroup {\n const { closest, category, newLevel } = this.getClosest(point);\n\n if (!closest.isZeroLength) {\n this.groups[0].values[category] = newLevel;\n this.draw();\n\n return this.groups[0];\n }\n\n return null;\n }\n}","import { Component, ElementRef, Input, Output, ViewChild, EventEmitter, HostBinding, SimpleChanges, Renderer2 } from '@angular/core';\n\nimport { DrawingContextInterface, DrawingSvgInterface } from '@obliczeniowo/elementary/drawing';\nimport { Point2D } from '@obliczeniowo/elementary/classes';\n\nimport { Radar, RadarGroup } from '../classes/radar.class';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n@Component({\n selector: 'obl-radar-picker',\n templateUrl: './radar-picker.component.html',\n styleUrl: './radar-picker.component.scss',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n multi: true,\n useExisting: RadarPickerComponent\n },\n ],\n standalone: false\n})\nexport class RadarPickerComponent implements ControlValueAccessor {\n protected dc!: DrawingSvgInterface;\n protected radar!: Radar;\n protected mousePos?: Point2D;\n\n /**\n * as number describe how many of levels should exist and then build levels from 1 to given number\n * as array length describe number of levels that starts from 1 to levels.length and value inside of\n * array is something to display\n */\n @Input() levels: number | (number | string)[] = 5;\n\n /**\n * Categories list as string\n */\n @Input() categories: string[] = [];\n\n /**\n * values and connected to them colors\n * values.values.length must be equal categories.length\n */\n @Input() values!: RadarGroup;\n\n @Output() changed = new EventEmitter<RadarGroup>();\n\n readonly size = 500;\n\n @ViewChild('radar') diagram!: ElementRef<SVGSVGElement>;\n\n @Input()\n @HostBinding('class.disabled') disabled?: any;\n\n onChange = (set: {\n values: RadarGroup,\n categories: string[],\n levels: number | (string | number)[]\n }) => {\n this.changed.emit({ ...set.values });\n };\n\n onTouched = () => { };\n\n constructor(protected renderer: Renderer2) {}\n\n ngAfterViewInit(): void {\n this.draw();\n }\n\n draw(dc: DrawingContextInterface = this.dc): void {\n if (!dc) {\n if (!this.diagram) {\n return;\n }\n\n if (!this.dc) {\n this.dc = new DrawingSvgInterface(\n this.diagram.nativeElement, this.renderer\n );\n\n if (this.values) {\n this.radar = new Radar(this.dc, this.levels, this.categories, [this.values], this.size);\n }\n }\n\n dc = this.dc;\n }\n\n this.radar?.draw(dc);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.values || changes.categories || changes.levels || changes.size && this.diagram && this.values && this.categories && this.levels) {\n this.radar = new Radar(this.dc, this.levels, this.categories, [this.values], this.size);\n this.draw();\n }\n }\n\n move(event: any): void {\n if (this.disabled) {\n return;\n }\n const rect = this.diagram.nativeElement.getBoundingClientRect();\n this.mousePos = new Point2D(\n (event.clientX - rect.left) / rect.width * this.size,\n (event.clientY - rect.top) / rect.height * this.size\n );\n this.radar?.onMove(this.mousePos);\n }\n\n clicked(event: any) {\n if (this.disabled) {\n return;\n }\n\n if (!this.mousePos) {\n this.move(event);\n }\n\n const set = this.radar.clicked(this.mousePos as Point2D);\n\n if (set) {\n this.values = set;\n const { categories, levels } = this;\n this.changed.emit({ ...set });\n this.onChange({\n values: set,\n categories,\n levels\n })\n }\n }\n\n writeValue(set: {\n values: RadarGroup,\n categories: string[],\n levels: number\n }): void {\n Object.assign(this, set);\n this.draw();\n }\n\n registerOnChange(onChange: any): void {\n this.onChange = onChange;\n }\n\n registerOnTouched(onTouched: any): void {\n this.onTouched = onTouched;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n onMouseLeave() {\n if (this.radar) {\n this.radar.closestSet = undefined;\n this.draw();\n }\n }\n}\n","<svg\n [attr.viewBox]=\"'0 0 ' + size + ' ' + size\"\n (mousemove)=\"move($event)\"\n (click)=\"clicked($event)\"\n (mouseout)=\"onMouseLeave()\"\n #radar\n></svg>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RadarPickerComponent } from './radar-picker/radar-picker.component';\n\n@NgModule({\n declarations: [\n RadarPickerComponent\n ],\n imports: [\n CommonModule\n ],\n exports: [\n RadarPickerComponent\n ]\n})\nexport class RadarModule { }\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}