All files / src/core/solver solver-types.ts

0% Statements 0/0
0% Branches 1/1
0% Functions 1/1
0% Lines 0/0

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83                                                                                                                                                                     
/* solver-types.ts */
 
export type VertexIndex = number; // integer, 0 <= i < N
 
// Segment between two vertices (edge or diagonal). Undirected: (i,j) == (j,i).
export type SegmentRef = {
  i: VertexIndex; // i != j
  j: VertexIndex;
};
 
export type LengthConstraint = {
  type: "length";
  seg: SegmentRef;
  length: number; // > 0
};
 
export type InteriorAngleConstraint = {
  type: "interiorAngle";
  i: VertexIndex;
  angleRad: number; // 0 < angleRad < 2π  (π allowed)
};
 
// |segX| = factor * |segY|
export type SegmentLengthRatioConstraint = {
  type: "segmentLengthRatio";
  segX: SegmentRef;
  segY: SegmentRef;
  factor: number; // > 0
};
 
// undirected angle in [0, π], 0 => parallel, π/2 => perpendicular
export type SegmentRelativeAngleConstraint = {
  type: "segmentRelativeAngle";
  segA: SegmentRef;
  segB: SegmentRef;
  angleRad: number; // 0 <= angleRad <= π
};
 
export type PolygonConstraint =
  | LengthConstraint
  | InteriorAngleConstraint
  | SegmentLengthRatioConstraint
  | SegmentRelativeAngleConstraint;
 
export type VertexKind = "convex" | "reflex" | "straight";
 
export type SimplePolygonSolveOptions = {
  maxIterations?: number; // default 3000
  tolerance?: number; // default 1e-10
 
  initialization?:
    | { kind: "regularNgon" }
    | {
        kind: "custom";
        initialVertices: { x: number; y: number }[];
      };
 
  simplicityEpsilon?: number; // default 1e-6
 
  restarts?: number; // default 0
  randomSeed?: number;
 
  diagnostics?: "none" | "basic" | "verbose";
};
 
export type PolygonData = {
  sides: number;
  sideLengths: number[]; // boundary edges i->i+1 mod N
  interiorAngles: number[]; // per vertex i in radians (may include π)
};
 
export type SolverError = {
  kind:
    | "InvalidInput"
    | "Infeasible"
    | "DidNotConverge"
    | "Degenerate"
    | "NotSimple"
    | "WrongOrientation";
  message: string;
  details?: Record<string, unknown>;
};