{"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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"}