File size: 1,622 Bytes
f23825d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import { ItemValue } from "../../main/components/ControlPane/LineGraph/LineGraph"
import { IPoint, IRect } from "../geometry"
import { ControlSelection } from "../selection/ControlSelection"

export class ControlCoordTransform {
  private _maxValue: number
  private _height: number
  private _lineWidth: number
  private _pixelsPerTick: number

  constructor(
    pixelsPerTick: number,
    maxValue: number,
    height: number,
    lineWidth: number,
  ) {
    this._pixelsPerTick = pixelsPerTick
    this._maxValue = maxValue
    this._height = height
    this._lineWidth = lineWidth
  }

  get maxValue() {
    return this._maxValue
  }

  getX(tick: number) {
    return tick * this._pixelsPerTick
  }

  getTicks(pixels: number) {
    return Math.floor(pixels / this._pixelsPerTick)
  }

  getY(value: number) {
    return (
      (1 - value / this._maxValue) * (this._height - this._lineWidth * 2) +
      this._lineWidth
    )
  }

  getValue(y: number) {
    return Math.floor(
      (1 - (y - this._lineWidth) / (this._height - this._lineWidth * 2)) *
        this._maxValue,
    )
  }

  toPosition(tick: number, value: number): IPoint {
    return {
      x: Math.round(this.getX(tick)),
      y: Math.round(this.getY(value)),
    }
  }

  fromPosition(position: IPoint): ItemValue {
    return {
      tick: this.getTicks(position.x),
      value: this.getValue(position.y),
    }
  }

  transformSelection(selection: ControlSelection): IRect {
    const x = this.getX(selection.fromTick)
    return {
      x,
      y: 0,
      width: this.getX(selection.toTick) - x,
      height: this._height,
    }
  }
}