{"version":3,"file":"maths-kit.mjs","sources":["../src/types.ts","../src/utils/ObserverMap.ts","../src/utils/easings.ts","../src/utils/Vec2d.ts","../src/utils/CircleSegment.ts","../src/utils/geometry.ts","../src/utils/Point2d.ts","../src/utils/LineSegment.ts","../src/utils/matrix.ts","../src/utils/Operation.ts","../src/mathsKit.ts","../src/utils/const.ts","../src/component/Ruler.ts","../src/component/Triangle.ts","../src/component/Protractor.ts","../src/const.ts","../src/utils/Draw.ts","../src/manager.ts"],"sourcesContent":["// import type { CompassElement, CompassTool } from './component/Compass';\nimport type { ProtractorElement, ProtractorTool } from './component/Protractor';\nimport type { RulerElement, RulerTool } from './component/Ruler';\nimport type { Triangle30Element, Triangle30Tool, Triangle45Element, Triangle45Tool } from './component/Triangle';\n\nexport enum MathsKitType {\n    /** 直尺 */\n    Ruler = 'Ruler',\n    /** 45度三角形 */\n    Triangle45 = 'Triangle45',\n    /** 30度三角形 */\n    Triangle30 = 'Triangle30',\n    /** 量角器 */\n    Protractor = 'Protractor',\n    /** 圆规 */\n    Compass = 'Compass',\n}\n\nexport interface MathsKitState {\n    type: MathsKitType;\n    /** 元素的x坐标, 相对于container宽度的归一化数据 */\n    x: number;\n    /** 元素的y坐标, 相对于container高度的归一化数据 */\n    y: number;\n    /** 元素的宽度 */\n    width: number;\n    /** 元素的高度 */\n    height: number;\n    /** 元素的矩阵, 用于计算元素的变换 */\n    matrix: number[];\n    /** 元素的zIndex */\n    zIndex: number;\n    custom?: Record<string, any>;\n}\n\nexport type MathsKitTool = RulerTool | Triangle45Tool | Triangle30Tool | ProtractorTool;\n\nexport type MathsKitElement = RulerElement | Triangle45Element | Triangle30Element | ProtractorElement;","export type ObserverCallback<K, V> = (operation: 'add' | 'delete' | 'update', key: K, value: V) => void;\n\nexport class ObserverMap<K extends string | number | symbol, V> {\n  private _map: Map<K, V>;\n  private _observers: Set<ObserverCallback<K, V>> = new Set();\n\n  constructor(entries?: readonly (readonly [K, V])[] | null) {\n    this._map = new Map(entries);\n  }\n\n  private notifyObservers(operation: 'add' | 'delete' | 'update', key: K, value: V): void {\n    for (const observer of this._observers) {\n      observer(operation, key, value);\n    }\n  }\n\n  observe(callback: ObserverCallback<K, V>): void {\n    this._observers.add(callback);\n  }\n\n  unobserve(callback: ObserverCallback<K, V>): void {\n    this._observers.delete(callback);\n  }\n\n  get(key: K): V | undefined {\n    return this._map.get(key);\n  }\n\n  set(key: K, value: V): this {\n    const notifyKey = this._map.has(key) ? 'update' : 'add';\n    this._map.set(key, value);\n    this.notifyObservers(notifyKey, key, value);\n    return this;\n  }\n\n  has(key: K): boolean {\n    return this._map.has(key);\n  }\n\n  delete(key: K): boolean {\n    const value = this._map.get(key);\n    const bol = this._map.delete(key);\n    if (value) {\n      this.notifyObservers('delete', key, value);\n    }\n    return bol;\n  }\n\n  clear(): void {\n    this._map.clear();\n  }\n\n  get size(): number {\n    return this._map.size;\n  }\n\n  keys(): IterableIterator<K> {\n    return this._map.keys();\n  }\n\n  values(): IterableIterator<V> {\n    return this._map.values();\n  }\n\n  entries(): IterableIterator<[K, V]> {\n    return this._map.entries();\n  }\n\n  forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void {\n    this._map.forEach(callbackfn, thisArg);\n  }\n}\n","/** @public */\nexport const EASINGS = {\n  linear: (t: number) => t,\n  easeInQuad: (t: number) => t * t,\n  easeOutQuad: (t: number) => t * (2 - t),\n  easeInOutQuad: (t: number) => (t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t),\n  easeInCubic: (t: number) => t * t * t,\n  easeOutCubic: (t: number) => --t * t * t + 1,\n  easeInOutCubic: (t: number) =>\n    t < 0.5 ? 4 * t * t * t : (t - 1) * (2 * t - 2) * (2 * t - 2) + 1,\n  easeInQuart: (t: number) => t * t * t * t,\n  easeOutQuart: (t: number) => 1 - --t * t * t * t,\n  easeInOutQuart: (t: number) => (t < 0.5 ? 8 * t * t * t * t : 1 - 8 * --t * t * t * t),\n  easeInQuint: (t: number) => t * t * t * t * t,\n  easeOutQuint: (t: number) => 1 + --t * t * t * t * t,\n  easeInOutQuint: (t: number) => (t < 0.5 ? 16 * t * t * t * t * t : 1 + 16 * --t * t * t * t * t),\n  easeInSine: (t: number) => 1 - Math.cos((t * Math.PI) / 2),\n  easeOutSine: (t: number) => Math.sin((t * Math.PI) / 2),\n  easeInOutSine: (t: number) => -(Math.cos(Math.PI * t) - 1) / 2,\n  easeInExpo: (t: number) => (t <= 0 ? 0 : Math.pow(2, 10 * t - 10)),\n  easeOutExpo: (t: number) => (t >= 1 ? 1 : 1 - Math.pow(2, -10 * t)),\n  easeInOutExpo: (t: number) =>\n    t <= 0\n      ? 0\n      : t >= 1\n        ? 1\n        : t < 0.5\n          ? Math.pow(2, 20 * t - 10) / 2\n          : (2 - Math.pow(2, -20 * t + 10)) / 2,\n} as const;\n\n/** @public */\nexport type EasingType = keyof typeof EASINGS\n","import { EASINGS } from './easings';\n\nexport interface Vec2dSimple {\n\tx: number\n\ty: number\n}\n\n/**\n * A serializable model for 2D vectors.\n *\n * @public */\nexport interface Vec2dModel extends Vec2dSimple {\n\tz: number\n}\n\n/** @public */\nexport type VecLike = Vec2d | Vec2dModel | Vec2dSimple\n\n/** @public */\nexport type StrictVecLike = Vec2d | Vec2dModel\n\n\n/** @public */\nexport class Vec2d {\n  constructor(public x = 0, public y = 0, public z = 1) {}\n\n  get XY():[number,number] {\n    return [this.x, this.y];\n  }\n  setz(z:number) {\n    this.z = z;\n    return this;\n  }\n  setXY(x = this.x, y = this.y) {\n    this.x = x;\n    this.y = y;\n    return this;\n  }\n  set(x = this.x, y = this.y, z = this.z) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    return this;\n  }\n\n  setTo({ x = 0, y = 0, z = 1 }: StrictVecLike) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    return this;\n  }\n\n  rot(r: number) {\n    if (r === 0) return this;\n    const { x, y } = this;\n    const s = Math.sin(r);\n    const c = Math.cos(r);\n    this.x = x * c - y * s;\n    this.y = x * s + y * c;\n    return this;\n  }\n\n  rotWith(C: VecLike, r: number) {\n    if (r === 0) return this;\n    const x = this.x - C.x;\n    const y = this.y - C.y;\n    const s = Math.sin(r);\n    const c = Math.cos(r);\n    this.x = C.x + (x * c - y * s);\n    this.y = C.y + (x * s + y * c);\n    return this;\n  }\n\n  clone(): Vec2d {\n    const { x, y, z } = this;\n    return new Vec2d(x, y, z);\n  }\n\n  sub(V: VecLike) {\n    this.x -= V.x;\n    this.y -= V.y;\n    return this;\n  }\n\n  subXY(x: number, y: number) {\n    this.x -= x;\n    this.y -= y;\n    return this;\n  }\n\n  subScalar(n: number) {\n    this.x -= n;\n    this.y -= n;\n    // this.z -= n\n\n    return this;\n  }\n\n  add(V: VecLike) {\n    this.x += V.x;\n    this.y += V.y;\n    return this;\n  }\n\n  addXY(x: number, y: number) {\n    this.x += x;\n    this.y += y;\n    return this;\n  }\n\n  addScalar(n: number) {\n    this.x += n;\n    this.y += n;\n    // this.z += n\n\n    return this;\n  }\n\n  clamp(min: number, max?: number) {\n    this.x = Math.max(this.x, min);\n    this.y = Math.max(this.y, min);\n    if (max !== undefined) {\n      this.x = Math.min(this.x, max);\n      this.y = Math.min(this.y, max);\n    }\n    return this;\n  }\n\n  div(t: number) {\n    this.x /= t;\n    this.y /= t;\n    // this.z /= t\n    return this;\n  }\n\n  divV(V: VecLike) {\n    this.x /= V.x;\n    this.y /= V.y;\n    // this.z /= V.z\n    return this;\n  }\n\n  mul(t: number) {\n    this.x *= t;\n    this.y *= t;\n    // this.z *= t\n    return this;\n  }\n\n  mulV(V: VecLike) {\n    this.x *= V.x;\n    this.y *= V.y;\n    // this.z *= V.z\n    return this;\n  }\n\n  abs() {\n    this.x = Math.abs(this.x);\n    this.y = Math.abs(this.y);\n    return this;\n  }\n\n  nudge(B: VecLike, distance: number) {\n    const tan = Vec2d.Tan(B, this);\n    return this.add(tan.mul(distance));\n  }\n\n  neg() {\n    this.x *= -1;\n    this.y *= -1;\n    // this.z *= -1\n    return this;\n  }\n\n  cross(V: StrictVecLike) {\n    this.x = this.y * V.z! - this.z * V.y;\n    this.y = this.z * V.x - this.x * V.z!;\n    // this.z = this.x * V.y - this.y * V.x\n    return this;\n  }\n\n  dpr(V: VecLike): number {\n    return Vec2d.Dpr(this, V);\n  }\n\n  cpr(V: VecLike) {\n    return Vec2d.Cpr(this, V);\n  }\n\n  len2(): number {\n    return Vec2d.Len2(this);\n  }\n\n  len(): number {\n    return Vec2d.Len(this);\n  }\n\n  pry(V: VecLike): number {\n    return Vec2d.Pry(this, V);\n  }\n\n  per() {\n    const { x, y } = this;\n    this.x = y;\n    this.y = -x;\n    return this;\n  }\n\n  uni() {\n    return Vec2d.Uni(this);\n  }\n\n  tan(V: VecLike): Vec2d {\n    return Vec2d.Tan(this, V);\n  }\n\n  dist(V: VecLike): number {\n    return Vec2d.Dist(this, V);\n  }\n\n  distanceToLineSegment(A: VecLike, B: VecLike): number {\n    return Vec2d.DistanceToLineSegment(A, B, this);\n  }\n\n  slope(B: VecLike): number {\n    return Vec2d.Slope(this, B);\n  }\n\n  snapToGrid(gridSize: number) {\n    this.x = Math.round(this.x / gridSize) * gridSize;\n    this.y = Math.round(this.y / gridSize) * gridSize;\n    return this;\n  }\n\n  angle(B: VecLike): number {\n    return Vec2d.Angle(this, B);\n  }\n\n  toAngle() {\n    return Vec2d.ToAngle(this);\n  }\n\n  lrp(B: VecLike, t: number): Vec2d {\n    this.x = this.x + (B.x - this.x) * t;\n    this.y = this.y + (B.y - this.y) * t;\n    return this;\n  }\n\n  equals(B: VecLike, tolerance?:number) {\n    return Vec2d.Equals(this, B, tolerance);\n  }\n\n  equalsXY(x: number, y: number) {\n    return Vec2d.EqualsXY(this, x, y);\n  }\n\n  norm() {\n    const l = this.len();\n    this.x = l === 0 ? 0 : this.x / l;\n    this.y = l === 0 ? 0 : this.y / l;\n    return this;\n  }\n\n  toFixed() {\n    return Vec2d.ToFixed(this);\n  }\n\n  toString() {\n    return Vec2d.ToString(Vec2d.ToFixed(this));\n  }\n\n  toJson(): Vec2dModel {\n    return Vec2d.ToJson(this);\n  }\n\n  toArray(): number[] {\n    return Vec2d.ToArray(this);\n  }\n\n  static Add(A: VecLike, B: VecLike): Vec2d {\n    return new Vec2d(A.x + B.x, A.y + B.y);\n  }\n\n  static AddXY(A: VecLike, x: number, y: number): Vec2d {\n    return new Vec2d(A.x + x, A.y + y);\n  }\n\n  static Sub(A: VecLike, B: VecLike): Vec2d {\n    return new Vec2d(A.x - B.x, A.y - B.y);\n  }\n\n  static SubXY(A: VecLike, x: number, y: number): Vec2d {\n    return new Vec2d(A.x - x, A.y - y);\n  }\n\n  static AddScalar(A: VecLike, n: number): Vec2d {\n    return new Vec2d(A.x + n, A.y + n);\n  }\n\n  static SubScalar(A: VecLike, n: number): Vec2d {\n    return new Vec2d(A.x - n, A.y - n);\n  }\n\n  static Div(A: VecLike, t: number): Vec2d {\n    return new Vec2d(A.x / t, A.y / t);\n  }\n\n  static Mul(A: VecLike, t: number): Vec2d {\n    return new Vec2d(A.x * t, A.y * t);\n  }\n\n  static DivV(A: VecLike, B: VecLike): Vec2d {\n    return new Vec2d(A.x / B.x, A.y / B.y);\n  }\n\n  static MulV(A: VecLike, B: VecLike): Vec2d {\n    return new Vec2d(A.x * B.x, A.y * B.y);\n  }\n\n  static Neg(A: VecLike): Vec2d {\n    return new Vec2d(-A.x, -A.y);\n  }\n\n  static Per(A: VecLike): Vec2d {\n    return new Vec2d(A.y, -A.x);\n  }\n\n  static Dist2(A: VecLike, B: VecLike): number {\n    return Vec2d.Sub(A, B).len2();\n  }\n\n  static Abs(A: VecLike): Vec2d {\n    return new Vec2d(Math.abs(A.x), Math.abs(A.y));\n  }\n\n  static Dist(A: VecLike, B: VecLike): number {\n    return Math.hypot(A.y - B.y, A.x - B.x);\n  }\n\n  static Dpr(A: VecLike, B: VecLike): number {\n    return A.x * B.x + A.y * B.y;\n  }\n\n  static Cross(A: StrictVecLike, V: StrictVecLike) {\n    return new Vec2d(\n      A.y * V.z! - A.z! * V.y,\n\t\t\tA.z! * V.x - A.x * V.z!,\n      // A.z = A.x * V.y - A.y * V.x\n    );\n  }\n\n  static Cpr(A: VecLike, B: VecLike) {\n    return A.x * B.y - B.x * A.y;\n  }\n\n  static Len2(A: VecLike): number {\n    return A.x * A.x + A.y * A.y;\n  }\n\n  static Len(A: VecLike): number {\n    return Math.hypot(A.x, A.y);\n  }\n\n  static Pry(A: VecLike, B: VecLike): number {\n    return Vec2d.Dpr(A, B) / Vec2d.Len(B);\n  }\n\n  static Uni(A: VecLike) {\n    return Vec2d.Div(A, Vec2d.Len(A));\n  }\n\n  static Tan(A: VecLike, B: VecLike): Vec2d {\n    return Vec2d.Uni(Vec2d.Sub(A, B));\n  }\n\n  static Min(A: VecLike, B: VecLike): Vec2d {\n    return new Vec2d(Math.min(A.x, B.x), Math.min(A.y, B.y));\n  }\n\n  static Max(A: VecLike, B: VecLike): Vec2d {\n    return new Vec2d(Math.max(A.x, B.x), Math.max(A.y, B.y));\n  }\n\n  static From(A: Vec2dModel | Vec2dSimple) {\n    return new Vec2d().add(A);\n  }\n\n  static FromArray(v: number[]): Vec2d {\n    return new Vec2d(v[0], v[1]);\n  }\n\n  static Rot(A: VecLike, r = 0): Vec2d {\n    const s = Math.sin(r);\n    const c = Math.cos(r);\n    return new Vec2d(A.x * c - A.y * s, A.x * s + A.y * c);\n  }\n\n  /**\n   * 以C为旋转中心, 旋转A点, 旋转角度为r\n   * 返回值为旋转后的点\n   */\n  static RotWith(A: VecLike, C: VecLike, r: number): Vec2d {\n    const x = A.x - C.x;\n    const y = A.y - C.y;\n    const s = Math.sin(r);\n    const c = Math.cos(r);\n    return new Vec2d(C.x + (x * c - y * s), C.y + (x * s + y * c));\n  }\n\n  /**\n\t * Get the nearest point on a line with a known unit vector that passes through point A\n\t *\n\t * ```ts\n\t * Vec.nearestPointOnLineThroughPoint(A, u, Point)\n\t * ```\n\t *\n\t * @param A - Any point on the line\n\t * @param u - The unit vector for the line.\n\t * @param P - A point not on the line to test.\n\t */\n  static NearestPointOnLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): Vec2d {\n    return Vec2d.Mul(u, Vec2d.Sub(P, A).pry(u)).add(A);\n  }\n\n  /**\n   * 获取线段上最近的点\n   * @param A \n   * @param B \n   * @param P \n   * @param clamp \n   * @returns \n   */\n  static NearestPointOnLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp = true): Vec2d {\n    const u = Vec2d.Tan(B, A);\n    const C = Vec2d.Add(A, Vec2d.Mul(u, Vec2d.Sub(P, A).pry(u)));\n\n    // todo: fix error P is B or A, which leads to a NaN value\n\n    if (clamp) {\n      if (C.x < Math.min(A.x, B.x)) return Vec2d.Cast(A.x < B.x ? A : B);\n      if (C.x > Math.max(A.x, B.x)) return Vec2d.Cast(A.x > B.x ? A : B);\n      if (C.y < Math.min(A.y, B.y)) return Vec2d.Cast(A.y < B.y ? A : B);\n      if (C.y > Math.max(A.y, B.y)) return Vec2d.Cast(A.y > B.y ? A : B);\n    }\n\n    return C;\n  }\n\n  static DistanceToLineThroughPoint(A: VecLike, u: VecLike, P: VecLike): number {\n    return Vec2d.Dist(P, Vec2d.NearestPointOnLineThroughPoint(A, u, P));\n  }\n\n  static DistanceToLineSegment(A: VecLike, B: VecLike, P: VecLike, clamp = true): number {\n    return Vec2d.Dist(P, Vec2d.NearestPointOnLineSegment(A, B, P, clamp));\n  }\n\n  static Snap(A: VecLike, step = 1) {\n    return new Vec2d(Math.round(A.x / step) * step, Math.round(A.y / step) * step);\n  }\n\n  static Cast(A: VecLike): Vec2d {\n    if (A instanceof Vec2d) return A;\n    return Vec2d.From(A);\n  }\n\n  static Slope(A: VecLike, B: VecLike): number {\n    if (A.x === B.y) return NaN;\n    return (A.y - B.y) / (A.x - B.x);\n  }\n\n  static Angle(A: VecLike, B: VecLike): number {\n    return Math.atan2(B.y - A.y, B.x - A.x);\n  }\n\n  static Lrp(A: VecLike, B: VecLike, t: number): Vec2d {\n    return Vec2d.Sub(B, A).mul(t).add(A);\n  }\n\n  static Med(A: VecLike, B: VecLike): Vec2d {\n    return new Vec2d((A.x + B.x) / 2, (A.y + B.y) / 2);\n  }\n\n  static Equals(A: VecLike, B: VecLike, tolerance:number = 0.0001): boolean {\n    return Math.abs(A.x - B.x) < tolerance && Math.abs(A.y - B.y) < tolerance;\n  }\n\n  static EqualsXY(A: VecLike, x: number, y: number): boolean {\n    return A.x === x && A.y === y;\n  }\n\n  static EqualsXYZ(A: StrictVecLike, B: StrictVecLike, tolerance:number = 0.0001): boolean {\n    return Vec2d.Equals(A,B, tolerance) && Math.abs((A.z || 0) - ( B.z || 0)) < tolerance;\n  }\n\n  static Clockwise(A: VecLike, B: VecLike, C: VecLike): boolean {\n    return (C.x - A.x) * (B.y - A.y) - (B.x - A.x) * (C.y - A.y) < 0;\n  }\n\n  static Rescale(A: VecLike, n: number) {\n    const l = Vec2d.Len(A);\n    return new Vec2d((n * A.x) / l, (n * A.y) / l);\n  }\n\n  static ScaleWithOrigin(A: VecLike, scale: number, origin: VecLike) {\n    return Vec2d.Sub(A, origin).mul(scale).add(origin);\n  }\n  static ScaleWOrigin(A: VecLike, scale: VecLike, origin: VecLike) {\n    return Vec2d.Sub(A, origin).mulV(scale).add(origin);\n  }\n\n  static ToFixed(A: StrictVecLike, n = 2) {\n    return new Vec2d(+A.x.toFixed(n), +A.y.toFixed(n), +A.z!.toFixed(n));\n  }\n\n  static Nudge(A: VecLike, B: VecLike, distance: number) {\n    return Vec2d.Add(A, Vec2d.Tan(B, A).mul(distance));\n  }\n\n  static ToString(A: VecLike) {\n    return `${A.x}, ${A.y}`;\n  }\n\n  static ToAngle(A: VecLike) {\n    let r = Math.atan2(A.y, A.x);\n    if (r < 0) r += Math.PI * 2;\n\n    return r;\n  }\n\n  static FromAngle(r: number, length = 1) {\n    return new Vec2d(Math.cos(r) * length, Math.sin(r) * length);\n  }\n\n  static ToArray(A: StrictVecLike) {\n    return [A.x, A.y, A.z!];\n  }\n\n  static ToJson(A: StrictVecLike) {\n    const { x, y, z } = A;\n    return { x, y, z };\n  }\n\n  static Average(arr: VecLike[]) {\n    const len = arr.length;\n    const avg = new Vec2d(0, 0);\n    for (let i = 0; i < len; i++) {\n      avg.add(arr[i]);\n    }\n    return avg.div(len);\n  }\n\n  static Clamp(A: Vec2d, min: number, max?: number) {\n    if (max === undefined) {\n      return new Vec2d(Math.min(Math.max(A.x, min)), Math.min(Math.max(A.y, min)));\n    }\n\n    return new Vec2d(Math.min(Math.max(A.x, min), max), Math.min(Math.max(A.y, min), max));\n  }\n\n  /**\n\t * Get an array of points (with simulated pressure) between two points.\n\t *\n\t * @param A - The first point.\n\t * @param B - The second point.\n\t * @param steps - The number of points to return.\n\t */\n  static PointsBetween(A: Vec2dModel, B: Vec2dModel, steps = 6): Vec2d[] {\n    const results: Vec2d[] = [];\n\n    for (let i = 0; i < steps; i++) {\n      const t = EASINGS.easeInQuad(i / (steps - 1));\n      const point = Vec2d.Lrp(A, B, t);\n      point.z = Math.min(1, 0.5 + Math.abs(0.5 - EASINGS.easeInOutQuad(t)) * 0.65);\n      results.push(point);\n    }\n\n    return results;\n  }\n\n  static SnapToGrid(A: VecLike, gridSize = 8) {\n    return new Vec2d(Math.round(A.x / gridSize) * gridSize, Math.round(A.y / gridSize) * gridSize);\n  }\n}\n\n\n","import { Vec2d, VecLike } from './Vec2d';\nimport { LineSegmentLike } from './LineSegment';\nimport { GeometryUtils } from './geometry';\n\n/**\n * 圆弧模型接口\n */\nexport interface CircleSegmentModel {\n  center: VecLike;\n  radius: number;\n  startAngle: number;\n  endAngle: number;\n  /** 绘制方向：1 表示顺时针，-1 表示逆时针 */\n  radian?: 1 | -1;\n}\n\n/**\n * 圆弧类型\n */\nexport type CircleSegmentLike = CircleSegment | CircleSegmentModel;\n\n/**\n * 圆弧类\n * 表示2D平面中的一段圆弧，由圆心、半径、起始角度和结束角度定义\n */\nexport class CircleSegment {\n  constructor(\n    public center: Vec2d = new Vec2d(),\n    public radius: number = 0,\n    public startAngle: number = 0,\n    public endAngle: number = 0,\n    /** 绘制方向：1 表示顺时针，-1 表示逆时针 */\n    public radian: 1 | -1 = -1,\n  ) {}\n\n  /**\n   * 设置圆弧的所有属性\n   * @param center 圆心\n   * @param radius 半径\n   * @param startAngle 起始角度（弧度）\n   * @param endAngle 结束角度（弧度）\n   * @param radian 绘制方向：1 表示顺时针，-1 表示逆时针\n   */\n  set(center: VecLike, radius: number, startAngle: number, endAngle: number, radian:1 | -1 = -1): CircleSegment {\n    this.center.setTo(Vec2d.Cast(center));\n    this.radius = radius;\n    this.startAngle = startAngle;\n    this.endAngle = endAngle;\n    this.radian = radian;\n    return this;\n  }\n\n  /**\n   * 设置圆心\n   */\n  setCenter(center: VecLike): CircleSegment {\n    this.center.setTo(Vec2d.Cast(center));\n    return this;\n  }\n\n  /**\n   * 设置半径\n   */\n  setRadius(radius: number): CircleSegment {\n    this.radius = radius;\n    return this;\n  }\n\n  /**\n   * 设置起始角度\n   */\n  setStartAngle(startAngle: number): CircleSegment {\n    this.startAngle = startAngle;\n    return this;\n  }\n\n  /**\n   * 设置结束角度\n   */\n  setEndAngle(endAngle: number): CircleSegment {\n    this.endAngle = endAngle;\n    return this;\n  }\n\n  /**\n   * 克隆圆弧\n   */\n  clone(): CircleSegment {\n    return new CircleSegment(\n      this.center.clone(),\n      this.radius,\n      this.startAngle,\n      this.endAngle,\n      this.radian,\n    );\n  }\n\n  /**\n   * 获取圆弧的长度\n   */\n  get length(): number {\n    const angleDiff = this.getSignedAngleDifference();\n    return this.radius * Math.abs(angleDiff);\n  }\n\n  /**\n   * 获取起始点\n   */\n  get startPoint(): Vec2d {\n    return Vec2d.Add(this.center, Vec2d.FromAngle(this.startAngle, this.radius));\n  }\n\n  /**\n   * 获取结束点\n   */\n  get endPoint(): Vec2d {\n    return Vec2d.Add(this.center, Vec2d.FromAngle(this.endAngle, this.radius));\n  }\n\n  /**\n   * 获取圆弧的中点\n   */\n  get midpoint(): Vec2d {\n    const midAngle = this.startAngle + this.getSignedAngleDifference() / 2;\n    return Vec2d.Add(this.center, Vec2d.FromAngle(midAngle, this.radius));\n  }\n\n  /**\n   * 获取圆弧的角度差\n   */\n  getAngleDifference(): number {\n    let diff = this.endAngle - this.startAngle;\n    // 规范化角度差到 [0, 2π]\n    while (diff < 0) diff += 2 * Math.PI;\n    while (diff > 2 * Math.PI) diff -= 2 * Math.PI;\n    return diff;\n  }\n\n  /**\n   * 获取考虑方向的有符号角度差\n   * radian = -1（逆时针）：返回 [0, 2π] 的正向角度差\n   * radian = 1（顺时针）：返回非正的角度差（<= 0），表示沿顺时针方向的角度\n   */\n  private getSignedAngleDifference(): number {\n    // 数学坐标系下的 CCW 正向差值（[0, 2π]）\n    let ccw = this.endAngle - this.startAngle;\n    while (ccw < 0) ccw += 2 * Math.PI;\n    while (ccw > 2 * Math.PI) ccw -= 2 * Math.PI;\n\n    // 屏幕坐标系 y 向下：视觉上的“逆时针”应沿负角度方向前进\n    // radian = -1（逆时针，视觉）→ 返回 -ccw；radian = 1（顺时针，视觉）→ 返回 +ccw\n    return this.radian === -1 ? -ccw : ccw;\n  }\n\n  /**\n   * 获取圆弧的包围盒\n   */\n  get boundingBox(): { min: Vec2d; max: Vec2d } {\n    // 计算圆弧的关键点\n    const points = [this.startPoint, this.endPoint];\n    \n    // 检查中间的关键角度点（0, π/2, π, 3π/2）\n    const criticalAngles = [0, Math.PI / 2, Math.PI, 3 * Math.PI / 2];\n    for (const angle of criticalAngles) {\n      if (this.containsAngle(angle)) {\n        points.push(Vec2d.Add(this.center, Vec2d.FromAngle(angle, this.radius)));\n      }\n    }\n    \n    return GeometryUtils.boundingBox(points);\n  }\n\n  /**\n   * 判断给定的角度是否在圆弧范围内\n   */\n  containsAngle(angle: number): boolean {\n    // 采用“从 startAngle 沿弧向（由 radian 决定）走到 endAngle”的定义\n    const normPos = (a: number) => ((a % (2 * Math.PI)) + 2 * Math.PI) % (2 * Math.PI);\n    const start = normPos(this.startAngle);\n    // const end = normPos(this.endAngle);\n    const ang = normPos(angle);\n\n    const signedDiff = this.getSignedAngleDifference();\n\n    if (signedDiff === 0) return normPos(ang) === normPos(start); // 退化情况\n\n    if (signedDiff > 0) {\n      // 正向（顺时针，视觉）沿角度递增方向\n      const forward = normPos(ang - start); // [0, 2π)\n      return forward <= signedDiff;\n    } else {\n      // 负向（逆时针，视觉）沿角度递减方向\n      const backward = normPos(start - ang); // [0, 2π)\n      return -backward >= signedDiff; // backward <= |signedDiff|\n    }\n  }\n\n  /**\n   * 计算点到圆弧的距离\n   */\n  distanceToPoint(point: VecLike): number {\n    const nearestPoint = this.nearestPointOnSegment(point);\n    return Vec2d.Dist(point, nearestPoint);\n  }\n\n  /**\n   * 获取圆弧上距离指定点最近的点\n   */\n  nearestPointOnSegment(point: VecLike, clamp = true): Vec2d {\n    const vecFromCenter = Vec2d.Sub(point, this.center);\n    const angle = Math.atan2(vecFromCenter.y, vecFromCenter.x);\n    \n    let targetAngle = angle;\n    \n    if (clamp && !this.containsAngle(angle)) {\n      // 找到最近的端点\n      const distToStart = Vec2d.Dist(this.startPoint, point);\n      const distToEnd = Vec2d.Dist(this.endPoint, point);\n      targetAngle = distToStart < distToEnd ? this.startAngle : this.endAngle;\n    }\n    \n    return Vec2d.Add(this.center, Vec2d.FromAngle(targetAngle, this.radius));\n  }\n\n  /**\n   * 判断点是否在圆弧上（考虑容差）\n   */\n  containsPoint(point: VecLike, tolerance = 0.0001): boolean {\n    // 先检查点是否在圆上\n    const distToCenter = Vec2d.Dist(point, this.center);\n    if (Math.abs(distToCenter - this.radius) > tolerance) {\n      return false;\n    }\n    \n    // 检查点的角度是否在圆弧范围内\n    const angle = Math.atan2(point.y - this.center.y, point.x - this.center.x);\n    return this.containsAngle(angle);\n  }\n\n  /**\n   * 计算与线段的交点\n   */\n  intersection(other: LineSegmentLike): Vec2d[] {\n    const lineStart = Vec2d.Cast(other.start);\n    const lineEnd = Vec2d.Cast(other.end);\n    const intersections: Vec2d[] = [];\n    \n    // 计算线段的方向向量\n    const direction = Vec2d.Sub(lineEnd, lineStart);\n    const unitDir = Vec2d.Uni(direction);\n    \n    // 计算从圆心到线段起点的向量\n    const toLineStart = Vec2d.Sub(lineStart, this.center);\n    \n    // 计算线段上最近的点到圆心的距离\n    const a = Vec2d.Dpr(unitDir, unitDir);\n    const b = 2 * Vec2d.Dpr(toLineStart, unitDir);\n    const c = Vec2d.Len2(toLineStart) - this.radius * this.radius;\n    \n    const discriminant = b * b - 4 * a * c;\n    \n    if (discriminant < 0) {\n      return intersections;\n    }\n    \n    const sqrtDiscriminant = Math.sqrt(discriminant);\n    const t1 = (-b - sqrtDiscriminant) / (2 * a);\n    const t2 = (-b + sqrtDiscriminant) / (2 * a);\n    \n    // 检查交点是否在线段上\n    if (t1 >= 0 && t1 <= 1) {\n      const point = Vec2d.Lrp(lineStart, lineEnd, t1);\n      const angle = Math.atan2(point.y - this.center.y, point.x - this.center.x);\n      if (this.containsAngle(angle)) {\n        intersections.push(point);\n      }\n    }\n    \n    if (t2 >= 0 && t2 <= 1 && Math.abs(t2 - t1) > 1e-10) {\n      const point = Vec2d.Lrp(lineStart, lineEnd, t2);\n      const angle = Math.atan2(point.y - this.center.y, point.x - this.center.x);\n      if (this.containsAngle(angle)) {\n        intersections.push(point);\n      }\n    }\n    \n    return intersections;\n  }\n\n  /**\n   * 判断是否与线段相交\n   */\n  intersects(other: LineSegmentLike): boolean {\n    return this.intersection(other).length > 0;\n  }\n\n  /**\n   * 平移圆弧\n   */\n  translate(offset: VecLike): CircleSegment {\n    this.center.add(offset);\n    return this;\n  }\n\n  /**\n   * 缩放圆弧（以圆心为中心）\n   */\n  scale(factor: number): CircleSegment {\n    this.radius *= factor;\n    return this;\n  }\n\n  /**\n   * 缩放圆弧（以指定点为中心）\n   */\n  scaleWithOrigin(factor: number, origin: VecLike): CircleSegment {\n    this.center.setTo(Vec2d.ScaleWithOrigin(this.center, factor, origin));\n    this.radius *= factor;\n    return this;\n  }\n\n  /**\n   * 旋转圆弧（以圆心为中心）\n   */\n  rotate(angle: number): CircleSegment {\n    this.startAngle += angle;\n    this.endAngle += angle;\n    return this;\n  }\n\n  /**\n   * 旋转圆弧（以指定点为中心）\n   */\n  rotateWithOrigin(angle: number, origin: VecLike): CircleSegment {\n    this.center.rotWith(origin, angle);\n    this.startAngle += angle;\n    this.endAngle += angle;\n    return this;\n  }\n\n  /**\n   * 将圆弧分割成指定数量的等长段\n   */\n  divide(segments: number): Vec2d[] {\n    if (segments <= 1) return [this.startPoint, this.endPoint];\n    \n    const points: Vec2d[] = [];\n    const angleDiff = this.getSignedAngleDifference();\n    \n    for (let i = 0; i <= segments; i++) {\n      const t = i / segments;\n      const angle = this.startAngle + angleDiff * t;\n      points.push(Vec2d.Add(this.center, Vec2d.FromAngle(angle, this.radius)));\n    }\n    \n    return points;\n  }\n\n  /**\n   * 将圆弧分割成指定长度的段\n   */\n  divideByLength(segmentLength: number): Vec2d[] {\n    const totalLength = this.length;\n    const segments = Math.floor(totalLength / segmentLength);\n    \n    if (segments <= 0) return [this.startPoint, this.endPoint];\n    \n    const points: Vec2d[] = [this.startPoint];\n    const angleDiff = this.getAngleDifference();\n    \n    for (let i = 1; i <= segments; i++) {\n      const t = (i * segmentLength) / totalLength;\n      const angle = this.startAngle + angleDiff * t;\n      points.push(Vec2d.Add(this.center, Vec2d.FromAngle(angle, this.radius)));\n    }\n    \n    if (!GeometryUtils.isNear(points[points.length - 1], this.endPoint)) {\n      points.push(this.endPoint);\n    }\n    \n    return points;\n  }\n\n  /**\n   * 获取圆弧上的点（参数化）\n   */\n  getPointAt(t: number): Vec2d {\n    const clampedT = Math.max(0, Math.min(1, t));\n    const angleDiff = this.getSignedAngleDifference();\n    const angle = this.startAngle + angleDiff * clampedT;\n    return Vec2d.Add(this.center, Vec2d.FromAngle(angle, this.radius));\n  }\n\n  /**\n   * 判断两个圆弧是否相等\n   */\n  equals(other: CircleSegmentLike, tolerance = 0.0001): boolean {\n    const otherSegment = other instanceof CircleSegment ? other : CircleSegment.fromJson(other);\n    \n    return (\n      GeometryUtils.isNear(this.center, otherSegment.center, tolerance) &&\n      Math.abs(this.radius - otherSegment.radius) < tolerance &&\n      Math.abs(this.startAngle - otherSegment.startAngle) < tolerance &&\n      Math.abs(this.endAngle - otherSegment.endAngle) < tolerance &&\n      this.radian === otherSegment.radian\n    );\n  }\n\n  /**\n   * 转换为JSON对象\n   */\n  toJson(): CircleSegmentModel {\n    return {\n      center: this.center.toJson(),\n      radius: this.radius,\n      startAngle: this.startAngle,\n      endAngle: this.endAngle,\n      radian: this.radian,\n    };\n  }\n\n  /**\n   * 转换为字符串\n   */\n  toString(): string {\n    return `CircleSegment(center: ${this.center.toString()}, radius: ${this.radius.toFixed(2)}, angles: ${(this.startAngle * 180 / Math.PI).toFixed(1)}° - ${(this.endAngle * 180 / Math.PI).toFixed(1)}°)`;\n  }\n\n  /**\n   * 静态方法：从圆心、半径和角度创建圆弧\n   */\n  static from(center: VecLike, radius: number, startAngle: number, endAngle: number, radian: 1 | -1 = -1): CircleSegment {\n    return new CircleSegment(\n      Vec2d.Cast(center),\n      radius,\n      startAngle,\n      endAngle,\n      radian,\n    );\n  }\n\n  /**\n   * 静态方法：从圆心和两个点创建圆弧\n   */\n  static fromPoints(center: VecLike, startPoint: VecLike, endPoint: VecLike, radian: 1 | -1 = -1): CircleSegment {\n    const centerVec = Vec2d.Cast(center);\n    const startVec = Vec2d.Cast(startPoint);\n    const endVec = Vec2d.Cast(endPoint);\n    \n    const radius = Vec2d.Dist(centerVec, startVec);\n    const startAngle = Math.atan2(startVec.y - centerVec.y, startVec.x - centerVec.x);\n    const endAngle = Math.atan2(endVec.y - centerVec.y, endVec.x - centerVec.x);\n    \n    return new CircleSegment(centerVec, radius, startAngle, endAngle, radian);\n  }\n\n  /**\n   * 静态方法：从JSON对象创建圆弧\n   */\n  static fromJson(json: CircleSegmentModel): CircleSegment {\n    return new CircleSegment(\n      Vec2d.From(json.center),\n      json.radius,\n      json.startAngle,\n      json.endAngle,\n      (json.radian ?? -1) as 1 | -1,\n    );\n  }\n\n  /**\n   * 静态方法：计算点到圆弧的距离\n   */\n  static distanceToPoint(segment: CircleSegmentLike, point: VecLike): number {\n    const arc = segment instanceof CircleSegment ? segment : CircleSegment.fromJson(segment);\n    return arc.distanceToPoint(point);\n  }\n\n  /**\n   * 静态方法：判断点是否在圆弧上\n   */\n  static containsPoint(segment: CircleSegmentLike, point: VecLike, tolerance = 0.0001): boolean {\n    const arc = segment instanceof CircleSegment ? segment : CircleSegment.fromJson(segment);\n    return arc.containsPoint(point, tolerance);\n  }\n\n  /**\n   * 静态工具：将 CircleSegmentLike 统一转换为 JSON 模型\n   */\n  static toJson(segment: CircleSegmentLike): CircleSegmentModel {\n    return segment instanceof CircleSegment ? segment.toJson() : segment;\n  }\n}","/**\n * 2D几何计算工具类\n * 提供通用的2D几何计算功能\n */\n\nimport { Vec2d, VecLike } from './Vec2d';\nimport { LineSegmentLike } from './LineSegment';\nimport { CircleSegment, CircleSegmentLike } from './CircleSegment';\n\n/**\n * 几何计算工具类\n */\nexport class GeometryUtils {\n  /**\n   * 计算两点之间的距离\n   */\n  static distance(p1: VecLike, p2: VecLike): number {\n    return Vec2d.Dist(p1, p2);\n  }\n\n  /**\n   * 计算点到圆弧的距离\n   */\n  static pointToCircleDistance(point: VecLike, circleSegment: CircleSegmentLike): number {\n    const arc = circleSegment instanceof CircleSegment \n      ? circleSegment \n      : CircleSegment.fromJson(circleSegment);\n    return arc.distanceToPoint(point);\n  }\n\n  /**\n   * 计算点到线段的距离\n   */\n  static pointToLineDistance(point: VecLike, lineSegment: LineSegmentLike): number {\n    return Vec2d.DistanceToLineSegment(lineSegment.start, lineSegment.end, point);\n  }\n\n  /**\n   * 获取距离点最近的线段\n   * @param point 点\n   * @param lineSegments 线段集合\n   * @returns 距离点最近的线段\n   */\n  static getNearestLineSegment(point: VecLike, lineSegments: LineSegmentLike[]): LineSegmentLike | null {\n    let nearestLineSegment: LineSegmentLike | null = null;\n    let minDistance = Infinity;\n    for (const lineSegment of lineSegments) {\n      const distance = this.pointToLineDistance(point, lineSegment);\n      if (distance < minDistance) {\n        minDistance = distance;\n        nearestLineSegment = lineSegment;\n      }\n    }\n    return nearestLineSegment;\n  }\n\n  /**\n   * 获取某个点在某条直线上的基于某个轴的投影点\n   * @param point 点\n   * @param lineSegment 线段(内部需要把线段转换成直线, 然后计算投影点)\n   * @param axis 轴\n   * @returns 投影点\n   */\n  static getProjectionPoint(point: VecLike, lineSegment: LineSegmentLike, axis: 'x' | 'y'): Vec2d {\n    const { start, end } = lineSegment;\n    \n    // 将线段转换为直线，计算直线的方向向量\n    const direction = Vec2d.Tan(end, start);\n    \n    if (axis === 'x') {\n      // 基于x轴的投影：保持x坐标不变，y坐标投影到直线上\n      if (Math.abs(direction.x) < 1e-10) {\n        // 垂直线，投影到直线上任意点的x坐标\n        return new Vec2d(point.x, start.y);\n      }\n      \n      // 使用向量方法计算投影\n      // 计算从起点到目标点的向量\n      const toPoint = Vec2d.Sub(point, start);\n      // 计算在x轴方向上的投影参数\n      const t = toPoint.x / direction.x;\n      // 计算投影点\n      const projectedPoint = Vec2d.Add(start, Vec2d.Mul(direction, t));\n      // 保持x坐标不变\n      return new Vec2d(point.x, projectedPoint.y);\n    } else {\n      // 基于y轴的投影：保持y坐标不变，x坐标投影到直线上\n      if (Math.abs(direction.y) < 1e-10) {\n        // 水平线，投影到直线上任意点的y坐标\n        return new Vec2d(start.x, point.y);\n      }\n      \n      // 使用向量方法计算投影\n      // 计算从起点到目标点的向量\n      const toPoint = Vec2d.Sub(point, start);\n      // 计算在y轴方向上的投影参数\n      const t = toPoint.y / direction.y;\n      // 计算投影点\n      const projectedPoint = Vec2d.Add(start, Vec2d.Mul(direction, t));\n      // 保持y坐标不变\n      return new Vec2d(projectedPoint.x, point.y);\n    }\n  }\n\n  /**\n   * 获取投影点并沿垂直于线段的方向偏移指定距离\n   * @param point 点\n   * @param lineSegment 线段\n   * @param axis 投影轴\n   * @param offsetDistance 偏移距离\n   * @param tolerance 容差\n   * @returns 偏移后的投影点\n   */\n  static getProjectionPointWithOffset(\n    point: VecLike, \n    lineSegment: LineSegmentLike, \n    axis: 'x' | 'y', \n    offsetDistance: number,\n    tolerance:number = 0.1,\n  ): Vec2d {\n\n    // 计算线段的方向向量\n    const { start, end } = lineSegment;\n    const direction = Vec2d.Tan(end, start);\n    // 计算垂直于线段的方向向量（法向量）\n    const normal = Vec2d.Per(direction);\n    const axisVector = axis === 'x' ? new Vec2d(1, 0) : new Vec2d(0, 1);\n    // 判断normal和directionVector的向量是否相交\n    const cross = Math.round(Vec2d.Cpr(normal, axisVector) * 100 / 100);\n    let _axis = axis;\n    if (cross === 0) {\n      _axis = axis === 'x' ? 'y' : 'x';\n    }\n    // 首先获取投影点\n    const projectionPoint = this.getProjectionPoint(point, lineSegment, _axis);\n    \n    // 沿法向量方向偏移指定距离\n    const offsetVector = Vec2d.Mul(normal, offsetDistance);\n    const offsetPoint = Vec2d.Add(projectionPoint, offsetVector);\n    // 最后offsetPoint中的点x,y需要取tolerance容差位数, 比如0.1, 则需要取小数点后一位, 0.01, 则需要取小数点后两位\n    const toleranceFactor = 1 / tolerance;\n    const offsetPointX = Math.round(offsetPoint.x * toleranceFactor) / toleranceFactor;\n    const offsetPointY = Math.round(offsetPoint.y * toleranceFactor) / toleranceFactor;\n    return new Vec2d(offsetPointX, offsetPointY);\n  }\n\n  /**\n   * 计算点到直线的距离\n   */\n  static pointToLineThroughPointDistance(point: VecLike, linePoint: VecLike, lineDirection: VecLike): number {\n    return Vec2d.DistanceToLineThroughPoint(linePoint, lineDirection, point);\n  }\n\n  /**\n   * 获取线段上最近的点\n   */\n  static nearestPointOnLineSegment(lineStart: VecLike, lineEnd: VecLike, point: VecLike, clamp = true): Vec2d {\n    return Vec2d.NearestPointOnLineSegment(lineStart, lineEnd, point, clamp);\n  }\n\n  /**\n   * 计算两条线段的交点\n   */\n  static lineIntersection(\n    line1Start: VecLike, line1End: VecLike,\n    line2Start: VecLike, line2End: VecLike,\n  ): Vec2d | null {\n    const x1 = line1Start.x, y1 = line1Start.y;\n    const x2 = line1End.x, y2 = line1End.y;\n    const x3 = line2Start.x, y3 = line2Start.y;\n    const x4 = line2End.x, y4 = line2End.y;\n\n    const denom = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n    if (Math.abs(denom) < 1e-10) return null; // 平行线\n\n    const t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / denom;\n    const u = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / denom;\n\n    if (t >= 0 && t <= 1 && u >= 0 && u <= 1) {\n      return new Vec2d(\n        x1 + t * (x2 - x1),\n        y1 + t * (y2 - y1),\n      );\n    }\n\n    return null;\n  }\n\n  /**\n   * 判断点是否在多边形内\n   */\n  static pointInPolygon(point: VecLike, polygon: VecLike[]): boolean {\n    let inside = false;\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n      if (((polygon[i].y > point.y) !== (polygon[j].y > point.y)) &&\n          (point.x < (polygon[j].x - polygon[i].x) * (point.y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x)) {\n        inside = !inside;\n      }\n    }\n    return inside;\n  }\n\n  /**\n   * 计算多边形的质心\n   */\n  static polygonCentroid(points: VecLike[]): Vec2d {\n    if (points.length === 0) return new Vec2d(0, 0);\n    if (points.length === 1) return new Vec2d(points[0].x, points[0].y);\n\n    let area = 0;\n    let cx = 0;\n    let cy = 0;\n\n    for (let i = 0; i < points.length; i++) {\n      const j = (i + 1) % points.length;\n      const cross = points[i].x * points[j].y - points[j].x * points[i].y;\n      area += cross;\n      cx += (points[i].x + points[j].x) * cross;\n      cy += (points[i].y + points[j].y) * cross;\n    }\n\n    area /= 2;\n    const factor = 1 / (6 * area);\n\n    return new Vec2d(cx * factor, cy * factor);\n  }\n\n  /**\n   * 计算包围盒\n   */\n  static boundingBox(points: VecLike[]): { min: Vec2d; max: Vec2d } {\n    if (points.length === 0) {\n      return { min: new Vec2d(0, 0), max: new Vec2d(0, 0) };\n    }\n\n    let minX = points[0].x;\n    let minY = points[0].y;\n    let maxX = points[0].x;\n    let maxY = points[0].y;\n\n    for (const point of points) {\n      minX = Math.min(minX, point.x);\n      minY = Math.min(minY, point.y);\n      maxX = Math.max(maxX, point.x);\n      maxY = Math.max(maxY, point.y);\n    }\n\n    return {\n      min: new Vec2d(minX, minY),\n      max: new Vec2d(maxX, maxY),\n    };\n  }\n\n  /**\n   * 判断三点是否顺时针排列\n   */\n  static isClockwise(A: VecLike, B: VecLike, C: VecLike): boolean {\n    return Vec2d.Clockwise(A, B, C);\n  }\n\n  /**\n   * 计算三点形成的角度\n   */\n  static angleBetweenPoints(A: VecLike, B: VecLike, C: VecLike): number {\n    const xa = B.x - A.x;\n    const xb = C.x - B.x;\n    const ya = B.y - A.y;\n    const yb = C.y - B.y;\n    let angle = 0;\n    const _a = Math.sqrt(xa * xa + ya * ya);\n    const _b = Math.sqrt(xb * xb + yb * yb);\n    if (_a && _b) {\n      const p = xa * xb + ya * yb;\n      angle = Math.acos(p / (_a * _b));\n      angle = angle / Math.PI * 180;\n      // direction 大于0 逆时针, 小于0 顺时针, 等于0 平行\n      let direction = xa * yb - ya * xb;\n      direction = direction > 0 ? 1 : -1;\n      angle = 180 + direction * angle;\n    }\n    return angle;\n  }\n\n  /**\n   * 根据圆心和半径，获取圆上的等份点\n   */\n  static getCirclePoints(center: VecLike, radius: number, segments: number = 16): Vec2d[] {\n    const points: Vec2d[] = [];\n    const angleStep = (2 * Math.PI) / segments;\n\n    for (let i = 0; i < segments; i++) {\n      const angle = i * angleStep;\n      const x = center.x + radius * Math.cos(angle);\n      const y = center.y + radius * Math.sin(angle);\n      points.push(new Vec2d(x, y));\n    }\n\n    return points;\n  }\n\n  /**\n   * 根据圆心和起始点，获取圆弧上的等份点\n   */\n  static getArcPoints(\n    center: VecLike,\n    startPoint: VecLike,\n    endAngle: number,\n    segments: number = 8,\n  ): Vec2d[] {\n    const points: Vec2d[] = [];\n    const startAngle = Math.atan2(startPoint.y - center.y, startPoint.x - center.x);\n    const angleStep = endAngle / segments;\n\n    for (let i = 0; i <= segments; i++) {\n      const angle = startAngle + i * angleStep;\n      const x = center.x + Vec2d.Dist(center, startPoint) * Math.cos(angle);\n      const y = center.y + Vec2d.Dist(center, startPoint) * Math.sin(angle);\n      points.push(new Vec2d(x, y));\n    }\n\n    return points;\n  }\n\n  /**\n   * 计算点到点的中点\n   */\n  static midpoint(p1: VecLike, p2: VecLike): Vec2d {\n    return Vec2d.Med(p1, p2);\n  }\n\n  /**\n   * 计算多个点的平均值\n   */\n  static average(points: VecLike[]): Vec2d {\n    return Vec2d.Average(points);\n  }\n\n  /**\n   * 判断两个点是否接近\n   */\n  static isNear(p1: VecLike, p2: VecLike, tolerance: number = 0.0001): boolean {\n    return Vec2d.Equals(p1, p2, tolerance);\n  }\n\n  // /**\n  //  * 转换线段\n  //  * @param lineSegment 线段\n  //  * @param matrix 矩阵\n  //  * @returns 转换后的线段\n  //  */\n  // static transformLineSegment(lineSegment: LineSegmentLike, matrix: Matrix2D): LineSegmentLike {\n  //   return \n  // }\n\n} ","import { Vec2d, Vec2dSimple, VecLike } from './Vec2d';\nimport { GeometryUtils } from './geometry';\n\n/**\n * A serializable model for 2D vectors.\n *\n * @public */\nexport interface Point2dModel extends Vec2dSimple {\n    /** 压力值 */\n    z: number\n    /** 基于上一点的向量 */\n\tv?: VecLike\n    /** 时间戳 */\n    t?: number\n    /** 当前点基于前后两个点的夹角度数(0-360) */\n\ta?: number\n}\n\n/** @public */\nexport type PointLike = Point2d | Point2dModel\n\n/** @public */\nexport class Point2d extends Vec2d {\n  constructor(public x = 0, public y = 0, public z = 0, public v = { x:0, y:0 }, public t = 0, public a = 0) {\n    super(x, y, z);\n  }\n  get timestamp(): number{\n    return this.t;\n  }\n  get pressure() {\n    return this.z;\n  }\n  get angleNum(){\n    return this.a;\n  }\n  get XY():[number,number] {\n    return [this.x, this.y];\n  }\n  setA(a:number) {\n    this.a = a;\n  }\n  setT(t:number) {\n    this.t = t;\n  }\n  setv(v: Vec2dSimple) {\n    this.v = { x:v.x, y:v.y };\n    return this;\n  }\n  set(x = this.x, y = this.y, z = this.z, v = this.v, t = this.t, a = this.a) {\n    this.x = x;\n    this.y = y;\n    this.z = z;\n    this.v = v;\n    this.t = t;\n    this.a = a;\n    return this;\n  }\n  clone(): Point2d {\n    const { x, y, z, v, t, a } = this;\n    const _v = { x:v.x, y:v.y };\n    return new Point2d(x, y, z, _v, t,a);\n  }\n  distance(p: Point2d): number {\n    return GeometryUtils.distance(this, p);\n  }\n  isNear(p: Point2d, tolerance:number): boolean {\n    return GeometryUtils.isNear(this, p, tolerance);\n  }\n  getAngleByPoints(pre:Point2d, next:Point2d){\n    return GeometryUtils.angleBetweenPoints(pre, this, next);\n  }\n  static Sub(A: PointLike, B: VecLike): Point2d {\n    return new Point2d(A.x - B.x, A.y - B.y);\n  }\n  static Add(A: PointLike, B: VecLike): Point2d {\n    return new Point2d(A.x + B.x, A.y + B.y);\n  }\n  /**\n   * 以C为旋转中心, 旋转A点, 旋转角度为r\n   * 返回值为旋转后的点\n   * @param A 要旋转的点\n   * @param C 旋转中心点\n   * @param r 旋转角度（弧度制）\n   * @param decimal 精度小数位数\n   * @returns 旋转后的点\n   */\n  static RotWith(A: Point2d | Vec2d, C: Point2d | Vec2d, r: number, decimal:number = 2 ): Point2d {\n    const x = A.x - C.x;\n    const y = A.y - C.y;\n    const s = Math.sin(r);\n    const c = Math.cos(r);\n    const step = Math.pow(10, decimal);\n    const X = Math.floor((C.x + (x * c - y * s)) * step) / step;\n    const Y = Math.floor((C.y + (x * s + y * c)) * step) / step;\n    return new Point2d(X, Y);\n  }\n  /**\n     * 根据圆心和半径，获取圆上的等份点\n     * @param o 圆心\n     * @param radius 半径 \n     * @param average 均分数\n     * @returns \n     */\n  static GetDotStroke(o:Point2d, radius:number, average:number = 16):Point2d[] {\n    const circlePoints = GeometryUtils.getCirclePoints(o, radius, average);\n    return circlePoints.map(p => new Point2d(p.x, p.y));\n  }\n  /**\n     * 根据圆心和圆上的起始点，获取半圆上的等份点\n     * @param o 圆心 \n     * @param p 圆弧起始点\n     * @param radian 1，顺时针 -1，逆时针 \n     * @param average 均分数\n     * @returns \n     */\n  static GetSemicircleStroke(o:Point2d, p:Point2d, radian:number = -1, average:number = 8):Point2d[] {\n    const endAngle = radian * Math.PI;\n    const arcPoints = GeometryUtils.getArcPoints(o, p, endAngle, average);\n    return arcPoints.map(point => new Point2d(point.x, point.y));\n  }\n}","import { Vec2d, VecLike } from './Vec2d';\nimport { Point2d } from './Point2d';\nimport { GeometryUtils } from './geometry';\n\n/**\n * 线段模型接口\n */\nexport interface LineSegmentModel {\n  start: VecLike;\n  end: VecLike;\n}\n\n/**\n * 线段类型\n */\nexport type LineSegmentLike = LineSegment | LineSegmentModel;\n\n/**\n * 线段类\n * 表示2D平面中的一条线段，由起点和终点定义\n */\nexport class LineSegment {\n  constructor(\n    public start: Vec2d = new Vec2d(),\n    public end: Vec2d = new Vec2d(),\n  ) {}\n\n  /**\n   * 设置线段的起点和终点\n   */\n  set(start: VecLike, end: VecLike): LineSegment {\n    this.start.setTo(Vec2d.Cast(start));\n    this.end.setTo(Vec2d.Cast(end));\n    return this;\n  }\n\n  /**\n   * 设置起点\n   */\n  setStart(point: VecLike): LineSegment {\n    this.start.setTo(Vec2d.Cast(point));\n    return this;\n  }\n\n  /**\n   * 设置终点\n   */\n  setEnd(point: VecLike): LineSegment {\n    this.end.setTo(Vec2d.Cast(point));\n    return this;\n  }\n\n  /**\n   * 克隆线段\n   */\n  clone(): LineSegment {\n    return new LineSegment(this.start.clone(), this.end.clone());\n  }\n\n  /**\n   * 获取线段的长度\n   */\n  get length(): number {\n    return GeometryUtils.distance(this.start, this.end);\n  }\n\n  /**\n   * 获取线段的长度平方（用于性能优化）\n   */\n  get lengthSquared(): number {\n    return Vec2d.Len2(Vec2d.Sub(this.end, this.start));\n  }\n\n  /**\n   * 获取线段的中点\n   */\n  get midpoint(): Vec2d {\n    return GeometryUtils.midpoint(this.start, this.end);\n  }\n\n  /**\n   * 获取线段的方向向量（单位向量）\n   */\n  get direction(): Vec2d {\n    return Vec2d.Tan(this.end, this.start);\n  }\n\n  /**\n   * 获取线段的法向量（垂直于线段）\n   */\n  get normal(): Vec2d {\n    return Vec2d.Per(this.direction);\n  }\n\n  /**\n   * 获取线段的包围盒\n   */\n  get boundingBox(): { min: Vec2d; max: Vec2d } {\n    return GeometryUtils.boundingBox([this.start, this.end]);\n  }\n\n  /**\n   * 计算点到线段的距离\n   */\n  distanceToPoint(point: VecLike): number {\n    return GeometryUtils.pointToLineDistance(point, this.toJson());\n  }\n\n  /**\n   * 获取线段上距离指定点最近的点\n   */\n  nearestPointOnSegment(point: VecLike, clamp = true): Vec2d {\n    return GeometryUtils.nearestPointOnLineSegment(this.start, this.end, point, clamp);\n  }\n\n  /**\n   * 判断点是否在线段上（考虑容差）\n   */\n  containsPoint(point: VecLike, tolerance = 0.0001): boolean {\n    const nearest = this.nearestPointOnSegment(point, true);\n    return GeometryUtils.isNear(point, nearest, tolerance);\n  }\n\n  /**\n   * 判断点是否在线段上（精确判断）\n   */\n  containsPointExact(point: VecLike): boolean {\n    // 检查点是否在线段的包围盒内\n    const { min, max } = this.boundingBox;\n    if (point.x < min.x || point.x > max.x || point.y < min.y || point.y > max.y) {\n      return false;\n    }\n\n    // 检查三点共线\n    const area = Math.abs(\n      (this.end.x - this.start.x) * (point.y - this.start.y) -\n      (point.x - this.start.x) * (this.end.y - this.start.y),\n    );\n    \n    return area < 1e-10;\n  }\n\n  /**\n   * 计算与另一条线段的交点\n   */\n  intersection(other: LineSegmentLike): Vec2d | null {\n    const otherSegment = other instanceof LineSegment ? other : new LineSegment(\n      Vec2d.Cast(other.start),\n      Vec2d.Cast(other.end),\n    );\n    \n    return GeometryUtils.lineIntersection(\n      this.start, this.end,\n      otherSegment.start, otherSegment.end,\n    );\n  }\n\n  /**\n   * 判断是否与另一条线段相交\n   */\n  intersects(other: LineSegmentLike): boolean {\n    return this.intersection(other) !== null;\n  }\n\n  /**\n   * 判断是否与另一条线段平行\n   */\n  isParallel(other: LineSegmentLike): boolean {\n    const otherSegment = other instanceof LineSegment ? other : new LineSegment(\n      Vec2d.Cast(other.start),\n      Vec2d.Cast(other.end),\n    );\n    \n    const dir1 = this.direction;\n    const dir2 = otherSegment.direction;\n    \n    const cross = Vec2d.Cpr(dir1, dir2);\n    return Math.abs(cross) < 1e-10;\n  }\n\n  /**\n   * 判断是否与另一条线段垂直\n   */\n  isPerpendicular(other: LineSegmentLike): boolean {\n    const otherSegment = other instanceof LineSegment ? other : new LineSegment(\n      Vec2d.Cast(other.start),\n      Vec2d.Cast(other.end),\n    );\n    \n    const dir1 = this.direction;\n    const dir2 = otherSegment.direction;\n    \n    const dot = Vec2d.Dpr(dir1, dir2);\n    return Math.abs(dot) < 1e-10;\n  }\n\n  /**\n   * 计算与另一条线段的夹角（弧度）\n   */\n  angleTo(other: LineSegmentLike): number {\n    const otherSegment = other instanceof LineSegment ? other : new LineSegment(\n      Vec2d.Cast(other.start),\n      Vec2d.Cast(other.end),\n    );\n    \n    const dir1 = this.direction;\n    const dir2 = otherSegment.direction;\n    \n    const dot = Vec2d.Dpr(dir1, dir2);\n    const cross = Vec2d.Cpr(dir1, dir2);\n    \n    return Math.atan2(cross, dot);\n  }\n\n  /**\n   * 计算与另一条线段的夹角（度数）\n   */\n  angleToDegrees(other: LineSegmentLike): number {\n    return this.angleTo(other) * (180 / Math.PI);\n  }\n\n  /**\n   * 平移线段\n   */\n  translate(offset: VecLike): LineSegment {\n    this.start.add(offset);\n    this.end.add(offset);\n    return this;\n  }\n\n  /**\n   * 缩放线段（以起点为中心）\n   */\n  scale(factor: number): LineSegment {\n    const direction = this.direction;\n    const length = this.length;\n    this.end.setTo(this.start).add(direction.mul(length * factor));\n    return this;\n  }\n\n  /**\n   * 缩放线段（以指定点为中心）\n   */\n  scaleWithOrigin(factor: number, origin: VecLike): LineSegment {\n    this.start.setTo(Vec2d.ScaleWithOrigin(this.start, factor, origin));\n    this.end.setTo(Vec2d.ScaleWithOrigin(this.end, factor, origin));\n    return this;\n  }\n\n  /**\n   * 旋转线段（以起点为中心）\n   */\n  rotate(angle: number): LineSegment {\n    this.end.rotWith(this.start, angle);\n    return this;\n  }\n\n  /**\n   * 旋转线段（以指定点为中心）\n   * angle: 旋转角度\n   * origin: 旋转中心点\n   */\n  rotateWithOrigin(angle: number, origin: VecLike): LineSegment {\n    this.start.rotWith(origin, angle);\n    this.end.rotWith(origin, angle);\n    return this;\n  }\n\n  /**\n   * 将线段分割成指定数量的等长段\n   */\n  divide(segments: number): Vec2d[] {\n    if (segments <= 1) return [this.start.clone(), this.end.clone()];\n    \n    const points: Vec2d[] = [];\n    for (let i = 0; i <= segments; i++) {\n      const t = i / segments;\n      points.push(Vec2d.Lrp(this.start, this.end, t));\n    }\n    \n    return points;\n  }\n\n  /**\n   * 将线段分割成指定长度的段\n   */\n  divideByLength(segmentLength: number): Vec2d[] {\n    const totalLength = this.length;\n    const segments = Math.floor(totalLength / segmentLength);\n    \n    if (segments <= 0) return [this.start.clone(), this.end.clone()];\n    \n    const points: Vec2d[] = [this.start.clone()];\n    for (let i = 1; i <= segments; i++) {\n      const t = (i * segmentLength) / totalLength;\n      points.push(Vec2d.Lrp(this.start, this.end, t));\n    }\n    \n    if (!GeometryUtils.isNear(points[points.length - 1], this.end)) {\n      points.push(this.end.clone());\n    }\n    \n    return points;\n  }\n\n  /**\n   * 获取线段上的点（参数化）\n   */\n  getPointAt(t: number): Vec2d {\n    return Vec2d.Lrp(this.start, this.end, Math.max(0, Math.min(1, t)));\n  }\n\n  /**\n   * 判断两条线段是否相等\n   */\n  equals(other: LineSegmentLike, tolerance = 0.0001): boolean {\n    const otherSegment = other instanceof LineSegment ? other : new LineSegment(\n      Vec2d.Cast(other.start),\n      Vec2d.Cast(other.end),\n    );\n    \n    return (GeometryUtils.isNear(this.start, otherSegment.start, tolerance) &&\n            GeometryUtils.isNear(this.end, otherSegment.end, tolerance)) ||\n           (GeometryUtils.isNear(this.start, otherSegment.end, tolerance) &&\n            GeometryUtils.isNear(this.end, otherSegment.start, tolerance));\n  }\n\n  /**\n   * 转换为Point2d数组\n   */\n  toPoint2dArray(): Point2d[] {\n    return [\n      new Point2d(this.start.x, this.start.y),\n      new Point2d(this.end.x, this.end.y),\n    ];\n  }\n\n  /**\n   * 转换为Vec2d数组\n   */\n  toVec2dArray(): Vec2d[] {\n    return [this.start.clone(), this.end.clone()];\n  }\n\n  /**\n   * 转换为JSON对象\n   */\n  toJson(): LineSegmentModel {\n    return {\n      start: this.start.toJson(),\n      end: this.end.toJson(),\n    };\n  }\n\n  /**\n   * 转换为字符串\n   */\n  toString(): string {\n    return `LineSegment(${this.start.toString()} -> ${this.end.toString()})`;\n  }\n\n  /**\n   * 静态方法：从两个点创建线段\n   */\n  static fromPoints(start: VecLike, end: VecLike): LineSegment {\n    return new LineSegment(Vec2d.Cast(start), Vec2d.Cast(end));\n  }\n\n  /**\n   * 静态方法：从Point2d数组创建线段\n   */\n  static fromPoint2dArray(points: Point2d[]): LineSegment {\n    if (points.length < 2) {\n      throw new Error('至少需要两个点来创建线段');\n    }\n    return new LineSegment(\n      new Vec2d(points[0].x, points[0].y),\n      new Vec2d(points[points.length - 1].x, points[points.length - 1].y),\n    );\n  }\n\n  /**\n   * 静态方法：从JSON对象创建线段\n   */\n  static fromJson(json: LineSegmentModel): LineSegment {\n    return new LineSegment(\n      Vec2d.From(json.start),\n      Vec2d.From(json.end),\n    );\n  }\n\n  /**\n   * 静态方法：计算两条线段的交点\n   */\n  static intersection(seg1: LineSegmentLike, seg2: LineSegmentLike): Vec2d | null {\n    const line1 = seg1 instanceof LineSegment ? seg1 : LineSegment.fromJson(seg1);\n    const line2 = seg2 instanceof LineSegment ? seg2 : LineSegment.fromJson(seg2);\n    \n    return line1.intersection(line2);\n  }\n\n  /**\n   * 静态方法：判断两条线段是否相交\n   */\n  static intersects(seg1: LineSegmentLike, seg2: LineSegmentLike): boolean {\n    const line1 = seg1 instanceof LineSegment ? seg1 : LineSegment.fromJson(seg1);\n    const line2 = seg2 instanceof LineSegment ? seg2 : LineSegment.fromJson(seg2);\n    \n    return line1.intersects(line2);\n  }\n\n  /**\n   * 静态方法：计算点到线段的距离\n   */\n  static distanceToPoint(segment: LineSegmentLike, point: VecLike): number {\n    const line = segment instanceof LineSegment ? segment : LineSegment.fromJson(segment);\n    return GeometryUtils.pointToLineDistance(point, line.toJson());\n  }\n}\n","/**\n * 2D矩阵变换工具类\n * 提供2D平面图形变换相关的工具函数和类\n */\n\nimport { Vec2d, VecLike } from './Vec2d';\nimport { EASINGS } from './easings';\n\nexport interface Transform2D {\n  translateX: number;\n  translateY: number;\n  scaleX: number;\n  scaleY: number;\n  rotation: number;\n  skewX: number;\n  skewY: number;\n}\n\n/**\n * 2D矩阵类\n * 表示3x3变换矩阵 [a, b, c, d, e, f, g, h, i]\n * 其中 g=h=0, i=1 用于2D变换\n */\nexport class Matrix2D {\n  private matrix: number[];\n\n  constructor(\n    a: number = 1, b: number = 0, c: number = 0,\n    d: number = 0, e: number = 1, f: number = 0,\n    g: number = 0, h: number = 0, i: number = 1,\n  ) {\n    this.matrix = [a, b, c, d, e, f, g, h, i];\n  }\n\n  /**\n   * 获取矩阵元素\n   */\n  getElement(row: number, col: number): number {\n    return this.matrix[row * 3 + col];\n  }\n\n  /**\n   * 设置矩阵元素\n   */\n  setElement(row: number, col: number, value: number): void {\n    this.matrix[row * 3 + col] = value;\n  }\n\n  /**\n   * 获取矩阵数组\n   */\n  toArray(): number[] {\n    return [...this.matrix];\n  }\n\n  /**\n   * 获取CSS transform字符串\n   */\n  toCSSTransform(): string {\n    const [a, b, c, d, e, f] = this.matrix;\n    // CSS matrix(a, b, c, d, tx, ty) 参数顺序：\n    // a: scaleX, b: skewY, c: skewX, d: scaleY, tx: translateX, ty: translateY\n    // 当前矩阵存储: [a, b, c, d, e, f] 对应 [scaleX, skewY, translateX, skewX, scaleY, translateY]\n    // 正确映射: a->a(scaleX), b->b(skewY), c->d(skewX), d->e(scaleY), e->c(tx), f->f(ty)\n    return `matrix(${a}, ${b}, ${d}, ${e}, ${c}, ${f})`;\n  }\n\n  /**\n   * 矩阵乘法\n   */\n  multiply(other: Matrix2D): Matrix2D {\n    const result = new Matrix2D();\n    for (let i = 0; i < 3; i++) {\n      for (let j = 0; j < 3; j++) {\n        let sum = 0;\n        for (let k = 0; k < 3; k++) {\n          sum += this.getElement(i, k) * other.getElement(k, j);\n        }\n        result.setElement(i, j, sum);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * 矩阵求逆\n   */\n  inverse(): Matrix2D {\n    const det = this.determinant();\n    if (Math.abs(det) < 1e-10) {\n      throw new Error('Matrix is not invertible');\n    }\n\n    const [a, b, c, d, e, f, g, h, i] = this.matrix;\n    const invDet = 1 / det;\n\n    return new Matrix2D(\n      (e * i - f * h) * invDet, (c * h - b * i) * invDet, (b * f - c * e) * invDet,\n      (f * g - d * i) * invDet, (a * i - c * g) * invDet, (c * d - a * f) * invDet,\n      (d * h - e * g) * invDet, (b * g - a * h) * invDet, (a * e - b * d) * invDet,\n    );\n  }\n\n  /**\n   * 计算行列式\n   */\n  determinant(): number {\n    const [a, b, c, d, e, f, g, h, i] = this.matrix;\n    return a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g);\n  }\n\n  /**\n   * 克隆矩阵\n   */\n  clone(): Matrix2D {\n    return new Matrix2D(...this.matrix);\n  }\n\n  /**\n   * 判断是否为单位矩阵\n   */\n  isIdentity(): boolean {\n    const identity = [1, 0, 0, 0, 1, 0, 0, 0, 1];\n    return this.matrix.every((val, index) => Math.abs(val - identity[index]) < 1e-10);\n  }\n}\n\n/**\n * 创建单位矩阵\n */\nexport function createIdentityMatrix(): Matrix2D {\n  return new Matrix2D();\n}\n\n/**\n * 创建平移矩阵\n */\nexport function createTranslationMatrix(tx: number, ty: number): Matrix2D {\n  return new Matrix2D(1, 0, tx, 0, 1, ty, 0, 0, 1);\n}\n\n/**\n * 创建缩放矩阵\n */\nexport function createScaleMatrix(sx: number, sy: number = sx): Matrix2D {\n  return new Matrix2D(sx, 0, 0, 0, sy, 0, 0, 0, 1);\n}\n\n/**\n * 创建旋转矩阵\n */\nexport function createRotationMatrix(angle: number): Matrix2D {\n  const cos = Math.cos(angle);\n  const sin = Math.sin(angle);\n  return new Matrix2D(cos, -sin, 0, sin, cos, 0, 0, 0, 1);\n}\n\n/**\n * 创建倾斜矩阵\n */\nexport function createSkewMatrix(skewX: number, skewY: number): Matrix2D {\n  return new Matrix2D(1, Math.tan(skewX), 0, Math.tan(skewY), 1, 0, 0, 0, 1);\n}\n\n/**\n * 应用变换到点.这个看着有错误\n */\nexport function transformPoint(matrix: Matrix2D, point: VecLike): Vec2d {\n  const [a, b, c, d, e, f] = matrix.toArray();\n  return new Vec2d(\n    a * point.x + b * point.y + c,\n    d * point.x + e * point.y + f,\n  );\n}\n\n/**\n * 应用变换到向量\n */\nexport function transformVector(matrix: Matrix2D, vector: VecLike): Vec2d {\n  const [a, b, d, e] = matrix.toArray();\n  return new Vec2d(\n    a * vector.x + b * vector.y,\n    d * vector.x + e * vector.y,\n  );\n}\n\n/**\n * 逆向变换向量\n * 已知变换后的向量和变换矩阵，求原始向量\n * @param matrix 变换矩阵\n * @param transformedVector 变换后的向量\n * @returns 原始向量\n */\nexport function inverseTransformVector(matrix: Matrix2D, transformedVector: VecLike): Vec2d {\n  const [a, b, d, e] = matrix.toArray();\n  \n  // 计算矩阵的行列式\n  const det = a * e - b * d;\n  \n  if (Math.abs(det) < 1e-10) {\n    throw new Error('Matrix is not invertible (determinant is zero)');\n  }\n  \n  // 计算逆矩阵的2x2部分\n  const invDet = 1 / det;\n  const invA = e * invDet;\n  const invB = -b * invDet;\n  const invD = -d * invDet;\n  const invE = a * invDet;\n  \n  // 应用逆变换\n  return new Vec2d(\n    invA * transformedVector.x + invB * transformedVector.y,\n    invD * transformedVector.x + invE * transformedVector.y,\n  );\n}\n\n/**\n * 应用变换到点数组\n */\nexport function transformPoints(matrix: Matrix2D, points: VecLike[]): Vec2d[] {\n  return points.map(point => transformPoint(matrix, point));\n}\n\n/**\n * 组合多个变换矩阵\n */\nexport function composeTransforms(...matrices: Matrix2D[]): Matrix2D {\n  return matrices.reduce((result, matrix) => result.multiply(matrix));\n}\n\n/**\n * 从变换参数创建矩阵\n */\nexport function createTransformMatrix(transform: Transform2D): Matrix2D {\n  const translation = createTranslationMatrix(transform.translateX, transform.translateY);\n  const scale = createScaleMatrix(transform.scaleX, transform.scaleY);\n  const rotation = createRotationMatrix(transform.rotation);\n  const skew = createSkewMatrix(transform.skewX, transform.skewY);\n\n  return composeTransforms(translation, scale, rotation, skew);\n}\n\n/**\n * 分解矩阵为变换参数\n */\nexport function decomposeMatrix(matrix: Matrix2D): Transform2D {\n  const [a, b, c, d, e, f] = matrix.toArray();\n  \n  // 提取平移\n  const translateX = c;\n  const translateY = f;\n\n  // 提取缩放和旋转\n  const det = a * e - b * d;\n  const scaleX = Math.sqrt(a * a + b * b);\n  const scaleY = Math.sqrt(d * d + e * e) * Math.sign(det);\n  \n  // 提取旋转角度\n  const rotation = Math.atan2(b, a);\n\n  // 提取倾斜\n  const skewX = Math.atan2(-b, e);\n  const skewY = Math.atan2(d, a);\n\n  return {\n    translateX,\n    translateY,\n    scaleX,\n    scaleY,\n    rotation,\n    skewX,\n    skewY,\n  };\n}\n\n/**\n * 从矩阵中获取旋转角度\n * @param matrix 矩阵\n * @returns 旋转角度(逆时针为正，顺时针为360-角度)\n */\nexport function getAngleByMatrix(matrix: Matrix2D): number {\n  const transform = decomposeMatrix(matrix);\n  const rotation = transform.rotation;\n  // 将弧度转换为角度\n  let angle = rotation * (180 / Math.PI);\n  \n  // 将角度转换为与 getAngleByPoints 一致的方向\n  angle = -angle;\n  \n  // 确保角度为正数：逆时针为正，顺时针为360-角度\n  if (angle < 0) {\n    angle = 360 + angle;\n  }\n  \n  return angle;\n}\n\n/**\n * 插值两个矩阵\n */\nexport function interpolateMatrix(matrix1: Matrix2D, matrix2: Matrix2D, t: number): Matrix2D {\n  const transform1 = decomposeMatrix(matrix1);\n  const transform2 = decomposeMatrix(matrix2);\n\n  const interpolated: Transform2D = {\n    translateX: transform1.translateX + (transform2.translateX - transform1.translateX) * t,\n    translateY: transform1.translateY + (transform2.translateY - transform1.translateY) * t,\n    scaleX: transform1.scaleX + (transform2.scaleX - transform1.scaleX) * t,\n    scaleY: transform1.scaleY + (transform2.scaleY - transform1.scaleY) * t,\n    rotation: transform1.rotation + (transform2.rotation - transform1.rotation) * t,\n    skewX: transform1.skewX + (transform2.skewX - transform1.skewX) * t,\n    skewY: transform1.skewY + (transform2.skewY - transform1.skewY) * t,\n  };\n\n  return createTransformMatrix(interpolated);\n}\n\n/**\n * 矩阵变换工具类\n */\nexport class MatrixTransformUtils {\n  /**\n   * 围绕指定点旋转\n   */\n  static rotateAroundPoint(angle: number, centerX: number, centerY: number): Matrix2D {\n    const translateToOrigin = createTranslationMatrix(-centerX, -centerY);\n    const rotate = createRotationMatrix(angle);\n    const translateBack = createTranslationMatrix(centerX, centerY);\n    \n    return composeTransforms(translateBack, rotate, translateToOrigin);\n  }\n\n  /**\n   * 围绕指定点缩放\n   */\n  static scaleAroundPoint(sx: number, sy: number, centerX: number, centerY: number): Matrix2D {\n    const translateToOrigin = createTranslationMatrix(-centerX, -centerY);\n    const scale = createScaleMatrix(sx, sy);\n    const translateBack = createTranslationMatrix(centerX, centerY);\n    \n    return composeTransforms(translateBack, scale, translateToOrigin);\n  }\n\n  /**\n   * 计算多边形的质心\n   */\n  static polygonCentroid(points: VecLike[]): Vec2d {\n    if (points.length === 0) return new Vec2d(0, 0);\n    if (points.length === 1) return new Vec2d(points[0].x, points[0].y);\n\n    let area = 0;\n    let cx = 0;\n    let cy = 0;\n\n    for (let i = 0; i < points.length; i++) {\n      const j = (i + 1) % points.length;\n      const cross = points[i].x * points[j].y - points[j].x * points[i].y;\n      area += cross;\n      cx += (points[i].x + points[j].x) * cross;\n      cy += (points[i].y + points[j].y) * cross;\n    }\n\n    area /= 2;\n    const factor = 1 / (6 * area);\n\n    return new Vec2d(cx * factor, cy * factor);\n  }\n\n  /**\n   * 计算包围盒\n   */\n  static boundingBox(points: VecLike[]): { min: Vec2d; max: Vec2d } {\n    if (points.length === 0) {\n      return { min: new Vec2d(0, 0), max: new Vec2d(0, 0) };\n    }\n\n    let minX = points[0].x;\n    let minY = points[0].y;\n    let maxX = points[0].x;\n    let maxY = points[0].y;\n\n    for (const point of points) {\n      minX = Math.min(minX, point.x);\n      minY = Math.min(minY, point.y);\n      maxX = Math.max(maxX, point.x);\n      maxY = Math.max(maxY, point.y);\n    }\n\n    return {\n      min: new Vec2d(minX, minY),\n      max: new Vec2d(maxX, maxY),\n    };\n  }\n\n  /**\n   * 判断点是否在多边形内\n   */\n  static pointInPolygon(point: VecLike, polygon: VecLike[]): boolean {\n    let inside = false;\n    for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {\n      if (((polygon[i].y > point.y) !== (polygon[j].y > point.y)) &&\n          (point.x < (polygon[j].x - polygon[i].x) * (point.y - polygon[i].y) / (polygon[j].y - polygon[i].y) + polygon[i].x)) {\n        inside = !inside;\n      }\n    }\n    return inside;\n  }\n\n  /**\n   * 计算两条线段的交点\n   */\n  static lineIntersection(\n    line1Start: VecLike, line1End: VecLike,\n    line2Start: VecLike, line2End: VecLike,\n  ): Vec2d | null {\n    const x1 = line1Start.x, y1 = line1Start.y;\n    const x2 = line1End.x, y2 = line1End.y;\n    const x3 = line2Start.x, y3 = line2Start.y;\n    const x4 = line2End.x, y4 = line2End.y;\n\n    const denom = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);\n    if (Math.abs(denom) < 1e-10) return null; // 平行线\n\n    const t = ((x1 - x3) * (y3 - y4) - (y1 - y3) * (x3 - x4)) / denom;\n    const u = -((x1 - x2) * (y1 - y3) - (y1 - y2) * (x1 - x3)) / denom;\n\n    if (t >= 0 && t <= 1 && u >= 0 && u <= 1) {\n      return new Vec2d(\n        x1 + t * (x2 - x1),\n        y1 + t * (y2 - y1),\n      );\n    }\n\n    return null;\n  }\n}\n\n/**\n * 矩阵动画工具类\n */\nexport class MatrixAnimationUtils {\n  /**\n   * 创建动画帧\n   */\n  static createAnimationFrames(\n    startMatrix: Matrix2D,\n    endMatrix: Matrix2D,\n    duration: number,\n    easingFn: (t: number) => number = EASINGS.linear,\n  ): Matrix2D[] {\n    const frames: Matrix2D[] = [];\n    const frameCount = Math.ceil(duration * 60); // 60fps\n\n    for (let i = 0; i <= frameCount; i++) {\n      const t = i / frameCount;\n      const easedT = easingFn(t);\n      frames.push(interpolateMatrix(startMatrix, endMatrix, easedT));\n    }\n\n    return frames;\n  }\n\n  /**\n   * 使用缓动函数插值矩阵\n   */\n  static interpolateWithEasing(\n    matrix1: Matrix2D,\n    matrix2: Matrix2D,\n    t: number,\n    easingType: keyof typeof EASINGS = 'linear',\n  ): Matrix2D {\n    const easedT = EASINGS[easingType](t);\n    return interpolateMatrix(matrix1, matrix2, easedT);\n  }\n}\n\n// 导出默认的矩阵类\nexport default Matrix2D;\n","import { MathsKitTool } from '../types';\nimport Matrix2D, { getAngleByMatrix, decomposeMatrix, createTranslationMatrix, composeTransforms, createRotationMatrix } from './matrix';\nimport { Point2d } from './Point2d';\n\nexport type operationType = 'Drag' | 'Rotate' | 'Stretch';\n\nexport interface BindOperationEventOptions {\n  bindEvents: operationType[];\n  getGlobalScale:()=>number;\n  getInstance:(id:string)=>MathsKitTool | null;\n  activeOperation:(bol:boolean)=>void;\n  getContainerRect:()=>DOMRect;\n}\n\nexport class OperationManager {\n  private element: HTMLDivElement;\n  private options: BindOperationEventOptions;\n  private originalMatrix: Matrix2D | null = null;\n  private originalClient: [number, number] = [0, 0];\n  private newMatrix: Matrix2D | null = null;\n  private originalWidth: number = 0;\n  private newWidth: number = 0;\n  private isTouchDevice: boolean = false;\n  private activeInstance: MathsKitTool | null = null;\n  private activeOperationType: operationType | null = null;\n  private originalCursor: string | null = null;\n  constructor(element:HTMLDivElement, options:BindOperationEventOptions) {\n    this.element = element;\n    this.options = options;\n    this.element.addEventListener('pointerdown', this.onPointerdown, true);\n  }\n\n  private onPointerdown = (e:PointerEvent) => {\n    const currentTarget = e.target as HTMLElement;\n    if (!currentTarget) {\n      return;\n    }\n    const currentTargetType = currentTarget?.getAttribute('data-type') || null;\n    if (!currentTargetType) {\n      return;\n    }    \n    for(const item of this.options.bindEvents){\n      if(item === currentTargetType){\n        let id: string | null = null;\n        if (item === 'Drag') {\n          id = currentTarget.getAttribute('data-id') || null;\n        } else {\n          id = currentTarget.parentElement?.getAttribute('data-id') || null;\n        }\n        if (id) {\n          this.activeInstance = this.options.getInstance(id);\n          this.activeOperationType = item;\n          this.options.activeOperation(true);\n        }\n        break;\n      }\n    }\n    // 检测是否为触摸设备\n    this.isTouchDevice = e.pointerType === 'touch';\n    if (this.activeInstance) {\n      e.stopPropagation();\n      this.originalMatrix = this.activeInstance.getDomMatrix();\n      this.originalClient = [e.clientX, e.clientY];\n      document.body.addEventListener('pointermove', this.onPointermove);\n      document.body.addEventListener('pointerup', this.onPointerup);\n      document.body.addEventListener('pointercancel', this.onPointerup);\n      \n      // 尝试捕获指针，如果失败则记录错误但不中断操作\n      // 对于触摸设备，setPointerCapture 可能会导致意外的 pointercancel 事件\n      try {\n        // 只在非触摸设备上使用 setPointerCapture，或者根据具体需求决定\n        if (!this.isTouchDevice) {\n          this.element.setPointerCapture(e.pointerId);\n          console.log('Pointer capture set for non-touch device');\n        } else {\n          console.log('Skipping pointer capture for touch device');\n        }\n      } catch (error) {\n        console.warn('Failed to set pointer capture:', error);\n      }\n      this.originalCursor = this.element.style.cursor;\n      switch (this.activeOperationType) {\n        case 'Drag':\n          this.activeInstance.onDragStart();\n          this.element.style.cursor = 'move';\n          break;\n        case 'Rotate': {\n          const originAngle = getAngleByMatrix(this.originalMatrix);\n          this.activeInstance.onRotateStart(originAngle);\n          this.element.style.cursor = 'none';\n          break;\n        }\n        case 'Stretch': {\n          this.originalWidth = this.activeInstance.element.offsetWidth; // 初始化原始宽度\n          this.newWidth = this.originalWidth;\n          this.activeInstance.onStretchStart();\n          this.element.style.cursor = 'ew-resize';\n          break;\n        }\n        default:\n          break;\n      }\n      this.activeInstance.element.style.pointerEvents = 'none';\n    }\n  };\n\n  private onPointermove = (e:PointerEvent) => {\n    e.stopPropagation();\n    if (!this.activeOperationType || !this.activeInstance || !this.originalMatrix) return;\n    switch (this.activeOperationType) {\n      case 'Drag': {\n        const containerRect = this.options.getContainerRect();\n        const isOutSideX = e.clientX <= containerRect.left || e.clientX >= containerRect.right;\n        const isOutSideY = e.clientY <= containerRect.top || e.clientY >= containerRect.bottom;\n        if (isOutSideX || isOutSideY) {\n          return;\n        }\n        const globalScale = this.options.getGlobalScale();\n        // 计算鼠标移动的原始向量\n        const rawDragX = Math.round((e.clientX - this.originalClient[0]) / globalScale);\n        const rawDragY = Math.round((e.clientY - this.originalClient[1]) / globalScale);\n        // 从原始矩阵中提取旋转角度\n        const transform = decomposeMatrix(this.originalMatrix);\n        const rotation = transform.rotation;\n        \n        // 根据旋转角度变换拖拽向量\n        const cos = Math.cos(rotation); // 使用逆时针向旋转\n        const sin = Math.sin(rotation);\n        const transformedDragX = rawDragX * cos - rawDragY * sin;\n        const transformedDragY = rawDragX * sin + rawDragY * cos;\n        const translateMatrix = createTranslationMatrix(transformedDragX, transformedDragY);\n        this.newMatrix = composeTransforms(this.originalMatrix, translateMatrix);\n        this.activeInstance.element.style.transform = this.newMatrix.toCSSTransform();\n        this.activeInstance.onDragDoing();\n        break;\n      }\n      case 'Rotate': {\n        const currentPoint = new Point2d(e.clientX, e.clientY);\n        const originPoint = new Point2d(...this.originalClient);\n        const containerRect = this.element.getBoundingClientRect();\n        const centerPoint = this.activeInstance.getRotateCenterPoint().add(new Point2d(containerRect.left, containerRect.top));\n        let angleInDegrees = centerPoint.getAngleByPoints(currentPoint, originPoint);\n        angleInDegrees = Math.round(angleInDegrees * 100) / 100;\n        const angleInRadians = (angleInDegrees * Math.PI) / 180; // 将角度转换为弧度\n        // 基于原始矩阵创建新的旋转矩阵，而不是累积旋转\n        const rotationMatrix = createRotationMatrix(angleInRadians);\n        // 计算target元素的旋转中心点和元素中心的偏移\n        this.newMatrix = composeTransforms(this.originalMatrix, rotationMatrix);\n    \n        this.activeInstance.element.style.transform = this.newMatrix.toCSSTransform();\n    \n        angleInDegrees = angleInDegrees + getAngleByMatrix(this.originalMatrix);\n        // 确保角度为正数：逆时针为正，顺时针为360-角度\n        if (angleInDegrees < 0) {\n          angleInDegrees = 360 + angleInDegrees;\n        } else if (angleInDegrees > 360) {\n          angleInDegrees = angleInDegrees - 360;\n        }\n        this.activeInstance.onRotateDoing(angleInDegrees);\n        break;\n      }\n      case 'Stretch': {\n        const globalScale = this.options.getGlobalScale();\n        // 获取当前旋转角度\n        const transform = decomposeMatrix(this.originalMatrix);\n        const rotation = transform.rotation;\n        \n        // 将鼠标移动向量按照旋转角度进行变换\n        const cos = Math.cos(rotation);\n        const sin = Math.sin(rotation);\n        const currentPoint = new Point2d(e.clientX, e.clientY);\n        const stretchDirection = this.activeInstance.getStretchDirection();\n        let rawDragX = 0;\n        let rawDragY = 0;\n        let transformedDragX = 0;\n        if (stretchDirection === 'x') {\n          rawDragX = Math.round((currentPoint.x - this.originalClient[0]) / globalScale);\n          rawDragY = Math.round((currentPoint.y - this.originalClient[1]) / globalScale);\n          transformedDragX = rawDragX * cos + rawDragY * sin;\n        } else {\n          rawDragX = Math.round((currentPoint.x - this.originalClient[0]) / globalScale);\n          rawDragY = Math.round((currentPoint.y - this.originalClient[1]) / globalScale);\n          transformedDragX = -rawDragY * cos + rawDragX * sin;\n        }\n        \n        // 计算新的宽度（只考虑 X 轴方向的拉伸）\n        this.newWidth = Math.max(200, this.originalWidth + transformedDragX);\n        \n        // 更新元素的宽度\n        this.activeInstance.element.style.width = `${this.newWidth}px`;\n        \n        // 触发变化回调\n        this.activeInstance.onStretchDoing(this.newWidth);\n        break;\n      }\n      default:\n        break;\n    }\n  };\n\n  private onPointerup = (e:PointerEvent) => {\n    if(this.activeInstance && this.activeOperationType){\n      e.stopPropagation();\n      this.onPointermove(e);\n      this.element.releasePointerCapture(e.pointerId);\n      switch (this.activeOperationType) {\n        case 'Drag':\n          if (this.newMatrix) {\n            this.activeInstance.onDragEnd(this.newMatrix);\n          }\n          break;\n        case 'Rotate': {\n          if (this.newMatrix) {\n            this.activeInstance.onDragEnd(this.newMatrix);\n          }\n          break;\n        }\n        case 'Stretch':\n          this.activeInstance.onStretchEnd(this.newWidth);\n          break;\n        default:\n          break;\n      }\n      this.element.style.cursor = this.originalCursor || 'default';\n      this.activeInstance.element.style.pointerEvents = 'auto';\n      this.removeEventListener();\n      this.options.activeOperation(false);\n    }\n  };\n\n  private removeEventListener() {\n    this.activeInstance = null;\n    this.activeOperationType = null;\n    this.originalMatrix = null;\n    this.newMatrix = null;\n    this.originalClient = [0, 0];\n    this.originalWidth = 0;\n    this.newWidth = 0;\n    document.body.removeEventListener('pointermove', this.onPointermove);\n    document.body.removeEventListener('pointerup', this.onPointerup);\n  }\n\n  private stop(){\n    this.removeEventListener();\n  }\n\n  destroy(){\n    this.stop();\n    this.element.removeEventListener('pointerdown', this.onPointerdown, true);\n  }\n\n}","import { MathsKitElement, MathsKitState, MathsKitType } from './types';\nimport { composeTransforms, createScaleMatrix, createTranslationMatrix, decomposeMatrix, Matrix2D, Point2d } from './utils';\nimport { MathsKitManager } from './manager';\nimport { LineSegmentLike } from './utils/LineSegment';\nimport { CircleSegmentLike } from './utils/CircleSegment';\n\nexport interface MathsKitOptions {\n    id: string;\n    type: MathsKitType;\n    state: MathsKitState;\n}\n\nexport type MarkLineType = 'x' | 'y' | 'circle';\nexport type MarkDirection = 'left' | 'right' | 'top' | 'bottom' | 'topLeftToBottomRight' | 'topRightToBottomLeft';\n\nexport type MarkLine = {\n  axis: MarkLineType;\n  direction: MarkDirection;\n  line: LineSegmentLike;\n}\n\nexport type MarkCircle = {\n  axis: MarkLineType;\n  circle: CircleSegmentLike;\n}\n\nexport type MarkLineLike = MarkLine | MarkCircle;\n\nexport abstract class MathsKit {\n  readonly id: string;\n  private _state: MathsKitState;\n  readonly element!: MathsKitElement;\n  readonly manager: MathsKitManager;\n  protected _isActive: boolean = true;\n  constructor(options: MathsKitOptions, manager: MathsKitManager) {\n    this.id = options.id;\n    this._state = options.state;\n    this.manager = manager;\n    this.element = this.createElement() as MathsKitElement;\n    this.bindElement(this.element, options.type);\n    // 初始化主题变量\n    this.setThemeVariables(this.manager.theme);\n  }\n\n  init(){\n    this.render();\n  }\n\n  bindElement(element: MathsKitElement, type: MathsKitType) {\n    element.classList.add('maths-kit', `maths-kit-${type}`, `maths-kit-${this.manager.theme}`);\n    element.setAttribute('data-type', 'Drag');\n    element.setAttribute('data-id', this.id);\n    this.manager.container.appendChild(element);\n  }\n\n  getStretchDirection(): 'x' | 'y' {\n    return 'x';\n  }\n\n  setActive(isActive: boolean) {\n    this._isActive = isActive;\n    if (isActive) {\n      this.element.style.pointerEvents = 'auto';\n    } else {\n      this.element.style.pointerEvents = 'none';\n    }\n  }\n\n  setTheme(theme: 'light' | 'dark') {\n    const currentTheme = this.element.classList.contains('maths-kit-light') ? 'light' :  this.element.classList.contains('maths-kit-dark') ? 'dark' : null;\n    if (currentTheme !== theme) {\n      if (currentTheme) {\n        this.element.classList.remove(`maths-kit-${currentTheme}`);\n      }\n      this.element.classList.add(`maths-kit-${theme}`);\n      \n      // 设置主题相关的CSS变量\n      this.setThemeVariables(theme);\n    }\n  }\n\n  private setThemeVariables(theme: 'light' | 'dark') {\n    const variables = theme === 'light' ? this.getLightThemeVariables() : this.getDarkThemeVariables();\n    \n    Object.entries(variables).forEach(([key, value]) => {\n      this.element.style.setProperty(key, value);\n    });\n  }\n\n  private getLightThemeVariables() {\n    return {\n      '--maths-kit-ruler-bg': 'rgba(255, 255, 255, 0.8)',\n      '--maths-kit-ruler-border': 'rgba(233, 233, 233, 0.8)',\n      '--maths-kit-ruler-mark-bg': 'rgba(233, 233, 233, 0.8)',\n      '--maths-kit-ruler-major-mark': '#000',\n      '--maths-kit-ruler-medium-mark': '#666',\n      '--maths-kit-ruler-minor-mark': '#999',\n      '--maths-kit-ruler-text': '#000',\n      '--maths-kit-ruler-unit-text': '#666',\n      '--maths-kit-math-kit-btn-bg': '#fff',\n      '--maths-kit-math-kit-btn-hover-bg': '#f0f4ff',\n      '--maths-kit-math-kit-angle-btn-bg': '#00A870',\n      '--maths-kit-math-kit-btn-border': '#eee',\n      '--maths-kit-math-kit-btn-text': '#000',\n      '--maths-kit-math-kit-btn-shadow': 'rgba(0, 0, 0, 0.2)',\n    };\n  }\n\n  private getDarkThemeVariables() {\n    return {\n      '--maths-kit-ruler-bg': 'rgba(40, 40, 40, 0.9)',\n      '--maths-kit-ruler-border': 'rgba(80, 80, 80, 0.8)',\n      '--maths-kit-ruler-mark-bg': 'rgba(60, 60, 60, 0.8)',\n      '--maths-kit-ruler-major-mark': '#fff',\n      '--maths-kit-ruler-medium-mark': '#ccc',\n      '--maths-kit-ruler-minor-mark': '#999',\n      '--maths-kit-ruler-text': '#fff',\n      '--maths-kit-ruler-unit-text': '#ccc',\n      '--maths-kit-math-kit-btn-bg': '#fff',\n      '--maths-kit-math-kit-btn-hover-bg': 'rgba(35, 108, 250, 0.08)',\n      '--maths-kit-math-kit-angle-btn-bg': '#00A870',\n      '--maths-kit-math-kit-btn-border': '#eee',\n      '--maths-kit-math-kit-btn-text': '#000',\n      '--maths-kit-math-kit-btn-shadow': 'rgba(0, 0, 0, 0.8)',\n    };\n  }\n\n  get state(): MathsKitState {\n    return this._state;\n  }\n\n  getDomMatrix = (): Matrix2D => {\n    const originMatrix = new Matrix2D(...this.state.matrix);\n    const transform = decomposeMatrix(originMatrix);\n    const scaleMatrix = createScaleMatrix(this.manager.globalScale, this.manager.globalScale);\n    const scaleTranslateMatrix = createTranslationMatrix(transform.translateX * this.manager.globalScale, transform.translateY * this.manager.globalScale);\n    const matirx = composeTransforms(originMatrix, scaleMatrix, scaleTranslateMatrix);\n    return matirx;\n  };\n\n  update(state: MathsKitState) {\n    this._state = state;\n    this.render();\n  }\n\n  destroy() {\n    if (this.element) {\n      this.element.remove();\n    }\n  }\n\n  toTop(){\n    if (this.manager.isTopMathsKit(this.id)) {\n      return;\n    }\n    this.manager.update(this.id, { zIndex: this.manager.topZIndex + 1 });\n  }\n\n  updateStateMatrix(currentMatrix: Matrix2D) {\n    const { translateX, translateY, scaleX, scaleY, rotation } = decomposeMatrix(currentMatrix);\n    const { x,y } = this.state;\n    const container = this.manager.container;\n    const containerWidth = container.clientWidth;\n    const containerHeight = container.clientHeight;\n    const newX = translateX / containerWidth + x;\n    const newY = translateY / containerHeight + y;\n    const scaleMatrix = createScaleMatrix(scaleX, scaleY);\n    const cos = Math.cos(rotation); // 使用逆时针向旋转\n    const sin = Math.sin(rotation);\n    const transformedDragX = translateX * cos - translateY * sin;\n    const transformedDragY = translateX * sin + translateY * cos;\n    const translateMatrix = createTranslationMatrix(transformedDragX, transformedDragY);\n    const matirx = composeTransforms(currentMatrix, scaleMatrix.inverse(), translateMatrix.inverse());\n    this.manager.update(this.id, { x: newX, y: newY, matrix: matirx.toArray() });\n  }\n  abstract getMarkLines(): MarkLineLike[];\n  abstract createElement(): MathsKitElement;\n  abstract render(): void;\n  abstract showLineLength(number: number): void;\n  abstract hideLineLength(): void;\n\n  abstract onDragStart(): void;\n  abstract onDragDoing(): void;\n  abstract onDragEnd(matrix: Matrix2D): void;\n  abstract onRotateStart(originAngle: number): void;\n  abstract onRotateDoing(angle: number): void;\n  abstract onRotateEnd(matrix: Matrix2D): void;\n  abstract onStretchStart(): void;\n  abstract onStretchDoing(width: number): void;\n  abstract onStretchEnd(width: number): void;\n  abstract getRotateCenterPoint(): Point2d;\n}\n","export const MM_PER_PIXELS = 25.4 / 96;\nexport const PIXELS_PER_MM = 96 / 25.4;","import { MarkLine, MathsKit, MathsKitOptions } from '../mathsKit';\nimport { MathsKitManager } from '../manager';\nimport { Point2d } from '../utils/Point2d';\nimport Matrix2D, { createRotationMatrix, composeTransforms, decomposeMatrix } from '../utils/matrix';\nimport { LineSegment, Vec2d } from '../utils';\nimport { MM_PER_PIXELS, PIXELS_PER_MM } from '../utils/const';\nimport { throttle } from 'lodash';\n\n\nexport type RulerElement = HTMLDivElement;\n\nexport class RulerTool extends MathsKit {\n  protected markLines: MarkLine[] = [];\n  private deleteBtn: HTMLDivElement = document.createElement('div');\n  private rotateBtn: HTMLDivElement = document.createElement('div');\n  private angleInput: HTMLInputElement = document.createElement('input');\n  private lineLength: HTMLDivElement = document.createElement('div');\n  private stretchBtn!: HTMLDivElement;\n  constructor(options: MathsKitOptions, manager: MathsKitManager) {\n    super(options, manager);\n  }\n\n  init(): void {\n    this.createDeleteBtn();\n    this.createRotateBtn();\n    this.createStretchBtn();\n    this.createAngleInput();\n    this.createLineLength();\n    this.bindEvent();\n    this.render();\n  }\n\n  onDragStart(): void {\n    this.toTop();\n  }\n\n  onDragDoing(): void {}\n\n  onDragEnd(matrix: Matrix2D): void {\n    this.updateStateMatrix(matrix);\n  }\n\n  onRotateStart(originAngle: number): void {\n    this.toTop();\n    this.updateAngleDisplay(originAngle);\n  }\n\n  onRotateDoing(angle: number): void {\n    this.updateAngleDisplay(angle);\n  }\n\n  onRotateEnd(matrix: Matrix2D): void {\n    this.updateStateMatrix(matrix);\n  }\n\n  onStretchStart(): void {\n    this.toTop();\n    this.thottled.cancel();\n  }\n\n  private thottled = throttle((): void => {\n    this.renderMark(this.element);\n  },100);\n\n  onStretchDoing(): void {\n    this.thottled();\n  }\n\n  onStretchEnd(width: number): void {\n    this.thottled.cancel();\n    // 更新尺子的宽度\n    this.manager.update(this.id, { width: width });\n  }\n\n  /**\n   * 获取旋转中心点, 坐标必须相对于容器左上角, 旋转中心点是左上角\n   * @returns \n   */\n  getRotateCenterPoint = () => {\n    const { x,y } = this.state;\n    const container = this.manager.container;\n    const containerWidth = container.clientWidth;\n    const containerHeight = container.clientHeight;\n    const pxX = x * containerWidth;\n    const pxY = y * containerHeight;\n    const domMatrix = this.getDomMatrix();\n    const { translateX, translateY } = decomposeMatrix(domMatrix);\n    const leftTopPoint = new Vec2d(pxX + translateX, pxY + translateY);\n    // 返回 Point2d 对象\n    return new Point2d(leftTopPoint.x, leftTopPoint.y);\n  };\n\n  getMarkLines(): MarkLine[] {\n    const { x, y, width, height } = this.state;\n    const container = this.manager.container;\n    const containerWidth = container.clientWidth;\n    const containerHeight = container.clientHeight;\n    const pxX = x * containerWidth;\n    const pxY = y * containerHeight;\n    const { translateX, translateY, scaleX, scaleY } = decomposeMatrix(this.getDomMatrix());\n    let topLeftPoint = new Vec2d(pxX, pxY);\n    let topRightPoint = new Vec2d(pxX + width * scaleY, pxY);\n    let bottomLeftPoint = new Vec2d(pxX, pxY + height * scaleY);\n    let bottomRightPoint = new Vec2d(pxX + width * scaleX, pxY + height * scaleY);\n    topLeftPoint = Point2d.Add(topLeftPoint, new Vec2d(translateX, translateY));\n    topRightPoint = Point2d.Add(topRightPoint, new Vec2d(translateX, translateY));\n    bottomLeftPoint = Point2d.Add(bottomLeftPoint, new Vec2d(translateX, translateY));\n    bottomRightPoint = Point2d.Add(bottomRightPoint, new Vec2d(translateX, translateY));\n    const currentAngle = this.getCurrentAngle();\n    const angleInRadians = (currentAngle * Math.PI) / 180;\n    const rotateCenterPoint = this.getRotateCenterPoint();\n    topLeftPoint = Point2d.RotWith(topLeftPoint, rotateCenterPoint, -angleInRadians);\n    topRightPoint = Point2d.RotWith(topRightPoint, rotateCenterPoint, -angleInRadians);\n    bottomLeftPoint = Point2d.RotWith(bottomLeftPoint, rotateCenterPoint, -angleInRadians);\n    bottomRightPoint = Point2d.RotWith(bottomRightPoint, rotateCenterPoint, -angleInRadians);\n\n    const topLine = new LineSegment(topLeftPoint, topRightPoint);\n    const bottomLine = new LineSegment(bottomLeftPoint, bottomRightPoint);\n\n    // 获取\"上\"、\"下\"两条条线\n    const markLines: MarkLine[] = [\n      {\n        axis: 'x',\n        direction: 'top',\n        line: topLine,\n      },    \n      {\n        axis: 'x',\n        direction: 'bottom',\n        line: bottomLine,\n      },\n    ];\n    return markLines;\n  }\n\n  private bindEvent() {\n    this.deleteBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.deleteBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    this.deleteBtn.addEventListener('click', this.onDeleteBtnClickHandler);\n\n    this.stretchBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.stretchBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    \n    this.rotateBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.rotateBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    \n    this.angleInput.addEventListener('focus', this.onAngleInputFocusHandler);\n    this.angleInput.addEventListener('blur', this.onAngleInputBlurHandler);\n    this.angleInput.addEventListener('keydown', this.onAngleInputKeyDownHandler);\n    // this.angleInput.addEventListener('pointerdown', this.showAngleInput);\n    \n    // 添加鼠标悬停显示角度输入框\n    this.rotateBtn.addEventListener('mouseenter', this.showAngleInput);\n    this.angleInput.addEventListener('mouseenter', this.showAngleInput);\n    // this.angleInput.addEventListener('touchStart', this.showAngleInput);\n    \n  }\n\n  private unbindEvent() {\n    if (this.deleteBtn) {\n      this.deleteBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.deleteBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n      this.deleteBtn.removeEventListener('click', this.onDeleteBtnClickHandler);\n    }\n\n    if (this.stretchBtn) {\n      this.stretchBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.stretchBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n    }\n    \n    if (this.rotateBtn) {\n      this.rotateBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.rotateBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n    }\n    \n    if (this.angleInput) {\n      this.angleInput.removeEventListener('focus', this.onAngleInputFocusHandler);\n      this.angleInput.removeEventListener('blur', this.onAngleInputBlurHandler);\n      this.angleInput.removeEventListener('keydown', this.onAngleInputKeyDownHandler);\n      // 移除鼠标悬停事件\n      this.rotateBtn.removeEventListener('pointerenter', this.showAngleInput);\n      this.angleInput.removeEventListener('pointerenter', this.showAngleInput);\n      // this.element.removeEventListener('mouseleave', this.hideAngleInput);\n    }\n\n    this.thottled.cancel();\n  }\n\n  destroy(): void {\n    super.destroy();\n    this.unbindEvent();\n  }\n\n  private onDeleteBtnClickHandler = (e: MouseEvent) => {\n    e.stopPropagation();\n    this.manager.remove(this.id);\n  };\n\n  private onBtnMouseEnterHandler = (e: MouseEvent) => {\n    const target = e.currentTarget as HTMLElement;\n    target.style.background = 'var(--maths-kit-math-kit-btn-hover-bg, #f0f4ff)';\n    target.style.transform = 'translateY(-50%) scale(1.1)';\n  };\n\n  private onBtnMouseLeaveHandler = (e: MouseEvent) => {\n    const target = e.currentTarget as HTMLElement;\n    target.style.background = 'var(--maths-kit-math-kit-btn-bg, #fff)';\n    target.style.transform = 'translateY(-50%) scale(1)';\n  };\n\n  createElement() {\n    const element = document.createElement('div');\n    \n    // 确保容器有正确的定位上下文\n    element.style.position = 'relative';\n    element.style.transformOrigin = 'left top';\n    element.style.pointerEvents = this._isActive ? 'auto' : 'none';\n    element.style.touchAction = 'none';\n    \n    this.createMark(element, 'top');\n    this.createMark(element, 'bottom');\n    return element;\n  }\n\n  createMark(element: RulerElement, position: 'top' | 'bottom' ) {\n    const mark = document.createElement('div');\n    mark.classList.add('maths-kit-ruler-mark', position);\n    \n    // 应用内联样式\n    Object.assign(mark.style, {\n      position: 'absolute',\n      left: '0',\n      right: '0',\n      background: 'transparent',\n      ...(position === 'top' ? { \n        top: '0',\n        borderBottom: 'none',\n      } : { \n        bottom: '0',\n        borderTop: 'none',\n      }),\n      pointerEvents: 'none',\n    });\n    \n    element.appendChild(mark);\n  }\n\n  setActive(isActive: boolean) {\n    super.setActive(isActive);\n    this._isActive = isActive;\n    if (this.angleInput) {\n      if (isActive) {\n        this.angleInput.style.pointerEvents = 'auto';\n      } else {\n        this.angleInput.style.pointerEvents = 'none';\n      }\n    }\n  }\n  \n  render(): void {\n    const state = this.state;\n    const domMatrix = this.getDomMatrix();\n    const style = {\n      position: 'absolute',\n      left: `${state.x * 100}%`,\n      top: `${state.y * 100}%`,\n      width: `${state.width}px`,\n      height: `${state.height}px`,\n      minHeight: '50px',\n      minWidth: '200px',\n      maxHeight: '80px',\n      transform: domMatrix.toCSSTransform(),\n      zIndex: state.zIndex,\n      backgroundColor: 'var(--maths-kit-ruler-bg, rgba(255, 255, 255, 0.8))',\n      border: '1px solid var(--maths-kit-ruler-border, rgba(225, 225, 225, 0.8))',\n      boxSizing: 'border-box',\n    };\n    Object.assign(this.element.style, style);\n    \n    // 使用setTimeout确保DOM完全渲染后再获取尺寸和重新绑定事件\n    setTimeout(() => {\n      this.renderMark(this.element);\n    }, 0);\n  }\n\n  private renderMark(element: RulerElement) {\n    const marks = element.querySelectorAll('.maths-kit-ruler-mark') as NodeListOf<HTMLDivElement>;\n    marks.forEach((mark) => {\n      this.renderMarkAtPosition(mark);\n    });\n  }\n\n  private renderMarkAtPosition(mark: HTMLDivElement) {\n    const position = mark.classList.contains('top') ? 'top' : 'bottom';\n    // 清空现有内容\n    mark.innerHTML = '';\n    \n    const width = mark.offsetWidth;\n    if (width <= 0) return;\n\n    // SVG内部padding\n    const SVG_PADDING = 10;\n    const svgWidth = width;\n\n    // 保持原有的绝对定位，只更新必要的样式\n    mark.style.height = '28px'; // 减少高度，因为刻度线变短了\n    mark.style.overflow = 'hidden';\n    mark.style.zIndex = '1';\n\n    // 获取设备像素比，用于更精确的物理尺寸计算\n    // const devicePixelRatio = window.devicePixelRatio || 1;\n    const MM_PER_CM = 10;\n    \n    // 刻度间距：1mm\n    const MARK_SPACING_MM = 1;\n    const MARK_SPACING_PX = MARK_SPACING_MM * PIXELS_PER_MM;\n    \n    // 刻度线宽度：1px\n    const MARK_WIDTH_PX = 1;\n    \n    // 计算可以容纳的刻度数量（考虑SVG内部padding）\n    const availableWidth = svgWidth - (SVG_PADDING * 2);\n    const totalMarks = Math.floor(availableWidth / MARK_SPACING_PX);\n    \n    // 创建SVG容器\n    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    svg.setAttribute('width', `${svgWidth}`);\n    svg.setAttribute('height', '28'); // 减少SVG高度\n    svg.style.position = 'absolute';\n    svg.style.top = '0';\n    svg.style.left = '0';\n    \n    // 添加半透明背景矩形\n    const backgroundRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n    backgroundRect.setAttribute('width', `${svgWidth}`);\n    backgroundRect.setAttribute('height', '10'); // 中等刻度线高度8px + 2px = 10px\n    backgroundRect.setAttribute('fill', 'var(--maths-kit-ruler-mark-bg, rgba(240, 240, 240, 0.8))');\n    backgroundRect.setAttribute('rx', '2');\n    backgroundRect.setAttribute('ry', '2');\n    \n    // 根据位置调整背景矩形的位置\n    if (position === 'top') {\n      backgroundRect.setAttribute('y', '0');\n    } else {\n      backgroundRect.setAttribute('y', '18'); // 28 - 10 = 18\n    }\n    \n    svg.appendChild(backgroundRect);\n    \n    // 创建刻度线和数值\n    for (let i = 0; i <= totalMarks; i++) {\n      const x = SVG_PADDING + (i * MARK_SPACING_PX);\n      const markValue = i; // 刻度值（毫米）\n      \n      // 确定刻度线高度\n      let markHeight = 4; // 默认小刻度高度\n      let isMajorMark = false;\n      let isMediumMark = false;\n      \n      // 每10mm（1cm）为大刻度\n      if (markValue % MM_PER_CM === 0) {\n        markHeight = 12;\n        isMajorMark = true;\n      } else if (markValue % 5 === 0) {\n        // 每5mm为中等刻度\n        markHeight = 8;\n        isMediumMark = true;\n      }\n      \n      // 创建刻度线\n      const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n      line.setAttribute('x1', `${x}`);\n      line.setAttribute('y1', position === 'top' ? '0' : '28');\n      line.setAttribute('x2', `${x}`);\n      line.setAttribute('y2', position === 'top' ? `${markHeight}` : `${28 - markHeight}`);\n      line.setAttribute('stroke', isMajorMark ? 'var(--maths-kit-ruler-major-mark, #000)' : isMediumMark ? 'var(--maths-kit-ruler-medium-mark, #666)' : 'var(--maths-kit-ruler-minor-mark, #999)');\n      line.setAttribute('stroke-width', `${MARK_WIDTH_PX}`);\n      line.setAttribute('stroke-opacity', isMajorMark ? '1' : isMediumMark ? '0.8' : '0.6');\n      svg.appendChild(line);\n      \n      // 为大刻度添加数值标签\n      if (isMajorMark) {\n        const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n        const textValue = Math.floor(markValue / MM_PER_CM); // 转换为厘米\n        text.textContent = `${textValue}`;\n        text.setAttribute('x', `${x}`);\n        text.setAttribute('y', position === 'top' ? '24' : '8');\n        text.setAttribute('text-anchor', 'middle');\n        text.setAttribute('font-size', '11px');\n        text.setAttribute('fill', 'var(--maths-kit-ruler-text, #000)');\n        text.setAttribute('font-family', 'Arial, sans-serif');\n        // text.setAttribute('font-weight', 'bold');\n        svg.appendChild(text);\n      }\n    }\n    \n    // 添加单位标识\n    const unitText = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n    unitText.textContent = 'cm';\n    unitText.setAttribute('x', `${SVG_PADDING + 5}`);\n    unitText.setAttribute('y', position === 'top' ? '24' : '8');\n    unitText.setAttribute('font-size', '9px');\n    unitText.setAttribute('fill', 'var(--maths-kit-ruler-unit-text, #666)');\n    unitText.setAttribute('font-family', 'Arial, sans-serif');\n    unitText.setAttribute('font-style', 'italic');\n    svg.appendChild(unitText);\n    \n    mark.appendChild(svg);\n  }\n\n  private createDeleteBtn() {\n    this.deleteBtn.classList.add('maths-kit-math-kit-btn-btn');\n    \n    // 应用内联样式\n    Object.assign(this.deleteBtn.style, {\n      position: 'absolute',\n      top: '50%',\n      left: '30px',\n      width: '20px',\n      height: '20px',\n      transform: 'translateY(-50%) scale(1)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n    });\n    \n    // 添加删除图标\n    this.deleteBtn.textContent = '×';\n    this.element.appendChild(this.deleteBtn);\n  }\n\n  private createRotateBtn() {\n    this.rotateBtn.classList.add('maths-kit-math-kit-btn-btn');\n    \n    // 应用内联样式\n    Object.assign(this.rotateBtn.style, {\n      position: 'absolute',\n      top: '50%',\n      right: '80px',\n      width: '20px',\n      height: '20px',\n      transform: 'translateY(-50%) scale(1)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n    });\n    \n    // 添加旋转图标\n    this.rotateBtn.textContent = '↻';\n    this.rotateBtn.setAttribute('data-type', 'Rotate');\n    this.element.appendChild(this.rotateBtn);\n  }\n\n  private createStretchBtn() {\n    this.stretchBtn = document.createElement('div');\n    this.stretchBtn.classList.add('maths-kit-math-kit-btn-btn');\n    \n    // 应用内联样式\n    Object.assign(this.stretchBtn.style, {\n      position: 'absolute',\n      top: '50%',\n      right: '30px',\n      width: '20px',\n      height: '20px',\n      transform: 'translateY(-50%) scale(1)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n    });\n    \n    // 添加拉伸图标\n    this.stretchBtn.textContent = '⇥';\n    this.stretchBtn.setAttribute('data-type', 'Stretch');\n    this.element.appendChild(this.stretchBtn);\n  }\n\n  private createAngleInput() {\n    this.angleInput.type = 'text';\n    this.angleInput.classList.add('maths-kit-angle-input');\n    \n    // 应用内联样式\n    Object.assign(this.angleInput.style, {\n      position: 'absolute',\n      top: '50%',\n      left: '50%',\n      transform: 'translate(-50%, -50%)',\n      width: '60px',\n      height: '24px',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '1px solid var(--maths-kit-math-kit-btn-border, #eee)',\n      borderRadius: '4px',\n      fontSize: '12px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      outline: 'none',\n      opacity: '0',\n      pointerEvents: 'none',\n      zIndex: '1001',\n    });\n    \n    // 设置初始值\n    this.updateAngleDisplay(0);\n    this.element.appendChild(this.angleInput);\n  }\n\n  private onAngleInputFocusHandler = () => {\n    this.angleInput.select();\n  };\n\n  private onAngleInputBlurHandler = () => {\n    this.angleInput.style.opacity = '0';\n    this.angleInput.style.pointerEvents = 'none';\n    this.applyAngleFromInput();\n  };\n\n  private onAngleInputKeyDownHandler = (e: KeyboardEvent) => {\n    if (e.key === 'Enter') {\n      this.angleInput.blur();\n    } else if (e.key === 'Escape') {\n      this.angleInput.value = this.getCurrentAngle().toString();\n      this.angleInput.blur();\n    }\n  };\n\n  private updateAngleDisplay = (angle: number) => {\n    this.angleInput.value = `${angle.toFixed(1)}°`;\n  };\n\n  private getCurrentAngle(): number {\n    // 从状态矩阵中提取旋转角度，而不是显示矩阵\n    const stateMatrix = new Matrix2D(...this.state.matrix);\n    const [a, b] = stateMatrix.toArray();\n    let angle = Math.round(Math.atan2(b, a) * (180 / Math.PI) * 100) / 100;\n    // 将角度转换为与 getAngleByPoints 一致的方向和范围\n    angle = -angle; // 取负值以匹配 getAngleByPoints 的方向\n    \n    // 确保角度在 0-360 范围内\n    if (angle < 0) {\n      angle += 360;\n    }\n    return angle;\n  }\n\n  private applyAngleFromInput() {\n    const value = this.angleInput.value.replace('°', '').trim();\n    const targetAngle = parseFloat(value);\n    \n    if (!isNaN(targetAngle)) {\n      // 获取当前角度\n      const currentAngle = this.getCurrentAngle();\n      \n      // 计算需要旋转的角度差\n      let angleDiff = targetAngle - currentAngle;\n      \n      // 确保角度差在合理范围内\n      if (angleDiff > 180) {\n        angleDiff -= 360;\n      } else if (angleDiff < -180) {\n        angleDiff += 360;\n      }\n      console.log('偏移计算:angleDiff', angleDiff);\n      // 应用旋转角度差\n      const angleInRadians = (angleDiff * Math.PI) / 180;\n      const rotationMatrix = createRotationMatrix(angleInRadians);\n      const currentMatrix = this.getDomMatrix();\n      const newMatrix = composeTransforms(currentMatrix, rotationMatrix); \n      this.updateStateMatrix(newMatrix);\n    } else {\n      // 如果输入无效，恢复当前角度\n      this.updateAngleDisplay(this.getCurrentAngle());\n    }\n  }\n\n  // 添加鼠标悬停显示输入框的功能\n  private showAngleInput = () => {\n    this.hideLineLength();\n    this.angleInput.style.opacity = '1';\n    this.angleInput.style.pointerEvents = this._isActive ? 'auto' : 'none';\n    this.updateAngleDisplay(this.getCurrentAngle());\n  };\n\n  private hideAngleInput = () => {\n    if (document.activeElement !== this.angleInput) {\n      this.angleInput.style.opacity = '0';\n      this.angleInput.style.pointerEvents = 'none';\n    }\n  };\n\n  showLineLength(number: number): void {\n    this.hideAngleInput();\n    this.lineLength.style.display = 'block';\n    // 已知道number是px，需要转换为mm\n    // 1mm = 96/25.4 像素\n    const cm = number * MM_PER_PIXELS / 10;\n    this.lineLength.textContent = `${cm.toFixed(1)}cm`;\n  }\n  hideLineLength(): void {\n    this.lineLength.style.display = 'none';\n  }\n\n  private createLineLength() {\n    this.lineLength = document.createElement('div');\n    this.lineLength.classList.add('maths-kit-line-lenth');\n    // 应用内联样式\n    Object.assign(this.lineLength.style, {\n      position: 'absolute',\n      top: '50%',\n      left: '50%',\n      transform: 'translate(-50%, -50%)',\n      width: '60px',\n      height: '24px',\n      lineHeight: '24px',\n      fontSize: '12px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      outline: 'none',\n      zIndex: '1001',\n      pointerEvents: 'none',\n    });\n    this.element.appendChild(this.lineLength);\n  }\n  \n}","import { MathsKit, MathsKitOptions, MarkLine } from '../mathsKit';\nimport { MathsKitManager } from '../manager';\nimport { Point2d } from '../utils/Point2d';\nimport Matrix2D, { createRotationMatrix, composeTransforms, decomposeMatrix } from '../utils/matrix';\nimport { LineSegment, Vec2d } from '../utils';\nimport { MathsKitElement, MathsKitType } from '../types';\nimport { MM_PER_PIXELS, PIXELS_PER_MM } from '../utils/const';\nimport { throttle } from 'lodash';\n\nexport type Triangle30Element = HTMLDivElement;\nexport type Triangle45Element = HTMLDivElement;\n\nexport class Triangle30Tool extends MathsKit {\n  protected markLines: MarkLine[] = [];\n  private deleteBtn: HTMLDivElement = document.createElement('div');\n  private rotateBtn: HTMLDivElement = document.createElement('div');\n  private angleInput: HTMLInputElement = document.createElement('input');\n  private lineLength: HTMLDivElement = document.createElement('div');\n  private stretchBtn!: HTMLDivElement;\n  private triangleView!: HTMLDivElement;\n  private elementContent!: HTMLDivElement;\n  private bottomMark!: HTMLDivElement;\n  private leftMark!: HTMLDivElement;\n  private hypotenuseMark!: HTMLDivElement;\n\n  bindElement(element: MathsKitElement, type: MathsKitType) {\n    this.element.classList.add('maths-kit', `maths-kit-${type}`, `maths-kit-${this.manager.theme}`);\n    this.manager.container.appendChild(element);\n  }\n\n  private bindElementContent(element: MathsKitElement){\n    this.elementContent = document.createElement('div');\n    this.elementContent.classList.add('maths-kit-content');\n    element.appendChild(this.elementContent);\n  }\n\n  bindTriangleView(element: MathsKitElement){\n    const triangleView = document.createElement('div');\n    triangleView.classList.add('maths-kit-view');\n    triangleView.setAttribute('data-type', 'Drag');\n    triangleView.setAttribute('data-id', this.id);\n    element.appendChild(triangleView);\n    return triangleView;\n  }\n  \n  constructor(options: MathsKitOptions, manager: MathsKitManager) {\n    super(options, manager);\n    this.bindElementContent(this.element);\n  }\n\n  init(): void {\n    this.triangleView = this.bindTriangleView(this.elementContent);\n    this.bottomMark = this.createMark(this.elementContent, 'bottom');\n    this.leftMark = this.createMark(this.elementContent, 'left');\n    this.hypotenuseMark = this.createMark(this.triangleView, 'top');\n    this.createDeleteBtn();\n    this.createRotateBtn();\n    this.createStretchBtn();\n    this.createAngleInput();\n    this.createLineLength();\n    this.bindEvent();\n    this.render();\n  }\n\n  onDragStart(): void {\n    this.toTop();\n  }\n\n  onDragDoing(): void {}\n\n  onDragEnd(matrix: Matrix2D): void {\n    this.updateStateMatrix(matrix);\n  }\n\n  onRotateStart(originAngle: number): void {\n    this.toTop();\n    this.updateAngleDisplay(originAngle);\n  }\n\n  onRotateDoing(angle: number): void {\n    this.updateAngleDisplay(angle);\n  }\n\n  onRotateEnd(matrix: Matrix2D): void {\n    this.updateStateMatrix(matrix);\n  }\n\n  onStretchStart(): void {\n    this.toTop();\n    this.thottled.cancel();\n  }\n\n  private thottled = throttle((_width: number): void => {\n    this.element.style.width = `${_width}px`;\n    this.elementContent.style.width = `${_width}px`;\n    this.elementContent.style.height = `${this.computeHeight(_width)}px`;\n    this.triangleView.style.width = `${this.computeHypotenuse(_width)}px`;\n    this.renderMark(this.elementContent);\n  },50);\n\n  onStretchDoing = (_width: number): void => {\n    this.thottled(_width);    \n  };\n\n  onStretchEnd(width: number): void {\n    this.thottled.cancel();\n    // 更新三角形的宽度\n    this.manager.update(this.id, { width: width });\n  }\n\n  /**\n   * 获取旋转中心点, 坐标必须相对于容器左上角, 旋转中心点是左上角\n   * @returns \n   */\n  getRotateCenterPoint = () => {\n    const { x, y } = this.state;\n    const container = this.manager.container;\n    const containerWidth = container.clientWidth;\n    const containerHeight = container.clientHeight;\n    const pxX = x * containerWidth;\n    const pxY = y * containerHeight;\n    const domMatrix = this.getDomMatrix();\n    const { translateX, translateY } = decomposeMatrix(domMatrix);\n    const leftTopPoint = new Vec2d(pxX + translateX, pxY + translateY);\n    // 返回 Point2d 对象\n    return new Point2d(leftTopPoint.x, leftTopPoint.y);\n  };\n\n  getMarkLines(): MarkLine[] {\n    const { x, y, width } = this.state;\n    const container = this.manager.container;\n    const containerWidth = container.clientWidth;\n    const containerHeight = container.clientHeight;\n    const { translateX, translateY, scaleX, scaleY } = decomposeMatrix(this.getDomMatrix());\n    const height = this.computeHeight(width);\n    // 30-60-90三角形的三个顶点\n    const baseWidth = width * scaleX;\n    const baseHeight = height * scaleY;\n\n    const pxX = x * containerWidth;\n    const pxY = y * containerHeight;\n    \n    // 计算三角形的三个顶点（30-60-90三角形）\n    // 直角在左下角 (0, height)\n    // 底边（x轴邻边）从 (0, height) 到 (width, height)\n    // 左边（y轴邻边）从 (0, height) 到 (0, 0)\n    // 斜边从 (0, 0) 到 (width, height)\n    const leftPoint0 = new Vec2d(pxX , pxY - baseHeight );\n    const leftPoint1 = new Vec2d(pxX, pxY);\n\n    const hypotenusePoint0 = new Vec2d(pxX, pxY - baseHeight);\n    const hypotenusePoint1 = new Vec2d(pxX + baseWidth, pxY);\n\n    const bottomPoint0 = new Vec2d(pxX, pxY);\n    const bottomPoint1 = new Vec2d(pxX + baseWidth, pxY);\n    \n    // 应用变换\n    leftPoint0.add(new Vec2d(translateX, translateY));\n    leftPoint1.add(new Vec2d(translateX, translateY));\n    hypotenusePoint0.add(new Vec2d(translateX, translateY));\n    hypotenusePoint1.add(new Vec2d(translateX, translateY));\n    bottomPoint0.add(new Vec2d(translateX, translateY));\n    bottomPoint1.add(new Vec2d(translateX, translateY));\n    \n    const currentAngle = this.getCurrentAngle();\n    const angleInRadians = (currentAngle * Math.PI) / 180;\n    const rotateCenterPoint = this.getRotateCenterPoint();\n    \n    leftPoint0.rotWith(rotateCenterPoint, -angleInRadians);\n    leftPoint1.rotWith(rotateCenterPoint, -angleInRadians);\n    hypotenusePoint0.rotWith(rotateCenterPoint, -angleInRadians);\n    hypotenusePoint1.rotWith(rotateCenterPoint, -angleInRadians);\n    bottomPoint0.rotWith(rotateCenterPoint, -angleInRadians);\n    bottomPoint1.rotWith(rotateCenterPoint, -angleInRadians);\n\n    const leftLine = new LineSegment(leftPoint0, leftPoint1);\n    const hypotenuse = new LineSegment(hypotenusePoint0, hypotenusePoint1);\n    const baseLine = new LineSegment(bottomPoint0, bottomPoint1);\n\n    const markLines: MarkLine[] = [\n      {\n        axis: 'y',\n        direction: 'left',\n        line: leftLine,\n      },\n      {\n        axis: 'x',\n        direction: 'topLeftToBottomRight',\n        line: hypotenuse,\n      },\n      {\n        axis: 'x',\n        direction: 'bottom',\n        line: baseLine,\n      },\n    ];\n    return markLines;\n  }\n\n  private bindEvent() {\n    this.deleteBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.deleteBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    this.deleteBtn.addEventListener('click', this.onDeleteBtnClickHandler);\n\n    this.stretchBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.stretchBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    \n    this.rotateBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.rotateBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    \n    this.angleInput.addEventListener('focus', this.onAngleInputFocusHandler);\n    this.angleInput.addEventListener('blur', this.onAngleInputBlurHandler);\n    this.angleInput.addEventListener('keydown', this.onAngleInputKeyDownHandler);\n    \n    // 添加鼠标悬停显示角度输入框\n    this.rotateBtn.addEventListener('mouseenter', this.showAngleInput);\n    this.angleInput.addEventListener('mouseenter', this.showAngleInput);\n  }\n\n  private unbindEvent() {\n    if (this.deleteBtn) {\n      this.deleteBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.deleteBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n      this.deleteBtn.removeEventListener('click', this.onDeleteBtnClickHandler);\n    }\n\n    if (this.stretchBtn) {\n      this.stretchBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.stretchBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n    }\n    \n    if (this.rotateBtn) {\n      this.rotateBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.rotateBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n    }\n    \n    if (this.angleInput) {\n      this.angleInput.removeEventListener('focus', this.onAngleInputFocusHandler);\n      this.angleInput.removeEventListener('blur', this.onAngleInputBlurHandler);\n      this.angleInput.removeEventListener('keydown', this.onAngleInputKeyDownHandler);\n      // 移除鼠标悬停事件\n      this.rotateBtn.removeEventListener('pointerenter', this.showAngleInput);\n      this.angleInput.removeEventListener('pointerenter', this.showAngleInput);\n    }\n    this.thottled.cancel();\n  }\n\n  destroy(): void {\n    this.triangleView.remove();\n    this.bottomMark.remove();\n    this.leftMark.remove();\n    this.hypotenuseMark.remove();\n    super.destroy();\n    this.unbindEvent();\n  }\n\n  private onDeleteBtnClickHandler = (e: MouseEvent) => {\n    e.stopPropagation();\n    this.manager.remove(this.id);\n  };\n\n  private onBtnMouseEnterHandler = (e: MouseEvent) => {\n    const target = e.currentTarget as HTMLElement;\n    target.style.background = 'var(--maths-kit-math-kit-btn-hover-bg, #f0f4ff)';\n    if (e.target === this.stretchBtn) {\n      target.style.transform = 'translateY(-50%) scale(1.1) rotate(-90deg)';\n    } else {\n      target.style.transform = 'translateY(-50%) scale(1.1)';\n    }\n  };\n\n  private onBtnMouseLeaveHandler = (e: MouseEvent) => {\n    const target = e.currentTarget as HTMLElement;\n    target.style.background = 'var(--maths-kit-math-kit-btn-bg, #fff)';\n    if (e.target === this.stretchBtn) {\n      target.style.transform = 'translateY(-50%) scale(1) rotate(-90deg)';\n    } else {\n      target.style.transform = 'translateY(-50%) scale(1)';\n    }\n  };\n\n  createElement(): HTMLDivElement {\n    const element = document.createElement('div');\n    \n    // 确保容器有正确的定位上下文\n    element.style.position = 'relative';\n    element.style.transformOrigin = 'left bottom';\n    element.style.touchAction = 'none';\n\n    return element;\n  }\n\n  private createMark(element: HTMLDivElement, position: 'bottom' | 'left' | 'top') {\n    const mark = document.createElement('div');\n    mark.classList.add('maths-kit-triangle-mark', position);\n    // 应用内联样式\n    Object.assign(mark.style, {\n      position: 'absolute',\n      left: position === 'left' ? '28px' : '0',\n      background: 'transparent',\n      ...(position === 'top' ? { \n        top: '0',\n        right: '0',\n        borderBottom: 'none',\n      } : position === 'left' ? { \n        bottom: '0',\n        borderRight: 'none',\n        transform: 'rotate(-90deg)',\n        transformOrigin: 'left bottom',\n      } : { \n        bottom: '0',\n        right: '0',\n        borderTop: 'none',\n      }),\n      pointerEvents: 'none',\n    });\n    element.appendChild(mark);\n    return mark;\n  }\n\n  private computeHeight(width: number) {\n    return width * Math.sqrt(3) / 3;\n  }\n\n  private computeHypotenuse(width: number) {\n    return 2 * this.computeHeight(width);\n  }\n\n  render(): void {\n    const state = this.state;\n    const domMatrix = this.getDomMatrix();\n    const height = this.computeHeight(state.width);\n    const width = state.width;\n\n    const style = {\n      position: 'absolute',\n      left: `${state.x * 100}%`,\n      top: `${state.y * 100}%`,\n      height: '1px',\n      width: `${width}px`,\n      minWidth: '200px',\n      transform: domMatrix.toCSSTransform(),\n      zIndex: state.zIndex,\n      boxSizing: 'content-box',\n    };\n    Object.assign(this.element.style, style);\n\n    const elementContentStyle = {\n      position: 'absolute',\n      bottom: '0',\n      left: '0',\n      width: `${width}px`,\n      height: `${height}px`,\n      minWidth: '200px',\n      minHeight: `${this.computeHeight(200)}px`,\n      overflow: 'hidden',\n      boxSizing: 'content-box',\n      borderLeft: '1px solid var(--maths-kit-ruler-border, rgba(225, 225, 225, 0.8))',\n      borderBottom: '1px solid var(--maths-kit-ruler-border, rgba(225, 225, 225, 0.8))',\n      borderRight: '0',\n      borderTop: '0',\n      pointerEvents: 'none',\n    };\n    Object.assign(this.elementContent.style, elementContentStyle);\n\n    const angleInRadians = (330 * Math.PI) / 180;\n    const triangleMatrix = createRotationMatrix(angleInRadians);\n    const hypotenuse = this.computeHypotenuse(state.width);\n    const hypotenuseHeight = this.computeHeight(hypotenuse);\n    const minHypotenuseWidth = this.computeHypotenuse(200);\n    const minHypotenuseHeight = this.computeHeight(hypotenuse);\n    const triangleViewStyle = {\n      position: 'absolute',\n      left: '0',\n      top: '0',\n      width: `${hypotenuse}px`,\n      height: `${hypotenuseHeight}px`,\n      minWidth: `${minHypotenuseWidth}px`,\n      minHeight: `${minHypotenuseHeight}px`,\n      transform: triangleMatrix.toCSSTransform(),\n      boxSizing: 'border-box',\n      transformOrigin: 'left top',\n      borderTop: '1px solid var(--maths-kit-ruler-border, rgba(225, 225, 225, 0.8))',\n      backgroundColor: 'var(--maths-kit-ruler-bg, rgba(255, 255, 255, 0.8))',\n      // border: '1px solid var(--maths-kit-ruler-border, rgba(225, 225, 225, 0.8))',\n      pointerEvents: this._isActive ? 'auto' : 'none',\n      cursor: 'pointer',\n    };\n    Object.assign(this.triangleView.style, triangleViewStyle);\n    \n    // 使用setTimeout确保DOM完全渲染后再获取尺寸和重新绑定事件\n    setTimeout(() => {\n      this.renderMark(this.elementContent);\n    }, 0);\n\n  }\n  private renderMark(element: Triangle30Element) {\n    const marks = element.querySelectorAll('.maths-kit-triangle-mark') as NodeListOf<HTMLDivElement>;\n    marks.forEach((mark) => {\n      this.renderMarkAtPosition(mark);\n    });\n  }\n\n  private renderMarkAtPosition(mark: HTMLDivElement) {\n    const position = mark.classList.contains('top') ? 'top' : mark.classList.contains('bottom') ? 'bottom' : 'left';\n    // 清空现有内容\n    mark.innerHTML = '';\n\n    let svgWidth = 0;\n    // SVG内部padding\n    if(position === 'left') {\n      const width = this.elementContent.offsetHeight;\n      if (width <= 0) return;\n      svgWidth = width;\n    } else if (position === 'bottom') {\n      const width = this.elementContent.offsetWidth;\n      if (width <= 0) return;\n      svgWidth = width;\n    } else {\n      const width = mark.offsetWidth;\n      if (width <= 0) return;\n      svgWidth = width;\n    }\n    let SVG_PADDING = 40;\n    if (position === 'top') {\n      SVG_PADDING = 55;\n    }\n\n    const SVG_BG_HEIGHT = 28;\n\n    // 保持原有的绝对定位，只更新必要的样式\n    if (position === 'left') {\n      mark.style.width = `${svgWidth}px`; // 减少高度，因为刻度线变短了\n      mark.style.height = `${SVG_BG_HEIGHT}px`;\n    } else {\n      mark.style.height = `${SVG_BG_HEIGHT}px`; // 减少高度，因为刻度线变短了\n    }\n    mark.style.overflow = 'hidden';\n    mark.style.zIndex = '1';\n\n    // 获取设备像素比，用于更精确的物理尺寸计算\n    // const devicePixelRatio = window.devicePixelRatio || 1;\n    const MM_PER_CM = 10;\n    \n    // 刻度间距：1mm\n    const MARK_SPACING_MM = 1;\n    const MARK_SPACING_PX = MARK_SPACING_MM * PIXELS_PER_MM;\n    \n    // 刻度线宽度：1px\n    const MARK_WIDTH_PX = 1;\n    \n    // 计算可以容纳的刻度数量（考虑SVG内部padding）\n    let availableWidth = svgWidth;\n    if (position === 'bottom') {\n      availableWidth = availableWidth - (SVG_PADDING * 2.5);\n    } else {\n      availableWidth = availableWidth - (SVG_PADDING * 2);\n    }\n    const totalMarks = Math.floor(availableWidth / MARK_SPACING_PX);\n    \n    // 创建SVG容器\n    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    const width = position === 'left' ? svgWidth - 10 : position === 'bottom' ? svgWidth - 20 : svgWidth;\n    svg.setAttribute('width', `${width}`);\n    svg.setAttribute('height', `${SVG_BG_HEIGHT}`); // 减少SVG高度\n    svg.style.position = 'absolute';\n    svg.style.top = '0';\n    svg.style.left = '0';\n    \n    // 添加半透明背景矩形\n    const backgroundRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n    backgroundRect.setAttribute('width', `${width}`);\n    backgroundRect.setAttribute('height', '10'); // 中等刻度线高度8px + 2px = 10px\n    backgroundRect.setAttribute('fill', 'var(--maths-kit-ruler-mark-bg, rgba(240, 240, 240, 0.8))');\n    backgroundRect.setAttribute('rx', '2');\n    backgroundRect.setAttribute('ry', '2');\n    \n    // 根据位置调整背景矩形的位置\n    if (position === 'bottom') {\n      backgroundRect.setAttribute('y', `${SVG_BG_HEIGHT - 10}`); // 28 - 10 = 18\n    } else {\n      backgroundRect.setAttribute('y', '0');\n    }\n    \n    svg.appendChild(backgroundRect);\n    \n    // 创建刻度线和数值\n    for (let i = 0; i <= totalMarks; i++) {\n      const x = SVG_PADDING + (i * MARK_SPACING_PX);\n      const markValue = i; // 刻度值（毫米）\n      \n      // 确定刻度线高度\n      let markHeight = 4; // 默认小刻度高度\n      let isMajorMark = false;\n      let isMediumMark = false;\n      \n      // 每10mm（1cm）为大刻度\n      if (markValue % MM_PER_CM === 0) {\n        markHeight = 12;\n        isMajorMark = true;\n      } else if (markValue % 5 === 0) {\n        // 每5mm为中等刻度\n        markHeight = 8;\n        isMediumMark = true;\n      }\n      \n      // 创建刻度线\n      const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n      const x1 = position === 'left' ? x-10 : position === 'bottom' ? x - 20 : x;\n      const x2 = position === 'left' ? x-10 : position === 'bottom' ? x - 20 : x;\n      const y1 = position === 'top' || position === 'left' ? '0' : `${SVG_BG_HEIGHT}`;\n      const y2 = position === 'top' || position === 'left' ? `${markHeight}` : `${SVG_BG_HEIGHT - markHeight}`;\n      line.setAttribute('x1', `${x1}`);\n      line.setAttribute('y1', `${y1}`);\n      line.setAttribute('x2', `${x2}`);\n      line.setAttribute('y2', `${y2}`);\n      line.setAttribute('stroke', isMajorMark ? 'var(--maths-kit-ruler-major-mark, #000)' : isMediumMark ? 'var(--maths-kit-ruler-medium-mark, #666)' : 'var(--maths-kit-ruler-minor-mark, #999)');\n      line.setAttribute('stroke-width', `${MARK_WIDTH_PX}`);\n      line.setAttribute('stroke-opacity', isMajorMark ? '1' : isMediumMark ? '0.8' : '0.6');\n      svg.appendChild(line);\n      \n      // 为大刻度添加数值标签\n      if (isMajorMark) {\n        const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n        const textValue = Math.floor(markValue / MM_PER_CM); // 转换为厘米\n        if (position === 'left' && textValue === 0) {\n          text.textContent = '';\n        } else {\n          text.textContent = `${textValue}`;\n        }\n        const y = position === 'top' || position === 'left' ? '24' : '8';\n        text.setAttribute('x', `${x1}`);\n        text.setAttribute('y', `${y}`);\n        text.setAttribute('text-anchor', 'middle');\n        text.setAttribute('font-size', '11px');\n        text.setAttribute('fill', 'var(--maths-kit-ruler-text, #000)');\n        text.setAttribute('font-family', 'Arial, sans-serif');\n        // text.setAttribute('font-weight', 'bold');\n        svg.appendChild(text);\n      }\n    }\n    \n    if (position === 'bottom') {\n      // 添加单位标识\n      const unitText = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n      unitText.textContent = 'cm';\n      unitText.setAttribute('x', `${SVG_PADDING - 12}`);\n      unitText.setAttribute('y', '8');\n      unitText.setAttribute('font-size', '9px');\n      unitText.setAttribute('fill', 'var(--maths-kit-ruler-unit-text, #666)');\n      unitText.setAttribute('font-family', 'Arial, sans-serif');\n      unitText.setAttribute('font-style', 'italic');\n      svg.appendChild(unitText);\n    }\n\n    mark.appendChild(svg);\n  }\n\n  setActive(isActive: boolean) {\n    this._isActive = isActive;\n    if (isActive) {\n      this.triangleView.style.pointerEvents = 'auto';\n      if (this.angleInput) {\n        this.angleInput.style.pointerEvents = 'auto';\n      }\n    } else {\n      this.triangleView.style.pointerEvents = 'none';\n      if (this.angleInput) {\n        this.angleInput.style.pointerEvents = 'none';\n      }\n    }\n  }\n\n  private createDeleteBtn() {\n    this.deleteBtn.classList.add('maths-kit-math-kit-btn-btn');\n    \n    // 应用内联样式\n    Object.assign(this.deleteBtn.style, {\n      position: 'absolute',\n      top: '40px',\n      left: '15%',\n      width: '20px',\n      height: '20px',\n      transform: 'translateY(-50%) scale(1)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n    });\n    \n    // 添加删除图标\n    this.deleteBtn.textContent = '×';\n    this.triangleView.appendChild(this.deleteBtn);\n  }\n\n  private createRotateBtn() {\n    this.rotateBtn.classList.add('maths-kit-math-kit-btn-btn');\n    \n    // 应用内联样式\n    Object.assign(this.rotateBtn.style, {\n      position: 'absolute',\n      top: '40px',\n      right: '35%',\n      width: '20px',\n      height: '20px',\n      transform: 'translateY(-50%) scale(1)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n    });\n    \n    // 添加旋转图标\n    this.rotateBtn.textContent = '↻';\n    this.rotateBtn.setAttribute('data-type', 'Rotate');\n    this.triangleView.appendChild(this.rotateBtn);\n  }\n\n  private createStretchBtn() {\n    this.stretchBtn = document.createElement('div');\n    this.stretchBtn.classList.add('maths-kit-math-kit-btn-btn');\n    \n    // 应用内联样式\n    Object.assign(this.stretchBtn.style, {\n      position: 'absolute',\n      top: '40px',\n      left: '50%',\n      width: '20px',\n      height: '20px',\n      transform: 'translateY(-50%) scale(1) rotate(-90deg)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n    });\n    \n    // 添加拉伸图标\n    this.stretchBtn.textContent = '⇥';\n    this.stretchBtn.setAttribute('data-type', 'Stretch');\n    this.triangleView.appendChild(this.stretchBtn);\n  }\n\n  private createAngleInput() {\n    this.angleInput.type = 'text';\n    this.angleInput.classList.add('maths-kit-angle-input');\n    \n    // 应用内联样式\n    Object.assign(this.angleInput.style, {\n      position: 'absolute',\n      top: '40px',\n      left: '35%',\n      transform: 'translate(-50%, -50%)',\n      width: '60px',\n      height: '24px',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '1px solid var(--maths-kit-math-kit-btn-border, #eee)',\n      borderRadius: '4px',\n      fontSize: '12px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      outline: 'none',\n      opacity: '0',\n      pointerEvents: 'none',\n      zIndex: '1001',\n    });\n    \n    // 设置初始值\n    this.updateAngleDisplay(0);\n    this.triangleView.appendChild(this.angleInput);\n  }\n\n  private onAngleInputFocusHandler = () => {\n    this.angleInput.select();\n  };\n\n  private onAngleInputBlurHandler = () => {\n    this.angleInput.style.opacity = '0';\n    this.angleInput.style.pointerEvents = 'none';\n    this.applyAngleFromInput();\n  };\n\n  private onAngleInputKeyDownHandler = (e: KeyboardEvent) => {\n    if (e.key === 'Enter') {\n      this.angleInput.blur();\n    } else if (e.key === 'Escape') {\n      this.angleInput.value = this.getCurrentAngle().toString();\n      this.angleInput.blur();\n    }\n  };\n\n  private updateAngleDisplay = (angle: number) => {\n    this.angleInput.value = `${angle.toFixed(1)}°`;\n  };\n\n  private getCurrentAngle(): number {\n    // 从状态矩阵中提取旋转角度，而不是显示矩阵\n    const stateMatrix = new Matrix2D(...this.state.matrix);\n    const [a, b] = stateMatrix.toArray();\n    let angle = Math.round(Math.atan2(b, a) * (180 / Math.PI) * 100) / 100;\n    // 将角度转换为与 getAngleByPoints 一致的方向和范围\n    angle = -angle; // 取负值以匹配 getAngleByPoints 的方向\n    \n    // 确保角度在 0-360 范围内\n    if (angle < 0) {\n      angle += 360;\n    }\n    return angle;\n  }\n\n  private applyAngleFromInput() {\n    const value = this.angleInput.value.replace('°', '').trim();\n    const targetAngle = parseFloat(value);\n    \n    if (!isNaN(targetAngle)) {\n      // 获取当前角度\n      const currentAngle = this.getCurrentAngle();\n      \n      // 计算需要旋转的角度差\n      let angleDiff = targetAngle - currentAngle;\n      \n      // 确保角度差在合理范围内\n      if (angleDiff > 180) {\n        angleDiff -= 360;\n      } else if (angleDiff < -180) {\n        angleDiff += 360;\n      }\n      console.log('偏移计算:angleDiff', angleDiff);\n      // 应用旋转角度差\n      const angleInRadians = (angleDiff * Math.PI) / 180;\n      const rotationMatrix = createRotationMatrix(angleInRadians);\n      const currentMatrix = this.getDomMatrix();\n      const newMatrix = composeTransforms(currentMatrix, rotationMatrix); \n      this.updateStateMatrix(newMatrix);\n    } else {\n      // 如果输入无效，恢复当前角度\n      this.updateAngleDisplay(this.getCurrentAngle());\n    }\n  }\n\n  // 添加鼠标悬停显示输入框的功能\n  private showAngleInput = () => {\n    this.hideLineLength();\n    this.angleInput.style.opacity = '1';\n    this.angleInput.style.pointerEvents = this._isActive ? 'auto' : 'none';\n    this.updateAngleDisplay(this.getCurrentAngle());\n  };\n\n  private hideAngleInput = () => {\n    if (document.activeElement !== this.angleInput) {\n      this.angleInput.style.opacity = '0';\n      this.angleInput.style.pointerEvents = 'none';\n    }\n  };\n\n  showLineLength(number: number): void {\n    this.hideAngleInput();\n    this.lineLength.style.display = 'block';\n    // 已知道number是px，需要转换为mm\n    // 1mm = 96/25.4 像素\n    const cm = number * MM_PER_PIXELS / 10;\n    this.lineLength.textContent = `${cm.toFixed(1)}cm`;\n  }\n\n  hideLineLength(): void {\n    this.lineLength.style.display = 'none';\n  }\n\n  private createLineLength() {\n    this.lineLength = document.createElement('div');\n    this.lineLength.classList.add('maths-kit-line-lenth');\n    // 应用内联样式\n    Object.assign(this.lineLength.style, {\n      position: 'absolute',\n      top: '40px',\n      left: '35%',\n      transform: 'translate(-50%, -50%)',\n      width: '60px',\n      height: '24px',\n      lineHeight: '24px',\n      fontSize: '12px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      outline: 'none',\n      zIndex: '1001',\n      pointerEvents: 'none',\n    });\n    this.triangleView.appendChild(this.lineLength);\n  }\n}\n\nexport class Triangle45Tool extends MathsKit {\n  protected markLines: MarkLine[] = [];\n  private deleteBtn: HTMLDivElement = document.createElement('div');\n  private rotateBtn: HTMLDivElement = document.createElement('div');\n  private angleInput: HTMLInputElement = document.createElement('input');\n  private lineLength: HTMLDivElement = document.createElement('div');\n  private stretchBtn!: HTMLDivElement;\n  private triangleView!: HTMLDivElement;\n  private elementContent!: HTMLDivElement;\n  private bottomMark!: HTMLDivElement;\n  private leftMark!: HTMLDivElement;\n  private hypotenuseMark!: HTMLDivElement;\n\n  bindElement(element: MathsKitElement, type: MathsKitType) {\n    this.element.classList.add('maths-kit', `maths-kit-${type}`, `maths-kit-${this.manager.theme}`);\n    this.manager.container.appendChild(element);\n  }\n\n  private bindElementContent(element: MathsKitElement){\n    this.elementContent = document.createElement('div');\n    this.elementContent.classList.add('maths-kit-content');\n    element.appendChild(this.elementContent);\n  }\n\n  bindTriangleView(element: MathsKitElement){\n    const triangleView = document.createElement('div');\n    triangleView.classList.add('maths-kit-view');\n    triangleView.setAttribute('data-type', 'Drag');\n    triangleView.setAttribute('data-id', this.id);\n    element.appendChild(triangleView);\n    return triangleView;\n  }\n  \n  constructor(options: MathsKitOptions, manager: MathsKitManager) {\n    super(options, manager);\n    this.bindElementContent(this.element);\n  }\n\n  init(): void {\n    this.triangleView = this.bindTriangleView(this.elementContent);\n    this.bottomMark = this.createMark(this.elementContent, 'bottom');\n    this.leftMark = this.createMark(this.elementContent, 'left');\n    this.hypotenuseMark = this.createMark(this.triangleView, 'top');\n    this.createDeleteBtn();\n    this.createRotateBtn();\n    this.createStretchBtn();\n    this.createAngleInput();\n    this.createLineLength();\n    this.bindEvent();\n    this.render();\n  }\n\n  onDragStart(): void {\n    this.toTop();\n  }\n\n  onDragDoing(): void {}\n\n  onDragEnd(matrix: Matrix2D): void {\n    this.updateStateMatrix(matrix);\n  }\n\n  onRotateStart(originAngle: number): void {\n    this.toTop();\n    this.updateAngleDisplay(originAngle);\n  }\n\n  onRotateDoing(angle: number): void {\n    this.updateAngleDisplay(angle);\n  }\n\n  onRotateEnd(matrix: Matrix2D): void {\n    this.updateStateMatrix(matrix);\n  }\n\n  onStretchStart(): void {\n    this.toTop();\n    this.thottled.cancel();\n  }\n\n  private thottled = throttle((_width: number): void => {\n    this.element.style.width = `${_width}px`;\n    this.elementContent.style.width = `${_width}px`;\n    this.elementContent.style.height = `${this.computeHeight(_width)}px`;\n    this.triangleView.style.width = `${this.computeHypotenuse(_width)}px`;\n    this.renderMark(this.elementContent);\n  },50);\n\n  onStretchDoing = (_width: number): void => {\n    this.thottled(_width);    \n  };\n\n  onStretchEnd(width: number): void {\n    this.thottled.cancel();\n    // 更新三角形的宽度\n    this.manager.update(this.id, { width: width });\n  }\n\n  /**\n   * 获取旋转中心点, 坐标必须相对于容器左上角, 旋转中心点是左上角\n   * @returns \n   */\n  getRotateCenterPoint = () => {\n    const { x, y } = this.state;\n    const container = this.manager.container;\n    const containerWidth = container.clientWidth;\n    const containerHeight = container.clientHeight;\n    const pxX = x * containerWidth;\n    const pxY = y * containerHeight;\n    const domMatrix = this.getDomMatrix();\n    const { translateX, translateY } = decomposeMatrix(domMatrix);\n    const leftTopPoint = new Vec2d(pxX + translateX, pxY + translateY);\n    // 返回 Point2d 对象\n    return new Point2d(leftTopPoint.x, leftTopPoint.y);\n  };\n\n  getMarkLines(): MarkLine[] {\n    const { x, y, width } = this.state;\n    const container = this.manager.container;\n    const containerWidth = container.clientWidth;\n    const containerHeight = container.clientHeight;\n    const { translateX, translateY, scaleX, scaleY } = decomposeMatrix(this.getDomMatrix());\n    const height = this.computeHeight(width);\n    // 45-45-90三角形的三个顶点\n    const baseWidth = width * scaleX;\n    const baseHeight = height * scaleY;\n\n    const pxX = x * containerWidth;\n    const pxY = y * containerHeight;\n    \n    // 计算三角形的三个顶点（45-45-90三角形）\n    // 直角在左下角 (0, height)\n    // 底边（x轴邻边）从 (0, height) 到 (width, height)\n    // 左边（y轴邻边）从 (0, height) 到 (0, 0)\n    // 斜边从 (0, 0) 到 (width, height)\n    const leftPoint0 = new Vec2d(pxX , pxY - baseHeight );\n    const leftPoint1 = new Vec2d(pxX, pxY);\n\n    const hypotenusePoint0 = new Vec2d(pxX, pxY - baseHeight);\n    const hypotenusePoint1 = new Vec2d(pxX + baseWidth, pxY);\n\n    const bottomPoint0 = new Vec2d(pxX, pxY);\n    const bottomPoint1 = new Vec2d(pxX + baseWidth, pxY);\n    \n    // 应用变换\n    leftPoint0.add(new Vec2d(translateX, translateY));\n    leftPoint1.add(new Vec2d(translateX, translateY));\n    hypotenusePoint0.add(new Vec2d(translateX, translateY));\n    hypotenusePoint1.add(new Vec2d(translateX, translateY));\n    bottomPoint0.add(new Vec2d(translateX, translateY));\n    bottomPoint1.add(new Vec2d(translateX, translateY));\n    \n    const currentAngle = this.getCurrentAngle();\n    const angleInRadians = (currentAngle * Math.PI) / 180;\n    const rotateCenterPoint = this.getRotateCenterPoint();\n    \n    leftPoint0.rotWith(rotateCenterPoint, -angleInRadians);\n    leftPoint1.rotWith(rotateCenterPoint, -angleInRadians);\n    hypotenusePoint0.rotWith(rotateCenterPoint, -angleInRadians);\n    hypotenusePoint1.rotWith(rotateCenterPoint, -angleInRadians);\n    bottomPoint0.rotWith(rotateCenterPoint, -angleInRadians);\n    bottomPoint1.rotWith(rotateCenterPoint, -angleInRadians);\n\n    const leftLine = new LineSegment(leftPoint0, leftPoint1);\n    const hypotenuse = new LineSegment(hypotenusePoint0, hypotenusePoint1);\n    const baseLine = new LineSegment(bottomPoint0, bottomPoint1);\n\n    const markLines: MarkLine[] = [\n      {\n        axis: 'y',\n        direction: 'left',\n        line: leftLine,\n      },\n      {\n        axis: 'x',\n        direction: 'topLeftToBottomRight',\n        line: hypotenuse,\n      },\n      {\n        axis: 'x',\n        direction: 'bottom',\n        line: baseLine,\n      },\n    ];\n    return markLines;\n  }\n\n  private bindEvent() {\n    this.deleteBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.deleteBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    this.deleteBtn.addEventListener('click', this.onDeleteBtnClickHandler);\n\n    this.stretchBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.stretchBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    \n    this.rotateBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.rotateBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    \n    this.angleInput.addEventListener('focus', this.onAngleInputFocusHandler);\n    this.angleInput.addEventListener('blur', this.onAngleInputBlurHandler);\n    this.angleInput.addEventListener('keydown', this.onAngleInputKeyDownHandler);\n    \n    // 添加鼠标悬停显示角度输入框\n    this.rotateBtn.addEventListener('mouseenter', this.showAngleInput);\n    this.angleInput.addEventListener('mouseenter', this.showAngleInput);\n  }\n\n  private unbindEvent() {\n    if (this.deleteBtn) {\n      this.deleteBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.deleteBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n      this.deleteBtn.removeEventListener('click', this.onDeleteBtnClickHandler);\n    }\n\n    if (this.stretchBtn) {\n      this.stretchBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.stretchBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n    }\n    \n    if (this.rotateBtn) {\n      this.rotateBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.rotateBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n    }\n    \n    if (this.angleInput) {\n      this.angleInput.removeEventListener('focus', this.onAngleInputFocusHandler);\n      this.angleInput.removeEventListener('blur', this.onAngleInputBlurHandler);\n      this.angleInput.removeEventListener('keydown', this.onAngleInputKeyDownHandler);\n      // 移除鼠标悬停事件\n      this.rotateBtn.removeEventListener('pointerenter', this.showAngleInput);\n      this.angleInput.removeEventListener('pointerenter', this.showAngleInput);\n    }\n    this.thottled.cancel();\n  }\n\n  destroy(): void {\n    this.triangleView.remove();\n    this.bottomMark.remove();\n    this.leftMark.remove();\n    this.hypotenuseMark.remove();\n    super.destroy();\n    this.unbindEvent();\n  }\n\n  private onDeleteBtnClickHandler = (e: MouseEvent) => {\n    e.stopPropagation();\n    this.manager.remove(this.id);\n  };\n\n  private onBtnMouseEnterHandler = (e: MouseEvent) => {\n    const target = e.currentTarget as HTMLElement;\n    target.style.background = 'var(--maths-kit-math-kit-btn-hover-bg, #f0f4ff)';\n    if (e.target === this.stretchBtn) {\n      target.style.transform = 'translateY(-50%) scale(1.1) rotate(-90deg)';\n    } else if (e.target === this.deleteBtn) {\n      target.style.transform = 'translateY(-50%) scale(1.1) rotate(45deg)';\n    }   else {\n      target.style.transform = 'translateY(-50%) scale(1.1)';\n    }\n  };\n\n  private onBtnMouseLeaveHandler = (e: MouseEvent) => {\n    const target = e.currentTarget as HTMLElement;\n    target.style.background = 'var(--maths-kit-math-kit-btn-bg, #fff)';\n    if (e.target === this.stretchBtn) {\n      target.style.transform = 'translateY(-50%) scale(1) rotate(-90deg)';\n    } else if (e.target === this.deleteBtn) {\n      target.style.transform = 'translateY(-50%) scale(1) rotate(45deg)';\n    } else {\n      target.style.transform = 'translateY(-50%) scale(1)';\n    }\n  };\n\n  createElement(): HTMLDivElement {\n    const element = document.createElement('div');\n    \n    // 确保容器有正确的定位上下文\n    element.style.position = 'relative';\n    element.style.transformOrigin = 'left bottom';\n    element.style.touchAction = 'none';\n\n    return element;\n  }\n\n  private createMark(element: HTMLDivElement, position: 'bottom' | 'left' | 'top') {\n    const mark = document.createElement('div');\n    mark.classList.add('maths-kit-triangle-mark', position);\n    // 应用内联样式\n    Object.assign(mark.style, {\n      position: 'absolute',\n      left: position === 'left' ? '28px' : '0',\n      background: 'transparent',\n      ...(position === 'top' ? { \n        top: '0',\n        right: '0',\n        borderBottom: 'none',\n      } : position === 'left' ? { \n        bottom: '0',\n        borderRight: 'none',\n        transform: 'rotate(-90deg)',\n        transformOrigin: 'left bottom',\n      } : { \n        bottom: '0',\n        right: '0',\n        borderTop: 'none',\n      }),\n      pointerEvents: 'none',\n    });\n    element.appendChild(mark);\n    return mark;\n  }\n\n  private computeHeight(width: number) {\n    return width;\n  }\n\n  private computeHypotenuse(width: number) {\n    return width * Math.sqrt(2);\n  }\n\n  render(): void {\n    const state = this.state;\n    const domMatrix = this.getDomMatrix();\n    const height = this.computeHeight(state.width);\n    const width = state.width;\n\n    const style = {\n      position: 'absolute',\n      left: `${state.x * 100}%`,\n      top: `${state.y * 100}%`,\n      height: '1px',\n      width: `${width}px`,\n      minWidth: '200px',\n      transform: domMatrix.toCSSTransform(),\n      zIndex: state.zIndex,\n      boxSizing: 'content-box',\n    };\n    Object.assign(this.element.style, style);\n\n    const elementContentStyle = {\n      position: 'absolute',\n      bottom: '0',\n      left: '0',\n      width: `${width}px`,\n      height: `${height}px`,\n      minWidth: '200px',\n      minHeight: `${this.computeHeight(200)}px`,\n      overflow: 'hidden',\n      boxSizing: 'content-box',\n      borderLeft: '1px solid var(--maths-kit-ruler-border, rgba(225, 225, 225, 0.8))',\n      borderBottom: '1px solid var(--maths-kit-ruler-border, rgba(225, 225, 225, 0.8))',\n      borderRight: '0',\n      borderTop: '0',\n      pointerEvents: 'none',\n    };\n    Object.assign(this.elementContent.style, elementContentStyle);\n\n    const angleInRadians = (315 * Math.PI) / 180;\n    const triangleMatrix = createRotationMatrix(angleInRadians);\n    const hypotenuse = this.computeHypotenuse(state.width);\n    const hypotenuseHeight = this.computeHeight(hypotenuse);\n    const minHypotenuseWidth = this.computeHypotenuse(200);\n    const minHypotenuseHeight = this.computeHeight(hypotenuse);\n    const triangleViewStyle = {\n      position: 'absolute',\n      left: '0',\n      top: '0',\n      width: `${hypotenuse}px`,\n      height: `${hypotenuseHeight}px`,\n      minWidth: `${minHypotenuseWidth}px`,\n      minHeight: `${minHypotenuseHeight}px`,\n      transform: triangleMatrix.toCSSTransform(),\n      boxSizing: 'border-box',\n      transformOrigin: 'left top',\n      borderTop: '1px solid var(--maths-kit-ruler-border, rgba(225, 225, 225, 0.8))',\n      backgroundColor: 'var(--maths-kit-ruler-bg, rgba(255, 255, 255, 0.8))',\n      // border: '1px solid var(--maths-kit-ruler-border, rgba(225, 225, 225, 0.8))',\n      pointerEvents: this._isActive ? 'auto' : 'none',\n      cursor: 'pointer',\n    };\n    Object.assign(this.triangleView.style, triangleViewStyle);\n    \n    // 使用setTimeout确保DOM完全渲染后再获取尺寸和重新绑定事件\n    setTimeout(() => {\n      this.renderMark(this.elementContent);\n    }, 0);\n\n  }\n  private renderMark(element: Triangle45Element) {\n    const marks = element.querySelectorAll('.maths-kit-triangle-mark') as NodeListOf<HTMLDivElement>;\n    marks.forEach((mark) => {\n      this.renderMarkAtPosition(mark);\n    });\n  }\n\n  private renderMarkAtPosition(mark: HTMLDivElement) {\n    const position = mark.classList.contains('top') ? 'top' : mark.classList.contains('bottom') ? 'bottom' : 'left';\n    // 清空现有内容\n    mark.innerHTML = '';\n\n    let svgWidth = 0;\n    // SVG内部padding\n    if(position === 'left' || position === 'bottom') {\n      const width = this.elementContent.offsetWidth;\n      if (width <= 0) return;\n      svgWidth = width;\n    } else {\n      const width = mark.offsetWidth;\n      if (width <= 0) return;\n      svgWidth = width;\n    }\n    let SVG_PADDING = 40;\n    if (position === 'top') {\n      SVG_PADDING = 55;\n    }\n\n    const SVG_BG_HEIGHT = 28;\n\n    // 保持原有的绝对定位，只更新必要的样式\n    if (position === 'left') {\n      mark.style.width = `${svgWidth}px`; // 减少高度，因为刻度线变短了\n      mark.style.height = `${SVG_BG_HEIGHT}px`;\n    } else {\n      mark.style.height = `${SVG_BG_HEIGHT}px`; // 减少高度，因为刻度线变短了\n    }\n    mark.style.overflow = 'hidden';\n    mark.style.zIndex = '1';\n\n    // 获取设备像素比，用于更精确的物理尺寸计算\n    // const devicePixelRatio = window.devicePixelRatio || 1;\n    const MM_PER_CM = 10;\n    \n    // 刻度间距：1mm\n    const MARK_SPACING_MM = 1;\n    const MARK_SPACING_PX = MARK_SPACING_MM * PIXELS_PER_MM;\n    \n    // 刻度线宽度：1px\n    const MARK_WIDTH_PX = 1;\n    \n    // 计算可以容纳的刻度数量（考虑SVG内部padding）\n    const availableWidth = svgWidth - (SVG_PADDING * 2);\n    const totalMarks = Math.floor(availableWidth / MARK_SPACING_PX);\n    \n    // 创建SVG容器\n    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    const width = position === 'left' || position === 'bottom' ? svgWidth - 10 : svgWidth;\n    svg.setAttribute('width', `${width}`);\n    svg.setAttribute('height', `${SVG_BG_HEIGHT}`); // 减少SVG高度\n    svg.style.position = 'absolute';\n    svg.style.top = '0';\n    svg.style.left = '0';\n    \n    // 添加半透明背景矩形\n    const backgroundRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n    backgroundRect.setAttribute('width', `${width}`);\n    backgroundRect.setAttribute('height', '10'); // 中等刻度线高度8px + 2px = 10px\n    backgroundRect.setAttribute('fill', 'var(--maths-kit-ruler-mark-bg, rgba(240, 240, 240, 0.8))');\n    backgroundRect.setAttribute('rx', '2');\n    backgroundRect.setAttribute('ry', '2');\n    \n    // 根据位置调整背景矩形的位置\n    if (position === 'bottom') {\n      backgroundRect.setAttribute('y', `${SVG_BG_HEIGHT - 10}`); // 28 - 10 = 18\n    } else {\n      backgroundRect.setAttribute('y', '0');\n    }\n    \n    svg.appendChild(backgroundRect);\n    \n    // 创建刻度线和数值\n    for (let i = 0; i <= totalMarks; i++) {\n      const x = SVG_PADDING + (i * MARK_SPACING_PX);\n      const markValue = i; // 刻度值（毫米）\n      \n      // 确定刻度线高度\n      let markHeight = 4; // 默认小刻度高度\n      let isMajorMark = false;\n      let isMediumMark = false;\n      \n      // 每10mm（1cm）为大刻度\n      if (markValue % MM_PER_CM === 0) {\n        markHeight = 12;\n        isMajorMark = true;\n      } else if (markValue % 5 === 0) {\n        // 每5mm为中等刻度\n        markHeight = 8;\n        isMediumMark = true;\n      }\n      \n      // 创建刻度线\n      const line = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n      const x1 = position === 'left' ||  position === 'bottom' ? x-10 : x;\n      const x2 = position === 'left' || position === 'bottom' ? x-10 : x;\n      const y1 = position === 'top' || position === 'left' ? '0' : `${SVG_BG_HEIGHT}`;\n      const y2 = position === 'top' || position === 'left' ? `${markHeight}` : `${SVG_BG_HEIGHT - markHeight}`;\n      line.setAttribute('x1', `${x1}`);\n      line.setAttribute('y1', `${y1}`);\n      line.setAttribute('x2', `${x2}`);\n      line.setAttribute('y2', `${y2}`);\n      line.setAttribute('stroke', isMajorMark ? 'var(--maths-kit-ruler-major-mark, #000)' : isMediumMark ? 'var(--maths-kit-ruler-medium-mark, #666)' : 'var(--maths-kit-ruler-minor-mark, #999)');\n      line.setAttribute('stroke-width', `${MARK_WIDTH_PX}`);\n      line.setAttribute('stroke-opacity', isMajorMark ? '1' : isMediumMark ? '0.8' : '0.6');\n      svg.appendChild(line);\n      \n      // 为大刻度添加数值标签\n      if (isMajorMark) {\n        const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n        const textValue = Math.floor(markValue / MM_PER_CM); // 转换为厘米\n        if (position === 'left' && textValue === 0) {\n          text.textContent = '';\n        } else {\n          text.textContent = `${textValue}`;\n        }\n        const y = position === 'top' || position === 'left' ? '24' : '8';\n        text.setAttribute('x', `${x1}`);\n        text.setAttribute('y', `${y}`);\n        text.setAttribute('text-anchor', 'middle');\n        text.setAttribute('font-size', '11px');\n        text.setAttribute('fill', 'var(--maths-kit-ruler-text, #000)');\n        text.setAttribute('font-family', 'Arial, sans-serif');\n        // text.setAttribute('font-weight', 'bold');\n        svg.appendChild(text);\n      }\n    }\n    \n    if (position === 'bottom') {\n      // 添加单位标识\n      const unitText = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n      unitText.textContent = 'cm';\n      unitText.setAttribute('x', `${SVG_PADDING}`);\n      unitText.setAttribute('y', '8');\n      unitText.setAttribute('font-size', '9px');\n      unitText.setAttribute('fill', 'var(--maths-kit-ruler-unit-text, #666)');\n      unitText.setAttribute('font-family', 'Arial, sans-serif');\n      unitText.setAttribute('font-style', 'italic');\n      svg.appendChild(unitText);\n    }\n\n    mark.appendChild(svg);\n  }\n\n  setActive(isActive: boolean) {\n    this._isActive = isActive;\n    if (isActive) {\n      this.triangleView.style.pointerEvents = 'auto';\n      if (this.angleInput) {\n        this.angleInput.style.pointerEvents = 'auto';\n      }\n    } else {\n      this.triangleView.style.pointerEvents = 'none';\n      if (this.angleInput) {\n        this.angleInput.style.pointerEvents = 'none';\n      }\n    }\n  }\n\n  private createDeleteBtn() {\n    this.deleteBtn.classList.add('maths-kit-math-kit-btn-btn');\n    \n    // 应用内联样式\n    Object.assign(this.deleteBtn.style, {\n      position: 'absolute',\n      top: '40px',\n      left: '20%',\n      width: '20px',\n      height: '20px',\n      transform: 'translateY(-50%) scale(1) rotate(45deg)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n    });\n    \n    // 添加删除图标\n    this.deleteBtn.textContent = '×';\n    this.triangleView.appendChild(this.deleteBtn);\n  }\n\n  private createRotateBtn() {\n    this.rotateBtn.classList.add('maths-kit-math-kit-btn-btn');\n    \n    // 应用内联样式\n    Object.assign(this.rotateBtn.style, {\n      position: 'absolute',\n      top: '40px',\n      right: '25%',\n      width: '20px',\n      height: '20px',\n      transform: 'translateY(-50%) scale(1)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n    });\n    \n    // 添加旋转图标\n    this.rotateBtn.textContent = '↻';\n    this.rotateBtn.setAttribute('data-type', 'Rotate');\n    this.triangleView.appendChild(this.rotateBtn);\n  }\n\n  private createStretchBtn() {\n    this.stretchBtn = document.createElement('div');\n    this.stretchBtn.classList.add('maths-kit-math-kit-btn-btn');\n    \n    // 应用内联样式\n    Object.assign(this.stretchBtn.style, {\n      position: 'absolute',\n      top: '40px',\n      left: '55%',\n      width: '20px',\n      height: '20px',\n      transform: 'translateY(-50%) scale(1) rotate(-90deg)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n    });\n    \n    // 添加拉伸图标\n    this.stretchBtn.textContent = '⇥';\n    this.stretchBtn.setAttribute('data-type', 'Stretch');\n    this.triangleView.appendChild(this.stretchBtn);\n  }\n\n  private createAngleInput() {\n    this.angleInput.type = 'text';\n    this.angleInput.classList.add('maths-kit-angle-input');\n    \n    // 应用内联样式\n    Object.assign(this.angleInput.style, {\n      position: 'absolute',\n      top: '40px',\n      left: '40%',\n      transform: 'translate(-50%, -50%)',\n      width: '60px',\n      height: '24px',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '1px solid var(--maths-kit-math-kit-btn-border, #eee)',\n      borderRadius: '4px',\n      fontSize: '12px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      outline: 'none',\n      opacity: '0',\n      pointerEvents: 'none',\n      zIndex: '1001',\n    });\n    \n    // 设置初始值\n    this.updateAngleDisplay(0);\n    this.triangleView.appendChild(this.angleInput);\n  }\n\n  private onAngleInputFocusHandler = () => {\n    this.angleInput.select();\n  };\n\n  private onAngleInputBlurHandler = () => {\n    this.angleInput.style.opacity = '0';\n    this.angleInput.style.pointerEvents = 'none';\n    this.applyAngleFromInput();\n  };\n\n  private onAngleInputKeyDownHandler = (e: KeyboardEvent) => {\n    if (e.key === 'Enter') {\n      this.angleInput.blur();\n    } else if (e.key === 'Escape') {\n      this.angleInput.value = this.getCurrentAngle().toString();\n      this.angleInput.blur();\n    }\n  };\n\n  private updateAngleDisplay = (angle: number) => {\n    this.angleInput.value = `${angle.toFixed(1)}°`;\n  };\n\n  private getCurrentAngle(): number {\n    // 从状态矩阵中提取旋转角度，而不是显示矩阵\n    const stateMatrix = new Matrix2D(...this.state.matrix);\n    const [a, b] = stateMatrix.toArray();\n    let angle = Math.round(Math.atan2(b, a) * (180 / Math.PI) * 100) / 100;\n    // 将角度转换为与 getAngleByPoints 一致的方向和范围\n    angle = -angle; // 取负值以匹配 getAngleByPoints 的方向\n    \n    // 确保角度在 0-360 范围内\n    if (angle < 0) {\n      angle += 360;\n    }\n    return angle;\n  }\n\n  private applyAngleFromInput() {\n    const value = this.angleInput.value.replace('°', '').trim();\n    const targetAngle = parseFloat(value);\n    \n    if (!isNaN(targetAngle)) {\n      // 获取当前角度\n      const currentAngle = this.getCurrentAngle();\n      \n      // 计算需要旋转的角度差\n      let angleDiff = targetAngle - currentAngle;\n      \n      // 确保角度差在合理范围内\n      if (angleDiff > 180) {\n        angleDiff -= 360;\n      } else if (angleDiff < -180) {\n        angleDiff += 360;\n      }\n      console.log('偏移计算:angleDiff', angleDiff);\n      // 应用旋转角度差\n      const angleInRadians = (angleDiff * Math.PI) / 180;\n      const rotationMatrix = createRotationMatrix(angleInRadians);\n      const currentMatrix = this.getDomMatrix();\n      const newMatrix = composeTransforms(currentMatrix, rotationMatrix); \n      this.updateStateMatrix(newMatrix);\n    } else {\n      // 如果输入无效，恢复当前角度\n      this.updateAngleDisplay(this.getCurrentAngle());\n    }\n  }\n\n  // 添加鼠标悬停显示输入框的功能\n  private showAngleInput = () => {\n    this.hideLineLength();\n    this.angleInput.style.opacity = '1';\n    this.angleInput.style.pointerEvents = this._isActive ? 'auto' : 'none';\n    this.updateAngleDisplay(this.getCurrentAngle());\n  };\n\n  private hideAngleInput = () => {\n    if (document.activeElement !== this.angleInput) {\n      this.angleInput.style.opacity = '0';\n      this.angleInput.style.pointerEvents = 'none';\n    }\n  };\n\n  showLineLength(number: number): void {\n    this.hideAngleInput();\n    this.lineLength.style.display = 'block';\n    // 已知道number是px，需要转换为mm\n    // 1mm = 96/25.4 像素\n    const cm = number * MM_PER_PIXELS / 10;\n    this.lineLength.textContent = `${cm.toFixed(1)}cm`;\n  }\n\n  hideLineLength(): void {\n    this.lineLength.style.display = 'none';\n  }\n\n  private createLineLength() {\n    this.lineLength = document.createElement('div');\n    this.lineLength.classList.add('maths-kit-line-lenth');\n    // 应用内联样式\n    Object.assign(this.lineLength.style, {\n      position: 'absolute',\n      top: '40px',\n      left: '40%',\n      transform: 'translate(-50%, -50%)',\n      width: '60px',\n      height: '24px',\n      lineHeight: '24px',\n      fontSize: '12px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      outline: 'none',\n      zIndex: '1001',\n      pointerEvents: 'none',\n    });\n    this.triangleView.appendChild(this.lineLength);\n  }\n}","import { isNumber, throttle } from 'lodash';\nimport { MathsKitManager } from '../manager';\nimport {  MarkCircle, MathsKit, MathsKitOptions } from '../mathsKit';\nimport { MathsKitElement, MathsKitType } from '../types';\nimport Vec2d, { CircleSegment, decomposeMatrix, LineSegment, Matrix2D, Point2d } from '../utils';\n\n\nexport type ProtractorElement = HTMLDivElement;\n\nexport const angle_radian = -1;\n\nexport class ProtractorTool extends MathsKit {\n\n  showLineLength(_number: number): void {\n    // throw new Error('Method not implemented.');\n  }\n  hideLineLength(): void {\n    // throw new Error('Method not implemented.');\n  }\n  protected markLines: MarkCircle[] = [];\n  private deleteBtn: HTMLDivElement = document.createElement('div');\n  private rotateBtn: HTMLDivElement = document.createElement('div');\n  private angleBtnLeft: HTMLDivElement = document.createElement('div');\n  private angleBtnRight: HTMLDivElement = document.createElement('div');\n  private stretchBtn!: HTMLDivElement;\n  private elementContent!: HTMLDivElement;\n  private circleMark!: HTMLDivElement;\n  private tragetAngleBtn?: HTMLDivElement;\n  private originZeroPoint?: Point2d;\n  private originalEventPoint?: Point2d;\n  private originAnglePoint?: Point2d;\n\n  bindElement(element: MathsKitElement, type: MathsKitType) {\n    this.element.classList.add('maths-kit', `maths-kit-${type}`, `maths-kit-${this.manager.theme}`);\n    this.manager.container.appendChild(element);\n  }\n\n  private bindElementContent(element: MathsKitElement){\n    this.elementContent = document.createElement('div');\n    this.elementContent.classList.add('maths-kit-content');\n    this.elementContent.setAttribute('data-id', this.id);\n    element.appendChild(this.elementContent);\n  }\n  \n  constructor(options: MathsKitOptions, manager: MathsKitManager) {\n    super(options, manager);\n    this.bindElementContent(this.element);\n  }\n\n  init(): void {\n    this.circleMark = this.createMark(this.elementContent, 'circle');\n    this.createAngleBtnLeft();\n    this.createAngleBtnRight();\n    this.createDeleteBtn();\n    this.createRotateBtn();\n    this.createStretchBtn();\n    this.bindEvent();\n    this.render();\n  }\n\n  onDragStart(): void {\n    this.toTop();\n  }\n\n  onDragDoing(): void {}\n\n  onDragEnd(matrix: Matrix2D): void {\n    this.updateStateMatrix(matrix);\n  }\n\n  onRotateStart(_originAngle: number): void {\n    this.toTop();\n  }\n\n  onRotateDoing(_angle: number): void {\n  }\n\n  onRotateEnd(matrix: Matrix2D): void {\n    this.updateStateMatrix(matrix);\n  }\n\n\n  getStretchDirection(): 'x' | 'y' {\n    return 'y';\n  }\n\n  onStretchStart(): void {\n    this.toTop();\n    this.thottled.cancel();\n  }\n\n  private thottled = throttle((_width: number): void => {\n    this.element.style.width = `${_width}px`;\n    this.elementContent.style.width = `${_width}px`;\n    this.elementContent.style.height = `${this.computeHeight(_width)}px`;\n    this.renderMark();\n  },50);\n\n  onStretchDoing = (_width: number): void => {\n    this.thottled(_width);    \n  };\n\n  onStretchEnd(width: number): void {\n    this.thottled.cancel();\n    // 更新三角形的宽度\n    this.manager.update(this.id, { width: width });\n  }\n\n  /**\n   * 获取旋转中心点, 坐标必须相对于容器左上角, 旋转中心点是左上角\n   * @returns \n   */\n  getRotateCenterPoint = () => {\n    const { x, y } = this.state;\n    const container = this.manager.container;\n    const containerWidth = container.clientWidth;\n    const containerHeight = container.clientHeight;\n    const pxX = x * containerWidth;\n    const pxY = y * containerHeight;\n    const domMatrix = this.getDomMatrix();\n    const { translateX, translateY } = decomposeMatrix(domMatrix);\n    const circleCenterPoint = new Vec2d(pxX + translateX, pxY + translateY);\n    // 返回 Point2d 对象\n    return new Point2d(circleCenterPoint.x, circleCenterPoint.y);\n  };\n\n  getMarkLines(): MarkCircle[] {\n    const { width } = this.state;\n    const { scaleY, rotation } = decomposeMatrix(this.getDomMatrix());\n    const height = this.computeHeight(width);\n    const baseHeight = height * scaleY;\n    // 计算圆心\n    const circleCenterPoint = this.getRotateCenterPoint();\n    const circleSegment = new CircleSegment(circleCenterPoint, baseHeight, 0, 180 * Math.PI / 180, angle_radian);\n    circleSegment.rotate(rotation);\n\n    const markLines: MarkCircle[] = [\n      {\n        axis: 'circle',\n        circle: circleSegment,\n      },\n    ];\n    return markLines;\n  }\n\n  private bindEvent() {\n    this.deleteBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.deleteBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    this.deleteBtn.addEventListener('click', this.onDeleteBtnClickHandler);\n\n    this.stretchBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.stretchBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    \n    this.rotateBtn.addEventListener('mouseenter', this.onBtnMouseEnterHandler);\n    this.rotateBtn.addEventListener('mouseleave', this.onBtnMouseLeaveHandler);\n    \n    if (this.angleBtnLeft && this.angleBtnLeft.firstElementChild) {\n      (this.angleBtnLeft.firstElementChild as HTMLDivElement).addEventListener('pointerdown', this.rotateAngleBtnHandle);\n    }\n\n    if (this.angleBtnRight && this.angleBtnRight.firstElementChild) {\n      (this.angleBtnRight.firstElementChild as HTMLDivElement).addEventListener('pointerdown', this.rotateAngleBtnHandle);\n    }\n  }\n\n  private unbindEvent() {\n    if (this.deleteBtn) {\n      this.deleteBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.deleteBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n      this.deleteBtn.removeEventListener('click', this.onDeleteBtnClickHandler);\n    }\n\n    if (this.stretchBtn) {\n      this.stretchBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.stretchBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n    }\n    \n    if (this.rotateBtn) {\n      this.rotateBtn.removeEventListener('pointerenter', this.onBtnMouseEnterHandler);\n      this.rotateBtn.removeEventListener('pointerleave', this.onBtnMouseLeaveHandler);\n    }\n    if (this.angleBtnLeft && this.angleBtnLeft.firstElementChild) {\n      (this.angleBtnLeft.firstElementChild as HTMLDivElement).removeEventListener('pointerdown', this.rotateAngleBtnHandle);\n    }\n    if (this.angleBtnRight && this.angleBtnRight.firstElementChild) {\n      (this.angleBtnRight.firstElementChild as HTMLDivElement).removeEventListener('pointerdown', this.rotateAngleBtnHandle);\n    }\n    this.thottled.cancel();\n  }\n\n  private computAngle(e: PointerEvent) {\n    if (!this.originalEventPoint || !this.tragetAngleBtn || !this.originZeroPoint || !this.originAnglePoint) {\n      return;\n    }\n    const currentPoint = new Point2d(e.pageX, e.pageY);\n    const offsetPoint = Point2d.Sub(this.originalEventPoint, currentPoint);\n    const currentAnglePoint = Point2d.Sub(this.originAnglePoint, offsetPoint);\n    const angle = Math.round(this.getRotateCenterPoint().getAngleByPoints(currentAnglePoint, this.originZeroPoint));\n    return angle;\n  }\n\n  private onAngleBtnPointerMoveHandler = (e: PointerEvent) => {\n    e.stopPropagation();\n    if (!this.originZeroPoint || !this.originalEventPoint || !this.tragetAngleBtn || !this.originAnglePoint) {\n      return;\n    }\n    const { custom } = this.state;\n    const { startAngle, endAngle } = custom || {};\n    if (!isNumber(startAngle) || !isNumber(endAngle)) {\n      return;\n    }\n    const angle = this.computAngle(e);\n    if (!isNumber(angle)) {\n      return;\n    }\n    const type = this.tragetAngleBtn.getAttribute('data-type') as 'left' | 'right';\n    if(type === 'left') {\n      this.angleBtnLeft.style.transform = `rotate(${angle * angle_radian}deg)`;\n      (this.angleBtnLeft.firstElementChild as HTMLDivElement).textContent = `${Math.abs(angle - startAngle)}°`;\n      (this.angleBtnRight.firstElementChild as HTMLDivElement).textContent = `${Math.abs(angle - startAngle)}°`;\n    } else {\n      this.angleBtnRight.style.transform = `rotate(${angle * angle_radian}deg)`;\n      (this.angleBtnLeft.firstElementChild as HTMLDivElement).textContent = `${Math.abs(angle - endAngle)}°`;\n      (this.angleBtnRight.firstElementChild as HTMLDivElement).textContent = `${Math.abs(angle - endAngle)}°`;\n    }\n    this.tragetAngleBtn.style.transform = `translateY(-50%) rotate(${angle}deg)`;\n  };\n  private stopAngleBtnPointerMoveHandler = (e: PointerEvent) => {\n    e.stopPropagation();\n    if (!this.originalEventPoint || !this.tragetAngleBtn) {\n      return;\n    }\n    const { custom } = this.state;\n    const { startAngle, endAngle } = custom || {};\n    if (!isNumber(startAngle) || !isNumber(endAngle)) {\n      return;\n    }\n    const angle = this.computAngle(e);\n    if (!isNumber(angle)) {\n      return;\n    }\n    const type = this.tragetAngleBtn.getAttribute('data-type') as 'left' | 'right';\n    document.removeEventListener('pointermove', this.onAngleBtnPointerMoveHandler, true);\n    document.removeEventListener('pointerup', this.stopAngleBtnPointerMoveHandler, true);\n    document.removeEventListener('pointercancel', this.stopAngleBtnPointerMoveHandler, true);\n    this.tragetAngleBtn.style.cursor = 'pointer';\n    this.circleMark.style.pointerEvents = this._isActive ? 'auto' : 'none';\n    this.tragetAngleBtn = undefined;\n    this.originalEventPoint = undefined;\n    this.originZeroPoint = undefined;\n    // let currentAngle = 0;\n    if(type === 'left') {\n      // currentAngle = Math.max(0, Math.min(180, endAngle + angle));\n      this.manager.update(this.id, { custom: { startAngle, endAngle: angle } });\n    } else {\n      // currentAngle = Math.max(0, Math.min(180, startAngle + angle));\n      this.manager.update(this.id, { custom: { startAngle: angle, endAngle } });\n    }\n  };\n  private getCurrentAngle(): number {\n    // 从状态矩阵中提取旋转角度，而不是显示矩阵\n    const stateMatrix = new Matrix2D(...this.state.matrix);\n    const [a, b] = stateMatrix.toArray();\n    let angle = Math.round(Math.atan2(b, a) * (180 / Math.PI) * 100) / 100;\n    // 将角度转换为与 getAngleByPoints 一致的方向和范围\n    angle = -angle; // 取负值以匹配 getAngleByPoints 的方向\n    \n    // 确保角度在 0-360 范围内\n    if (angle < 0) {\n      angle += 360;\n    }\n    return angle;\n  }\n  private rotateAngleBtnHandle = (e: PointerEvent) => {\n    e.stopPropagation();\n    const target = e.currentTarget as HTMLDivElement;\n    this.tragetAngleBtn = target;\n    const { x, y, width, custom } = this.state;\n    if (!isNumber(custom?.startAngle) || !isNumber(custom?.endAngle)) {\n      return;\n    }\n    const container = this.manager.container;\n    const containerWidth = container.clientWidth;\n    const containerHeight = container.clientHeight;\n    const pxX = x * containerWidth;\n    const pxY = y * containerHeight;\n    const { translateX, translateY, scaleX } = decomposeMatrix(this.getDomMatrix());\n    const baseWidth = width * scaleX;\n    this.originZeroPoint = new Point2d(pxX + baseWidth / 2, pxY);\n    this.originZeroPoint.add(new Vec2d(translateX, translateY));\n\n    const currentAngle = this.getCurrentAngle();\n    const angleInRadians = (currentAngle * Math.PI) / 180;\n    const rotateCenterPoint = this.getRotateCenterPoint();\n    this.originZeroPoint.rotWith(rotateCenterPoint, -angleInRadians);\n    this.originalEventPoint = new Point2d(e.pageX, e.pageY);\n    const type = this.tragetAngleBtn.getAttribute('data-type') as 'left' | 'right';\n    const angle = type === 'left' ? custom?.endAngle : custom?.startAngle;\n    this.originAnglePoint = Point2d.RotWith(this.originZeroPoint, rotateCenterPoint, (angle * Math.PI) / 180 * angle_radian);\n    document.addEventListener('pointermove', this.onAngleBtnPointerMoveHandler, true);\n    document.addEventListener('pointerup', this.stopAngleBtnPointerMoveHandler, true);\n    document.addEventListener('pointercancel', this.stopAngleBtnPointerMoveHandler, true);\n    this.tragetAngleBtn.style.cursor = 'none';\n    this.circleMark.style.pointerEvents = 'none';\n  };\n\n  destroy(): void {\n    this.circleMark.remove();\n    this.elementContent.remove();\n    super.destroy();\n    this.unbindEvent();\n  }\n\n  private onDeleteBtnClickHandler = (e: MouseEvent) => {\n    e.stopPropagation();\n    this.manager.remove(this.id);\n  };\n\n  private onBtnMouseEnterHandler = (e: MouseEvent) => {\n    const target = e.currentTarget as HTMLElement;\n    target.style.background = 'var(--maths-kit-math-kit-btn-hover-bg, #f0f4ff)';\n    if (e.target === this.stretchBtn) {\n      target.style.transform = 'translateX(-50%) scale(1.1) rotate(-90deg)';\n    } else {\n      target.style.transform = 'scale(1.1)';\n    }\n  };\n\n  private onBtnMouseLeaveHandler = (e: MouseEvent) => {\n    const target = e.currentTarget as HTMLElement;\n    target.style.background = 'var(--maths-kit-math-kit-btn-bg, #fff)';\n    if (e.target === this.stretchBtn) {\n      target.style.transform = 'translateX(-50%) scale(1) rotate(-90deg)';\n    } else {\n      target.style.transform = 'scale(1)';\n    }\n  };\n\n  createElement(): HTMLDivElement {\n    const element = document.createElement('div');\n    // 确保容器有正确的定位上下文\n    element.style.position = 'relative';\n    element.style.transformOrigin = 'left bottom';\n    element.style.touchAction = 'none';\n\n    return element;\n  }\n\n  private createMark(element: HTMLDivElement, position: 'circle') {\n    const mark = document.createElement('div');\n    mark.classList.add('maths-kit-protractor-mark', position);\n    // 应用内联样式\n    Object.assign(mark.style, {\n      position: 'absolute',\n      top: '0',\n      left: '0',\n      right: '0',\n      bottom: '0',\n      border: 'none',\n      backgroundColor: 'var(--maths-kit-ruler-bg, rgba(255, 255, 255, 0.8))',\n      pointerEvents: this._isActive ? 'auto' : 'none',\n      cursor: 'pointer',\n      overflow: 'hidden',\n    });\n    mark.setAttribute('data-type', 'Drag');\n    mark.setAttribute('data-id', this.id);\n    element.appendChild(mark);\n    return mark;\n  }\n\n  private computeHeight(width: number) {\n    return width / 2;\n  }\n\n  render(): void {\n    const state = this.state;\n    const domMatrix = this.getDomMatrix();\n    const height = this.computeHeight(state.width);\n    const width = state.width;\n\n    const style = {\n      position: 'absolute',\n      left: `${state.x * 100}%`,\n      top: `${state.y * 100}%`,\n      height: '0',\n      width: `${width}px`,\n      minWidth: '300px',\n      transform: domMatrix.toCSSTransform(),\n      zIndex: state.zIndex,\n      boxSizing: 'content-box',\n    };\n    Object.assign(this.element.style, style);\n\n    const elementContentStyle = {\n      position: 'absolute',\n      bottom: '0',\n      left: '0',\n      transform: 'translateX(-50%)',\n      transformOrigin: 'left bottom',\n      width: `${width}px`,\n      height: `${height}px`,\n      minWidth: '300px',\n      minHeight: `${this.computeHeight(300)}px`,\n      boxSizing: 'border-box',\n      border: 'none',\n      pointerEvents: 'none',\n    };\n    Object.assign(this.elementContent.style, elementContentStyle);\n\n    this.angleBtnLeft.style.width = `${width / 2 + 50}px`;\n    this.angleBtnRight.style.width = `${width / 2 + 50}px`;\n\n    if (state.custom && isNumber(state.custom.startAngle) && isNumber(state.custom.endAngle) && this.angleBtnLeft.firstElementChild && this.angleBtnRight.firstElementChild) {\n      const { startAngle, endAngle } = state.custom;\n      this.angleBtnLeft.style.transform = `rotate(${endAngle * angle_radian}deg)`;\n      this.angleBtnRight.style.transform = `rotate(${startAngle * angle_radian}deg)`;\n      (this.angleBtnLeft.firstElementChild as HTMLDivElement).style.transform = `translateY(-50%) rotate(${endAngle}deg)`;\n      (this.angleBtnRight.firstElementChild as HTMLDivElement).style.transform = `translateY(-50%) rotate(${startAngle}deg)`;\n      const startAngleText = Math.abs(startAngle - endAngle);\n      (this.angleBtnLeft.firstElementChild as HTMLDivElement).textContent = `${startAngleText}°`;\n      (this.angleBtnRight.firstElementChild as HTMLDivElement).textContent = `${startAngleText}°`;\n    }\n\n    // 使用setTimeout确保DOM完全渲染后再获取尺寸和重新绑定事件\n    setTimeout(() => {\n      this.renderMark();\n    }, 0);\n\n  }\n  private renderMark() {\n    this.renderMarkAtPosition(this.circleMark);\n  }\n\n  private renderMarkAtPosition(mark: HTMLDivElement) {\n    // 清空现有内容\n    mark.innerHTML = '';\n\n    const svgWidth = this.elementContent.offsetWidth;\n    const svgHeight = this.elementContent.offsetHeight;\n    mark.style.width = `${svgWidth}px`; // 减少高度，因为刻度线变短了\n    mark.style.height = `${svgHeight}px`;\n    mark.style.borderRadius = `${svgHeight}px ${svgHeight}px 0 0`;\n    \n    const circleCenter = new Point2d(svgWidth / 2, svgHeight);\n    // 创建SVG容器\n    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    svg.setAttribute('width', `${svgWidth}`);\n    svg.setAttribute('height', `${svgHeight}`); // 减少SVG高度\n    svg.style.position = 'absolute';\n    svg.style.top = '0';\n    svg.style.left = '0';\n    svg.style.pointerEvents = 'none';\n\n    const outDonutRadius = 18;\n    const middleDonutRadius = 26;\n    const innerDonutRadius = 16;\n    const innerCircleRadius = 30;\n    // 添加半透明背景矩形\n    const backgroundCircle1 = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n    backgroundCircle1.setAttribute('cx', `${circleCenter.x}`);\n    backgroundCircle1.setAttribute('cy', `${circleCenter.y}`);\n    backgroundCircle1.setAttribute('r', `${svgHeight - outDonutRadius / 2}`);\n    backgroundCircle1.setAttribute('stroke', 'var(--maths-kit-ruler-mark-bg, rgba(240, 240, 240, 0.8))');\n    backgroundCircle1.setAttribute('stroke-width', `${outDonutRadius}`);\n    backgroundCircle1.setAttribute('fill', 'transparent');\n\n    const backgroundCircle2 = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n    backgroundCircle2.setAttribute('cx', `${circleCenter.x}`);\n    backgroundCircle2.setAttribute('cy', `${circleCenter.y}`);\n    backgroundCircle2.setAttribute('r', `${svgHeight - middleDonutRadius - outDonutRadius - innerDonutRadius * 1.5}`);\n    backgroundCircle2.setAttribute('stroke', 'var(--maths-kit-ruler-mark-bg, rgba(240, 240, 240, 0.8))');\n    backgroundCircle2.setAttribute('stroke-width', `${innerDonutRadius}`);\n    backgroundCircle2.setAttribute('fill', 'transparent');\n\n    const centerCircle = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n    centerCircle.setAttribute('cx', `${circleCenter.x}`);\n    centerCircle.setAttribute('cy', `${circleCenter.y}`);\n    centerCircle.setAttribute('r', '1');\n    centerCircle.setAttribute('fill', 'var(--maths-kit-ruler-major-mark, #000)');\n\n    const centerCircle1 = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n    centerCircle1.setAttribute('cx', `${circleCenter.x}`);\n    centerCircle1.setAttribute('cy', `${circleCenter.y}`);\n    centerCircle1.setAttribute('r', '2');\n    centerCircle1.setAttribute('stroke-width', '1');\n    centerCircle1.setAttribute('stroke', 'var(--maths-kit-ruler-medium-mark, #666)');\n    centerCircle1.setAttribute('fill', 'transparent');\n\n    svg.append(backgroundCircle1, backgroundCircle2, centerCircle, centerCircle1);\n    // 刻度线数量\n    const totalMarks = 180;\n    // 刻度线宽度：1px\n    const MARK_WIDTH_PX = 1;\n\n    const angleLines = Point2d.GetSemicircleStroke(circleCenter, new Point2d(circleCenter.x + svgHeight, circleCenter.y), angle_radian, totalMarks);\n\n    // 创建刻度线和数值\n    for (let i = 0; i <= totalMarks; i++) {\n      \n      // 确定刻度线高度\n      let markHeight = 5; // 默认小刻度高度\n      // 是否为大刻度\n      let isMajorMark = false;\n      // 是否为中等刻度\n      let isMediumMark = false;\n      \n      // 每10角度为大刻度\n      if (i % 10 === 0) {\n        markHeight = 18;\n        isMajorMark = true;\n      } else if (i % 5 === 0) {\n        // 每5mm为中等刻度\n        markHeight = 10;\n        isMediumMark = true;\n      }\n      // 创建刻度线\n      const x1 = angleLines[i].x;\n      const y1 = angleLines[i].y;\n      const lineSegment = new LineSegment(new Vec2d(x1, y1), circleCenter);\n      // 计算在lineSegment上距离lineSegment起点markHeight的点\n      const t = lineSegment.length > 0 ? markHeight / lineSegment.length : 0;\n      const point = lineSegment.getPointAt(t);\n      const x2 = point.x;\n      const y2 = point.y;\n      const line1 = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n      line1.setAttribute('x1', `${x1}`);\n      line1.setAttribute('y1', `${y1}`);\n      line1.setAttribute('x2', `${x2}`);\n      line1.setAttribute('y2', `${y2}`);\n      line1.setAttribute('stroke', isMajorMark ? 'var(--maths-kit-ruler-major-mark, #000)' : isMediumMark ? 'var(--maths-kit-ruler-medium-mark, #666)' : 'var(--maths-kit-ruler-minor-mark, #999)');\n      line1.setAttribute('stroke-width', `${MARK_WIDTH_PX}`);\n      line1.setAttribute('stroke-opacity', isMajorMark ? '1' : isMediumMark ? '0.8' : '0.6');\n      svg.appendChild(line1);\n      // 为大刻度添加数值标签\n      if (isMajorMark) {\n        const t1 = lineSegment.length > 0 ? (middleDonutRadius + outDonutRadius + innerDonutRadius) / lineSegment.length : 0;\n        const t4 = lineSegment.length > 0 ? (lineSegment.length - innerCircleRadius) / lineSegment.length : 0;\n        const point1 = lineSegment.getPointAt(t1);\n        const point4 = lineSegment.getPointAt(t4);\n        const line2 = document.createElementNS('http://www.w3.org/2000/svg', 'line');\n        line2.setAttribute('x1', `${point1.x}`);\n        line2.setAttribute('y1', `${point1.y}`);\n        line2.setAttribute('x2', `${point4.x}`);\n        line2.setAttribute('y2', `${point4.y}`);\n        line2.setAttribute('stroke', 'var(--maths-kit-ruler-major-mark, #000)');\n        line2.setAttribute('stroke-width', `${MARK_WIDTH_PX}`);\n\n        const t2 = lineSegment.length > 0 ? (outDonutRadius + middleDonutRadius / 2) / lineSegment.length : 0;\n        const ponitText = lineSegment.getPointAt(t2);\n        const text = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n        text.textContent = `${i}`;\n        text.setAttribute('x', `${ponitText.x}`);\n        text.setAttribute('y', `${ponitText.y}`);\n        text.setAttribute('text-anchor', 'middle');\n        text.setAttribute('font-size', '11px');\n        text.setAttribute('fill', 'var(--maths-kit-ruler-text, #000)');\n        text.setAttribute('font-family', 'Arial, sans-serif');\n\n        const t3 = lineSegment.length > 0 ? (outDonutRadius + middleDonutRadius + innerDonutRadius / 2) / lineSegment.length : 0;\n        const ponitText1 = lineSegment.getPointAt(t3);\n        const text1 = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n        text1.textContent = `${totalMarks - i}`;\n        text1.setAttribute('x', `${ponitText1.x}`);\n        text1.setAttribute('y', `${ponitText1.y}`);\n        text1.setAttribute('text-anchor', 'middle');\n        text1.setAttribute('font-size', '11px');\n        text1.setAttribute('fill', 'var(--maths-kit-ruler-text, #000)');\n        text1.setAttribute('font-family', 'Arial, sans-serif');\n        svg.append(line2, text, text1);\n      }\n    }\n    \n    mark.appendChild(svg);\n  }\n\n  setActive(isActive: boolean) {\n    this._isActive = isActive;\n    if (isActive) {\n      this.circleMark.style.pointerEvents = 'auto';\n      if (this.rotateBtn) {\n        this.rotateBtn.style.pointerEvents = 'auto';\n      }\n      if (this.stretchBtn) {\n        this.stretchBtn.style.pointerEvents = 'auto';\n      }\n      if (this.deleteBtn) {\n        this.deleteBtn.style.pointerEvents = 'auto';\n      }\n      if (this.angleBtnLeft && this.angleBtnLeft.firstElementChild) {\n        (this.angleBtnLeft.firstElementChild as HTMLDivElement).style.pointerEvents = 'auto';\n      }\n      if (this.angleBtnRight && this.angleBtnRight.firstElementChild) {\n        (this.angleBtnRight.firstElementChild as HTMLDivElement).style.pointerEvents = 'auto';\n      }\n    } else {\n      this.circleMark.style.pointerEvents = 'none';\n      if (this.rotateBtn) {\n        this.rotateBtn.style.pointerEvents = 'none';\n      }\n      if (this.stretchBtn) {\n        this.stretchBtn.style.pointerEvents = 'none';\n      }\n      if (this.deleteBtn) {\n        this.deleteBtn.style.pointerEvents = 'none';\n      }\n      if (this.angleBtnLeft && this.angleBtnLeft.firstElementChild) {\n        (this.angleBtnLeft.firstElementChild as HTMLDivElement).style.pointerEvents = 'none';\n      }\n      if (this.angleBtnRight && this.angleBtnRight.firstElementChild) {\n        (this.angleBtnRight.firstElementChild as HTMLDivElement).style.pointerEvents = 'none';\n      }\n    }\n  }\n\n  private createAngleBtnLeft() {\n    this.angleBtnLeft.classList.add('maths-kit-math-kit-angle-btn', 'left');\n    // 应用内联样式\n    Object.assign(this.angleBtnLeft.style, {\n      position: 'absolute',\n      bottom: '0',\n      left: '0',\n      height: '1px',\n      background: 'var(--maths-kit-math-kit-angle-btn-bg, #00A870)',\n      border: 'none',\n      fontSize: '12px',\n      zIndex: '2',\n      transformOrigin: 'left center',\n      pointerEvents: 'none',\n    });\n    const child = document.createElement('div');\n    Object.assign(child.style, {\n      position: 'absolute',\n      right: '0',\n      top: '50%',\n      transform: 'translateY(-50%)',\n      width: '30px',\n      height: '30px',\n      border: '1px solid var(--maths-kit-math-kit-angle-btn-bg, #00A870)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '30px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      zIndex: '1000',\n      pointerEvents: this._isActive ? 'auto' : 'none',\n    });\n    child.setAttribute('data-type', 'left');\n    this.angleBtnLeft.appendChild(child);\n    this.element.appendChild(this.angleBtnLeft);\n  }\n\n  private createAngleBtnRight() {\n    this.angleBtnRight.classList.add('maths-kit-math-kit-angle-btn', 'right');\n    // 应用内联样式\n    Object.assign(this.angleBtnRight.style, {\n      position: 'absolute',\n      bottom: '0',\n      left: '0',\n      height: '1px',\n      background: 'var(--maths-kit-math-kit-angle-btn-bg, #00A870)',\n      border: 'none',\n      fontSize: '12px',\n      zIndex: '2',\n      transformOrigin: 'left center',\n      pointerEvents: 'none',\n    });\n    const child = document.createElement('div');\n    Object.assign(child.style, {\n      position: 'absolute',\n      right: '0',\n      top: '50%',\n      transform: 'translateY(-50%)',\n      width: '30px',\n      height: '30px',\n      border: '1px solid var(--maths-kit-math-kit-angle-btn-bg, #00A870)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '30px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      zIndex: '1000',\n      pointerEvents: this._isActive ? 'auto' : 'none',\n    });\n    child.setAttribute('data-type', 'right');\n    this.angleBtnRight.appendChild(child);\n    this.element.appendChild(this.angleBtnRight);\n  }\n\n  private createDeleteBtn() {\n    this.deleteBtn.classList.add('maths-kit-math-kit-angle-btn');\n    \n    // 应用内联样式\n    Object.assign(this.deleteBtn.style, {\n      position: 'absolute',\n      bottom: '15px',\n      left: '20%',\n      width: '20px',\n      height: '20px',\n      transform: 'scale(1)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n      pointerEvents: this._isActive ? 'auto' : 'none',\n    });\n    \n    // 添加删除图标\n    this.deleteBtn.textContent = '×';\n    this.elementContent.appendChild(this.deleteBtn);\n  }\n\n  private createRotateBtn() {\n    this.rotateBtn.classList.add('maths-kit-math-kit-btn-btn');\n    \n    // 应用内联样式\n    Object.assign(this.rotateBtn.style, {\n      position: 'absolute',\n      bottom: '15px',\n      right: '20%',\n      width: '20px',\n      height: '20px',\n      transform: 'scale(1)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n      pointerEvents: this._isActive ? 'auto' : 'none',\n    });\n    \n    // 添加旋转图标\n    this.rotateBtn.textContent = '↻';\n    this.rotateBtn.setAttribute('data-type', 'Rotate');\n    this.elementContent.appendChild(this.rotateBtn);\n  }\n\n  private createStretchBtn() {\n    this.stretchBtn = document.createElement('div');\n    this.stretchBtn.classList.add('maths-kit-math-kit-btn-btn');\n    \n    // 应用内联样式\n    Object.assign(this.stretchBtn.style, {\n      position: 'absolute',\n      top: '65px',\n      left: '50%',\n      width: '20px',\n      height: '20px',\n      transform: 'translateX(-50%) scale(1) rotate(-90deg)',\n      background: 'var(--maths-kit-math-kit-btn-bg, #fff)',\n      border: '2px solid var(--maths-kit-math-kit-btn-border, #fff)',\n      borderRadius: '50%',\n      cursor: 'pointer',\n      lineHeight: '19px',\n      textAlign: 'center',\n      color: 'var(--maths-kit-math-kit-btn-text, #000)',\n      fontSize: '12px',\n      fontWeight: 'bold',\n      boxShadow: '0 4px 12px 0 var(--maths-kit-math-kit-btn-shadow, rgba(0, 0, 0, 0.08))',\n      zIndex: '1000',\n      pointerEvents: this._isActive ? 'auto' : 'none',\n    });\n    \n    // 添加拉伸图标\n    this.stretchBtn.textContent = '⇥';\n    this.stretchBtn.setAttribute('data-type', 'Stretch');\n    this.elementContent.appendChild(this.stretchBtn);\n  }\n\n}","import { Matrix2D } from './utils';\n\ndeclare let __NAME__: string, __VERSION__: string;\nexport const pkg_version = __VERSION__;\nexport const pkg_name = __NAME__;\n\nexport const DEFAULT_MATHS_KIT_STATE = {\n  /** 元素的x坐标, 相对于container宽度的归一化数据 */\n  x: 0.3,\n  /** 元素的y坐标, 相对于container高度的归一化数据 */\n  y: 0.5,\n  /** 元素的宽度 */\n  width: 400,\n  /** 元素的矩阵, 用于计算元素的变换 */\n  matrix: new Matrix2D().toArray(),\n};","import { MarkCircle, MarkLine, MarkLineLike } from '../mathsKit';\nimport { MathsKitTool } from '../types';\nimport { GeometryUtils } from './geometry';\nimport { VecLike, Vec2d } from './Vec2d';\nimport { CircleSegment } from './CircleSegment';\n\nexport interface BindDrawOptions {\n  getGlobalScale:()=>number;\n  getInstances:()=> Map<string, MathsKitTool>;\n  activeDraw:(bol:boolean)=>void;\n  getForwardingTarget:()=>HTMLElement;\n  getStrokeWidth:()=>number;\n  getActiveManager:()=>boolean;\n}\n\nexport type ActiveMathsKit = (MarkLine | MarkCircle) & {\n  mathsKit: MathsKitTool;\n}\n\nexport class DrawManager {\n  /** 最小响应距离，单位px */\n  static readonly MIN_DISTANCE = 20;\n  static readonly eventForwardMap: Map<string, string[]> = new Map([\n    ['pointerdown', ['pointermove', 'pointerup']],\n    ['mousedown', ['mousemove', 'mouseup']],\n  ]);\n  private element: HTMLDivElement;\n  private options: BindDrawOptions;\n  private activeMathsKit: ActiveMathsKit | null = null;\n  private removeEventClockTimer: number | undefined = undefined;\n  private _isForwarding: boolean = false;\n  private startDrawPoint: Vec2d | null = null;\n\n  set isForwarding(isForwarding: boolean) {\n    this._isForwarding = isForwarding;\n    this.options.activeDraw(isForwarding);\n  }\n  get isForwarding(): boolean {\n    return this._isForwarding;\n  }\n\n  constructor(element:HTMLDivElement, options:BindDrawOptions) {\n    this.element = element;\n    this.options = options;\n    this.element.addEventListener('pointerdown', this.onPointerdown, true);\n    this.element.addEventListener('wheel', this.onWheel, true);\n  }\n\n  private onWheel = (e: WheelEvent) => {  \n    if (this.options.getActiveManager()) {\n      e.stopPropagation();\n      // todo 缩放功能后期实现\n      this.forwardEvent(e);\n      e.preventDefault();\n    }\n  };\n\n  private generateActiveMathsKit(point: VecLike) {\n    let minDistance = DrawManager.MIN_DISTANCE / this.options.getGlobalScale();\n    let minDistanceMathsKit: MathsKitTool | undefined = undefined;\n    let minDistanceMarkLine: MarkLineLike | undefined = undefined;\n    for (const instance of this.options.getInstances().values()) {\n      const markLines = instance.getMarkLines();\n      if (markLines.length > 0) {\n        for (const markLine of markLines) {\n          let distance = 0;\n          if (markLine.axis === 'circle') {\n            distance = GeometryUtils.pointToCircleDistance(point, (markLine as MarkCircle).circle);\n          } else {\n            distance = GeometryUtils.pointToLineDistance(point, (markLine as MarkLine).line);\n          }\n          if (distance < minDistance) {\n            minDistance = distance;\n            minDistanceMarkLine = markLine;\n            minDistanceMathsKit = instance;\n          }\n        }\n      }\n    }\n    if (minDistanceMarkLine && minDistanceMathsKit) {\n      this.activeMathsKit = {\n        ...minDistanceMarkLine,\n        mathsKit: minDistanceMathsKit,\n      };\n    } else {\n      this.activeMathsKit = null;\n    }\n  }\n  \n  private onPointerdown = (e:PointerEvent) => {\n    const currentTarget = e.target as HTMLElement;\n    if (!currentTarget) {\n      return;\n    }\n    if (currentTarget !== this.element) {\n      return;\n    }\n    this.options.getInstances().forEach(instance => {\n      instance.setActive(false);\n    });\n    this.generateActiveMathsKit(new Vec2d(e.offsetX, e.offsetY));\n    this.isForwarding = true;\n    if (!this.removeEventClockTimer) {\n      for (const [startEvent, events] of DrawManager.eventForwardMap.entries()) {\n        this.element.addEventListener(startEvent, this.onDrawContainerStartEventListener as EventListener);\n        for (const event of events) {\n          window.addEventListener(event, this.onDrawDocumentEventListener as EventListener, true);\n        }\n      }\n    }\n    if (this.removeEventClockTimer) {\n      clearTimeout(this.removeEventClockTimer);\n      this.removeEventClockTimer = undefined;\n    }\n  };\n\n  private onDrawContainerStartEventListener = (e: PointerEvent | MouseEvent) => {\n    if (e.target !== this.element) {\n      return;\n    }\n    e.stopPropagation();\n    this.onDrawEventListener(e);\n  };\n\n  private onDrawDocumentEventListener = (e: PointerEvent | MouseEvent) => {\n    if (!this.isForwarding) {\n      return;\n    }\n    if (e.target === this.options.getForwardingTarget()) {\n      return;\n    }\n    e.stopPropagation();\n    // if (e instanceof TouchEvent) {\n    //   if (e.type === 'touchend' && e.changedTouches.length > 1) {\n    //     this.forwardEvent(e);\n    //     return;\n    //   } else if (e.touches.length > 1) {\n    //     this.forwardEvent(e);\n    //     return;\n    //   }\n    // }\n    this.onDrawEventListener(e);\n    if (e.type === 'pointerup') {\n      this.onDrawEndHandler();\n    }\n  };\n\n  private onDrawEndHandler = () => {\n    if (this.removeEventClockTimer) {\n      clearTimeout(this.removeEventClockTimer);\n      this.removeEventClockTimer = undefined;\n    }\n    this.removeEventClockTimer = setTimeout(() => {\n      this.removeEventListener();\n    }, 100) as unknown as number;\n  };\n\n\n  private generateLinePoint(e: PointerEvent | MouseEvent, param: MarkLine, mathsKit: MathsKitTool) {\n    const { axis, direction, line } = param;\n    let offsetDistance = 0;\n    switch (direction) {\n      case 'bottom':\n      case 'left': {\n        offsetDistance = -this.options.getStrokeWidth() / 2 * this.options.getGlobalScale();\n        break;\n      } \n      case 'right': \n      case 'top':\n      case 'topLeftToBottomRight':\n      case 'topRightToBottomLeft':\n      {\n        offsetDistance = this.options.getStrokeWidth() / 2 * this.options.getGlobalScale();\n        break;\n      }\n    }\n    let clientPoint = new Vec2d(0, 0);\n    let screenPoint = new Vec2d(0, 0);\n    // if(e instanceof TouchEvent){\n    //   if (e.touches.length > 0) {\n    //     clientPoint = new Vec2d(e.touches[0].clientX, e.touches[0].clientY);\n    //     screenPoint = new Vec2d(e.touches[0].screenX, e.touches[0].screenY);\n    //   } else if (e.changedTouches.length > 0) {\n    //     clientPoint = new Vec2d(e.changedTouches[0].clientX, e.changedTouches[0].clientY);\n    //     screenPoint = new Vec2d(e.changedTouches[0].screenX, e.changedTouches[0].screenY);\n    //   }\n    // } else {\n    clientPoint = new Vec2d(e.clientX, e.clientY);\n    screenPoint = new Vec2d(e.screenX, e.screenY);\n    // }\n    // 根据e.clientX, e.clientY计算出相对于container的offsetX, offsetY坐标\n    const containerRect = this.element.getBoundingClientRect();\n    const eventOffsetX= clientPoint.x - containerRect.left;\n    const eventOffsetY = clientPoint.y - containerRect.top;\n    const point = new Vec2d(eventOffsetX, eventOffsetY);\n    const newOffsetPoint = GeometryUtils.getProjectionPointWithOffset(\n      point, \n      line, \n      axis === 'x' ? 'x' : 'y', \n      offsetDistance,\n    );\n    // 根据eventOffsetX, eventOffsetY和e.clientX, e.clientY计算出偏移量,再把projectionPoint加上这个偏移量使其变成clientX, clientY相同坐标系下的点\n    const offsetX = Math.round(clientPoint.x - eventOffsetX);\n    const offsetY = Math.round(clientPoint.y - eventOffsetY);\n    const newClientPoint = newOffsetPoint.add(new Vec2d(offsetX, offsetY));\n    const offsetVector = new Vec2d(clientPoint.x - newClientPoint.x, clientPoint.y - newClientPoint.y);\n    const newPoints = {\n      clientPoint: newClientPoint,\n      screenPoint: screenPoint.add(offsetVector),\n    };\n    if (e.type === 'pointerdown') {\n      this.startDrawPoint = newPoints.clientPoint;\n    } else if (e.type === 'pointerup') {\n      this.startDrawPoint = null;\n    }\n    if (this.startDrawPoint) {\n      const distance = GeometryUtils.distance(this.startDrawPoint, newPoints.clientPoint);\n      mathsKit.showLineLength(distance / this.options.getGlobalScale());\n    }\n    return newPoints;\n  }\n  private generateCirclePoint(e: PointerEvent | MouseEvent, param: MarkCircle, _mathsKit: MathsKitTool) {    \n    let clientPoint = new Vec2d(0, 0);\n    let screenPoint = new Vec2d(0, 0);\n    // if(e instanceof TouchEvent){\n    //   if (e.touches.length > 0) {\n    //     clientPoint = new Vec2d(e.touches[0].clientX, e.touches[0].clientY);\n    //     screenPoint = new Vec2d(e.touches[0].screenX, e.touches[0].screenY);\n    //   } else if (e.changedTouches.length > 0) {\n    //     clientPoint = new Vec2d(e.changedTouches[0].clientX, e.changedTouches[0].clientY);\n    //     screenPoint = new Vec2d(e.changedTouches[0].screenX, e.changedTouches[0].screenY);\n    //   }\n    // } else {\n    clientPoint = new Vec2d(e.clientX, e.clientY);\n    screenPoint = new Vec2d(e.screenX, e.screenY);\n    // }\n    \n    // 根据e.clientX, e.clientY计算出相对于container的offsetX, offsetY坐标\n    const containerRect = this.element.getBoundingClientRect();\n    const eventOffsetX = clientPoint.x - containerRect.left;\n    const eventOffsetY = clientPoint.y - containerRect.top;\n    const point = new Vec2d(eventOffsetX, eventOffsetY);\n    const { circle } = param;\n    const circleToJson = CircleSegment.toJson(circle);\n    const offsetDistance = this.options.getStrokeWidth() / 2 * this.options.getGlobalScale();\n    const radius = circle.radius + offsetDistance;\n    circleToJson.radius = radius;\n    // 转换为 CircleSegment 实例\n    const arcInstance = CircleSegment.fromJson(circleToJson);\n    arcInstance.setRadius(radius);\n    \n    // 找到圆弧上距离该点最近的点\n    const newNearestPoint = arcInstance.nearestPointOnSegment(point);\n    \n    // 计算偏移量，使 nearestPoint 变成 clientX, clientY 相同坐标系下的点\n    const offsetX = Math.round(clientPoint.x - eventOffsetX);\n    const offsetY = Math.round(clientPoint.y - eventOffsetY);\n    const newClientPoint = newNearestPoint.add(new Vec2d(offsetX, offsetY));\n    \n    // 计算偏移向量\n    const offsetVector = new Vec2d(clientPoint.x - newClientPoint.x, clientPoint.y - newClientPoint.y);\n    const newPoints = {\n      clientPoint: newClientPoint,\n      screenPoint: screenPoint.add(offsetVector),\n    };\n    \n    return newPoints;\n  }\n  private onDrawEventListener = (e: PointerEvent | MouseEvent) => {\n    if (!this.activeMathsKit) {\n      this.forwardEvent(e);\n      return;\n    }\n    let newPoints: { clientPoint: Vec2d, screenPoint: Vec2d } | undefined = undefined;\n    const { axis, mathsKit } = this.activeMathsKit;\n    if (axis === 'circle') {\n      const { circle } = this.activeMathsKit as MarkCircle;\n      newPoints = this.generateCirclePoint(e, { axis, circle } as MarkCircle, mathsKit);\n    } else {\n      const { line, direction } = this.activeMathsKit as MarkLine;\n      newPoints = this.generateLinePoint(e, { axis, line, direction } as MarkLine, mathsKit);\n    }\n    this.forwardEvent(e, newPoints, 0);\n  };\n\n  private forwardEvent(e: PointerEvent | MouseEvent | WheelEvent, _newPoints?: { clientPoint: Vec2d, screenPoint: Vec2d }, _touchIndex?: number) {\n    let newEvent: PointerEvent | MouseEvent | WheelEvent = e;\n    let newPoints: { clientPoint: Vec2d, screenPoint: Vec2d } | undefined = _newPoints;\n    if (e instanceof PointerEvent) {\n      if (!newPoints) {\n        newPoints = {\n          clientPoint: new Vec2d(e.clientX, e.clientY),\n          screenPoint: new Vec2d(e.screenX, e.screenY),\n        };\n      }\n      newEvent = new PointerEvent(e.type, {\n        bubbles: true,\n        cancelable: true,\n        composed: true,\n        clientX: newPoints.clientPoint.x,\n        clientY: newPoints.clientPoint.y,\n        screenX: newPoints.screenPoint.x,\n        screenY: newPoints.screenPoint.y,\n        buttons: e.buttons,\n        button: e.button,\n        ctrlKey: e.ctrlKey,\n        shiftKey: e.shiftKey,\n        altKey: e.altKey,\n        metaKey: e.metaKey,\n        pointerId: e.pointerId,\n        pointerType: e.pointerType,\n        pressure: e.pressure,\n      });\n    } else if (e instanceof WheelEvent) {\n      newEvent = new WheelEvent('wheel', {\n        deltaX: e.deltaX,\n        deltaY: e.deltaY,\n        deltaMode: e.deltaMode, // 像素\n        bubbles: true,\n        cancelable: true,\n        view: window,\n      });\n    } else if (e instanceof MouseEvent) {\n      if (!newPoints) {\n        newPoints = {\n          clientPoint: new Vec2d(e.clientX, e.clientY),\n          screenPoint: new Vec2d(e.screenX, e.screenY),\n        };\n      }\n      newEvent = new MouseEvent(e.type, {\n        bubbles: true,\n        cancelable: true,\n        composed: true,\n        clientX: newPoints.clientPoint.x,\n        clientY: newPoints.clientPoint.y,\n        screenX: newPoints.screenPoint.x,\n        screenY: newPoints.screenPoint.y,\n        buttons: e.buttons,\n        button: e.button,\n        ctrlKey: e.ctrlKey,\n        shiftKey: e.shiftKey,\n        altKey: e.altKey,\n        metaKey: e.metaKey,\n      });\n    }\n    this.options.getForwardingTarget().dispatchEvent(newEvent); \n  }\n\n  private removeEventListener() {\n    this.isForwarding = false;\n    this.activeMathsKit = null;\n    this.startDrawPoint = null;\n    this.removeEventClockTimer = undefined;\n    for (const [startEvent, events] of DrawManager.eventForwardMap.entries()) {\n      this.element.removeEventListener(startEvent, this.onDrawContainerStartEventListener as EventListener);\n      for (const event of events) {\n        window.removeEventListener(event, this.onDrawDocumentEventListener as EventListener, true);\n      }\n    }\n    this.options.getInstances().forEach(instance => {\n      instance.setActive(this.options.getActiveManager());\n    });\n  }\n\n  private stop(){\n    if (this.removeEventClockTimer) {\n      clearTimeout(this.removeEventClockTimer);\n      this.removeEventClockTimer = undefined;\n    }\n    this.removeEventListener();\n  }\n\n  destroy(){\n    this.stop();\n    this.element.removeEventListener('pointerdown', this.onPointerdown, true);\n    this.element.removeEventListener('wheel', this.onWheel, true);\n  }\n\n}","import { MathsKitState, MathsKitTool, MathsKitType } from './types';\nimport { ObserverMap } from './utils/ObserverMap';\nimport EventEmitter2 from 'eventemitter2';\nimport { RulerTool } from './component/Ruler';\nimport { Triangle30Tool, Triangle45Tool } from './component/Triangle';\nimport { ProtractorTool } from './component/Protractor';\n// import { CompassTool } from './component/Compass';\nimport { DEFAULT_MATHS_KIT_STATE } from './const';\nimport { isNumber } from 'lodash';\nimport { OperationManager } from './utils';\nimport { DrawManager } from './utils/Draw';\n\nexport interface MathsKitManagerOptions {\n  /** 容器 */\n  container: HTMLDivElement;\n  /** 目标元素 */\n  target: HTMLElement;\n  /** 默认工具状态 */\n  defaultKitState?: Omit<MathsKitState, 'custom' | 'zIndex' | 'type'>;\n  /** 主题 */\n  theme?: 'light' | 'dark';\n  /** 全局缩放 */\n  globalScale?: number;\n}\n\nexport class MathsKitManager extends EventEmitter2 {\n  private readonly _container: HTMLDivElement;\n  private readonly target: HTMLElement;\n  private _theme: 'light' | 'dark' = 'light';\n  private _state: ObserverMap<string, MathsKitState>;\n  private instances: Map<string, MathsKitTool> = new Map();\n  private defaultKitState: Omit<MathsKitState, 'custom' | 'zIndex' | 'type' | 'height'>;\n  private _isActive: boolean = false;\n  private _strokeWidth: number = 6;\n  private _globalScale: number = 1;\n\n  private _isForwarding: boolean = false;\n  private _isOperation: boolean = false;\n\n  private operationManager: OperationManager;\n  private drawManager: DrawManager;\n  constructor(options: MathsKitManagerOptions) {\n    super();\n    this._container = options.container;\n    this._theme = options.theme || 'light';\n    this._globalScale = options.globalScale || 1;\n    this.target = options.target;\n    this.defaultKitState = options.defaultKitState || DEFAULT_MATHS_KIT_STATE;\n    this._state = new ObserverMap<string, MathsKitState>();\n    this.setActive(false);\n    this._state.observe((operation, key, value) => {\n      this.emit('stateChange', operation, key, value);\n      switch (operation) {\n        case 'add': {\n          const instance = this.createInstance(key, value);\n          if (instance) { \n            this.instances.set(key, instance);\n            instance.init();\n          }\n          break;\n        }\n        case 'delete': {\n          const instance = this.instances.get(key);\n          if (instance) {\n            instance.destroy();\n          } \n          this.instances.delete(key);\n          break;\n        }\n        case 'update': {\n          const instance = this.instances.get(key);\n          if (instance) {\n            instance.update(value);\n          } else {\n            const instance = this.createInstance(key, value);\n            if (instance) { \n              this.instances.set(key, instance);\n              instance.init();\n            }\n          }\n          break;\n        }\n      }\n      this.activeManager();\n    });\n    // this.container.addEventListener('pointerdown', this.onDrawStartHandler, true);\n    this.operationManager = new OperationManager(this.container, {\n      bindEvents: ['Drag', 'Rotate', 'Stretch'],\n      getGlobalScale: () => this.globalScale,\n      getInstance: (id:string) => this.instances.get(id) || null,\n      activeOperation: (bol:boolean)=>{this._isOperation = bol;},\n      getContainerRect: () => this.container.getBoundingClientRect(),\n    });\n    this.drawManager = new DrawManager(this.container, {\n      getGlobalScale: () => this.globalScale,\n      getInstances: () => this.instances,\n      activeDraw: (bol:boolean)=>{this._isForwarding = bol;},\n      getForwardingTarget: () => this.target,\n      getStrokeWidth: () => this.strokeWidth,\n      getActiveManager: () => this.isActive,\n    });\n  }\n\n  get state(): ObserverMap<string, MathsKitState> {\n    return this._state;\n  }\n\n  set isOperation(isOperation: boolean) {\n    this._isOperation = isOperation;\n  }\n\n  get isOperation(): boolean {\n    return this._isOperation;\n  }\n  \n  get strokeWidth(): number {\n    return this._strokeWidth;\n  }\n\n  set strokeWidth(width: number) {\n    this._strokeWidth = width;\n  }\n\n  get topMathsKitState(): [string, MathsKitState] | undefined {\n    let top: [string, MathsKitState] | undefined;\n    this._state.forEach((value, key) => {\n      const zIndex = value.zIndex;\n      if (!top || ( top && isNumber(zIndex) && zIndex > top[1].zIndex)) {\n        top = [key, value];\n      } else if (top && isNumber(zIndex) && zIndex === top[1].zIndex) {\n        if (top[0] < key) {\n          top = [key, value];\n        }\n      }\n    });\n    return top;\n  }\n\n  get container(): HTMLDivElement {\n    return this._container;\n  }\n\n  get topZIndex(): number {\n    return this.topMathsKitState && this.topMathsKitState[1].zIndex || 0;\n  }\n\n  get isActive(): boolean {\n    return this._isActive;\n  }\n\n  set isActive(isActive: boolean) {\n    this.setActive(isActive);\n  }\n\n  get isForwarding(): boolean {\n    return this._isForwarding;\n  }\n\n  get theme(): 'light' | 'dark' {\n    return this._theme;\n  }\n\n  set theme(theme: 'light' | 'dark') {\n    this._theme = theme;\n    this.instances.forEach(instance => {\n      instance.setTheme(theme);\n    });\n  }\n\n  get globalScale(): number {\n    return this._globalScale;\n  }\n\n  set globalScale(scale: number) {\n    let isChanged = false;\n    if (this._globalScale !== scale) {\n      isChanged = true;\n      this._globalScale = scale;\n    }\n    if (isChanged) {\n      this.instances.forEach(instance => {\n        instance.render();\n      });\n    }\n  }\n\n  forwardEvent(e: Event) {\n    let newEvent: Event;\n    if (e instanceof PointerEvent) {\n      newEvent = new PointerEvent(e.type, {\n        bubbles: true,\n        cancelable: true,\n        composed: true,\n        clientX: e.clientX,\n        clientY: e.clientY,\n        screenX: e.screenX,\n        screenY: e.screenY,\n        buttons: e.buttons,\n        button: e.button,\n        ctrlKey: e.ctrlKey,\n        shiftKey: e.shiftKey,\n        altKey: e.altKey,\n        metaKey: e.metaKey,\n        pointerId: e.pointerId,\n        pointerType: e.pointerType,\n        pressure: e.pressure,\n      });\n    } else if (e instanceof MouseEvent) {\n      newEvent = new MouseEvent(e.type, {\n        bubbles: true,\n        cancelable: true,\n        composed: true,\n        clientX: e.clientX,\n        clientY: e.clientY,\n        screenX: e.screenX,\n        screenY: e.screenY,\n        buttons: e.buttons,\n        button: e.button,\n        ctrlKey: e.ctrlKey,\n        shiftKey: e.shiftKey,\n        altKey: e.altKey,\n        metaKey: e.metaKey,\n      });\n    } else {\n      // fallback\n      newEvent = new Event(e.type, { bubbles: true, cancelable: true });\n    }\n    this.target.dispatchEvent(newEvent); \n  }\n\n  isTopMathsKit(kitId: string): boolean {\n    const topMathsKitState = this.topMathsKitState;\n    if (topMathsKitState && topMathsKitState[0] === kitId) {\n      return true;\n    }\n    return false;\n  }\n\n  setActive(isActive: boolean) {\n    this._isActive = isActive;\n    this.activeManager();\n  }\n\n  activeManager() {\n    if (this.isActive && this.instances.size > 0) {\n      this.container.style.pointerEvents = 'auto';\n    } else {\n      this.container.style.pointerEvents = 'none';\n    }\n    this.instances.forEach(instance => {\n      instance.setActive(this.isActive);\n    });\n  }\n\n  create(type: MathsKitType, _kitId?: string, state?: Partial<MathsKitState>) {\n    if ([...this._state.values()].find(s=>s.type === type)) {\n      console.warn(`${type} already exists`);\n      return;\n    }\n    const kitId = _kitId || `${type}-${Date.now()}`;\n\n    let width = this.defaultKitState.width;\n    let height = 0;\n    let custom: Record<string, any> = {};\n    switch (type) {\n      case MathsKitType.Ruler: {\n        height = 78;\n        break;\n      }\n      case MathsKitType.Triangle45:\n        width = width / Math.sqrt(2);\n        height = width;\n        break;\n      case MathsKitType.Triangle30:\n        height = width * Math.sqrt(3) / 3;\n        break;\n      case MathsKitType.Protractor:\n        height = width / 2;\n        custom = {\n          startAngle: 0,\n          endAngle: 30,\n        };\n        break;\n      case MathsKitType.Compass:\n        height = width;\n        break;\n      default:\n        break;\n    }\n\n    this._state.set(kitId, {\n      ...this.defaultKitState,\n      width,\n      height, \n      type, \n      zIndex: this.topZIndex,\n      custom,\n      ...state,\n    });\n    \n  }\n\n  update(kitId: string, state: Partial<MathsKitState>) {\n    const _state = this._state.get(kitId);\n    if (_state) {\n      this._state.set(kitId, { ..._state, ...state });\n      return;\n    }\n    console.warn(`${kitId} has't been created`);\n    return;\n  }\n\n  remove(kitId: string) {\n    this._state.delete(kitId);\n    this.instances.delete(kitId);\n  }\n\n  destroy(){\n    this.instances.clear();\n    this.operationManager.destroy();\n    this.drawManager.destroy();\n    this.container.remove();\n  }\n\n  private createInstance(id: string, state: MathsKitState): MathsKitTool | null {\n    const type = state.type;\n    switch (type) {\n      case MathsKitType.Ruler:\n        return new RulerTool({\n          id,\n          type,\n          state,\n        }, this);\n      case MathsKitType.Triangle45:\n        return new Triangle45Tool({\n          id,\n          type,\n          state,\n        }, this);\n      case MathsKitType.Triangle30:\n        return new Triangle30Tool({\n          id,\n          type,\n          state,\n        }, this);\n      case MathsKitType.Protractor:\n        return new ProtractorTool({\n          id,\n          type,\n          state,\n        }, this);\n      // case MathsKitType.Compass:\n      //   return new CompassTool({\n      //     id,\n      //     type,\n      //     state,\n      //   }, this);\n      default:\n        return null;\n    } \n  }\n\n}"],"names":["MathsKitType","ObserverMap","entries","__publicField","operation","key","value","observer","callback","notifyKey","bol","callbackfn","thisArg","EASINGS","t","Vec2d","x","y","z","r","s","c","C","V","n","min","max","B","distance","tan","A","gridSize","tolerance","l","v","u","P","clamp","step","scale","origin","length","arr","len","avg","steps","results","i","point","CircleSegment","center","radius","startAngle","endAngle","radian","angleDiff","midAngle","diff","ccw","points","criticalAngles","angle","GeometryUtils","normPos","start","ang","signedDiff","nearestPoint","vecFromCenter","targetAngle","distToStart","distToEnd","distToCenter","other","lineStart","lineEnd","intersections","direction","unitDir","toLineStart","a","b","discriminant","sqrtDiscriminant","t1","t2","offset","factor","segments","segmentLength","totalLength","clampedT","otherSegment","startPoint","endPoint","centerVec","startVec","endVec","json","segment","p1","p2","circleSegment","lineSegment","lineSegments","nearestLineSegment","minDistance","axis","end","projectedPoint","offsetDistance","normal","axisVector","cross","_axis","projectionPoint","offsetVector","offsetPoint","toleranceFactor","offsetPointX","offsetPointY","linePoint","lineDirection","line1Start","line1End","line2Start","line2End","x1","y1","x2","y2","x3","y3","x4","y4","denom","polygon","inside","j","area","cx","cy","minX","minY","maxX","maxY","xa","xb","ya","yb","_a","_b","p","angleStep","Point2d","_v","pre","next","decimal","X","Y","o","average","LineSegment","nearest","dir1","dir2","dot","seg1","seg2","line1","line2","line","Matrix2D","d","e","f","g","h","row","col","result","sum","k","det","invDet","identity","val","index","createTranslationMatrix","tx","ty","createScaleMatrix","sx","sy","createRotationMatrix","cos","sin","composeTransforms","matrices","matrix","decomposeMatrix","translateX","translateY","scaleX","scaleY","rotation","skewX","skewY","getAngleByMatrix","OperationManager","element","options","currentTarget","currentTargetType","item","id","error","originAngle","containerRect","isOutSideX","isOutSideY","globalScale","rawDragX","rawDragY","transformedDragX","transformedDragY","translateMatrix","currentPoint","originPoint","angleInDegrees","angleInRadians","rotationMatrix","stretchDirection","MathsKit","manager","originMatrix","transform","scaleMatrix","scaleTranslateMatrix","type","isActive","theme","currentTheme","variables","state","currentMatrix","container","containerWidth","containerHeight","newX","newY","matirx","MM_PER_PIXELS","PIXELS_PER_MM","RulerTool","throttle","pxX","pxY","domMatrix","leftTopPoint","target","width","height","topLeftPoint","topRightPoint","bottomLeftPoint","bottomRightPoint","rotateCenterPoint","topLine","bottomLine","position","mark","style","SVG_PADDING","svgWidth","MM_PER_CM","MARK_SPACING_PX","MARK_WIDTH_PX","availableWidth","totalMarks","svg","backgroundRect","markValue","markHeight","isMajorMark","isMediumMark","text","textValue","unitText","stateMatrix","currentAngle","newMatrix","number","cm","Triangle30Tool","_width","triangleView","baseWidth","baseHeight","leftPoint0","leftPoint1","hypotenusePoint0","hypotenusePoint1","bottomPoint0","bottomPoint1","leftLine","hypotenuse","baseLine","elementContentStyle","triangleMatrix","hypotenuseHeight","minHypotenuseWidth","minHypotenuseHeight","triangleViewStyle","SVG_BG_HEIGHT","Triangle45Tool","angle_radian","ProtractorTool","circleCenterPoint","custom","isNumber","_number","_originAngle","_angle","currentAnglePoint","startAngleText","svgHeight","circleCenter","outDonutRadius","middleDonutRadius","innerDonutRadius","innerCircleRadius","backgroundCircle1","backgroundCircle2","centerCircle","centerCircle1","angleLines","t4","point1","point4","ponitText","t3","ponitText1","text1","child","DEFAULT_MATHS_KIT_STATE","_DrawManager","instance","startEvent","events","event","newPoints","mathsKit","circle","isForwarding","minDistanceMathsKit","minDistanceMarkLine","markLines","markLine","param","clientPoint","screenPoint","eventOffsetX","eventOffsetY","newOffsetPoint","offsetX","offsetY","newClientPoint","_mathsKit","circleToJson","arcInstance","newNearestPoint","_newPoints","_touchIndex","newEvent","DrawManager","MathsKitManager","EventEmitter2","isOperation","top","zIndex","isChanged","kitId","topMathsKitState","_kitId","_state"],"mappings":"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"}