/** * 솔플레이트 기하 (1단계, 승인 2026-10-23). Pure: the solplate of one bearing, from its block (position, rowSkew) and the * 공통 규칙 values. The solplate sits on the bearing (h3) and tapers along the 교축 방향 (s): the thick end T1 is on the * 시점 side (s = −L/2), the thin end T2 on the 종점 side (s = +L/2). Lengths in m, as in the model. */ import { blockFramePoint, type BlockModel } from './geometry'; export interface SolplateParams { /** 받침 평면 A (mm, along 교축 s) and B (mm, along the 교각축 직각 n). */ A: number; B: number; /** 솔플 여유 (mm): L = A + margin, W = B + margin. */ margin: number; /** 중심 두께 T (mm). */ T: number; /** 기울기 S (%), negative as drawn: thickness changes by L·|S|/2 from the centre. */ slopePct: number; } export interface SolplateGeometry { /** Length along 교축 (m) and width along 교각축 직각 (m). */ L: number; W: number; /** Thickness at the 시점 end (T1) and the 종점 end (T2) (m). */ T1: number; T2: number; /** Underside (EL m): the bearing top = block top (EL.X) + h3. */ bottom: number; /** Eight corners: [s, y, n] in the model's local frame (EL m). */ corners: [number, number, number][]; /** Volume (m³): L·W·(T1 + T2)/2. */ volume: number; } /** Solplate of the bearing at `block`, with the bearing height h3 (mm) and the 공통 규칙 parameters. */ export function solplateGeometry(block: BlockModel, h3: number, p: SolplateParams): SolplateGeometry { const L = (p.A + p.margin) / 1000; const W = (p.B + p.margin) / 1000; // Thickness change from the centre to each end: L·|S|/2, with S in % (mm). const drop = ((p.A + p.margin) * Math.abs(p.slopePct)) / 200 / 1000; const T = p.T / 1000; const T1 = T + drop; const T2 = T - drop; const bottom = block.padTop + h3 / 1000; const thickAt = (a: number) => T1 + ((T2 - T1) * (a + L / 2)) / L; const corners: [number, number, number][] = []; for (const a of [-L / 2, L / 2]) { for (const c of [-W / 2, W / 2]) { const [s, n] = blockFramePoint(block, a, c); corners.push([s, bottom, n]); corners.push([s, bottom + thickAt(a), n]); } } return { L, W, T1, T2, bottom, corners, volume: (L * W * (T1 + T2)) / 2 }; }