Repository navigation
logic gauge
Converts a player-entered track gauge into the scale constant Create uses for curves — a quadratic
y = a·x² + b·x + c fitted exactly through three anchors (Cramer's rule). Pure functions, Node-testable.
Conversion basis: 1 block = 1 m = 1000 mm = 16 px, so px = mm × 16 / 1000 (1 px = 62.5 mm);
1 inch = 25.4 mm. The gauge is the center distance between the left and right rails.
export interface GaugeAnchor {
gaugeMM: number; // gauge in mm
scale: number; // Create curve scale constant
}The three known anchor points (measured in-game):
export const GAUGE_ANCHORS: GaugeAnchor[] = [
{ gaugeMM: 1435, scale: 0.755 }, // standard gauge
{ gaugeMM: 1600, scale: 0.965 }, // Create default gauge
{ gaugeMM: 1000, scale: 0.525 }, // meter gauge
];export interface QuadraticCoeffs {
a: number;
b: number;
c: number;
}export const DEFAULT_FIT: QuadraticCoeffs = fitQuadratic(GAUGE_ANCHORS)!;Create's default nominal gauge 1600 mm and its model px equivalent (1600 mm → 25.6 px).
export const DEFAULT_GAUGE_MM = 1600;
export const DEFAULT_GAUGE_PX = mmToPx(DEFAULT_GAUGE_MM); // 25.6Fits the quadratic coefficients through three points via Cramer's rule. Returns null for invalid input
(not exactly three points, or duplicate x values).
export function fitQuadratic(points: GaugeAnchor[]): QuadraticCoeffs | null;Gauge (mm) → curve scale constant.
export function gaugeMMToScale(gaugeMM: number, coeffs: QuadraticCoeffs = DEFAULT_FIT): number;Gauge entered directly in px → curve scale constant (converts to mm first, then fits).
export function scaleForPx(gaugePx: number, coeffs: QuadraticCoeffs = DEFAULT_FIT): number;Formats the fit coefficients as a human-readable formula (negative coefficients shown as − rather than
+ -). Example: y = 1.24e-6·x² - 0.0025·x + 1.7756.
export function formatFit(coeffs: QuadraticCoeffs = DEFAULT_FIT): string;export function mmToPx(gaugeMM: number): number; // mm → model gauge px (1/16 block)
export function pxToMM(gaugePx: number): number; // model gauge px → mm
export function mmToInch(gaugeMM: number): number; // mm → inch
export function inchToMM(gaugeInch: number): number; // inch → mm
export function inchToPx(gaugeInch: number): number; // inch → model gauge px
export function pxToInch(gaugePx: number): number; // model gauge px → inch