feat(rebar): solplate geometry (pure) — tapered along the 교축, thick end T1 on the 시점 side

Per bearing: L = A + margin along the 교축 (s), W = B + margin across it; the underside is the bearing top (block top
EL.X + h3); the top tapers from T1 = T + L·|S|/200 at the 시점 side (−s) to T2 = T − L·|S|/200 at the 종점 side, so
T1 + T2 = 2T and the volume is L·W·T. Corners follow the bearing row (rowSkew). Tests cover L, W, T1, T2, the underside,
the volume and the centring. The model and the 3D do not use it yet.

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
This commit is contained in:
ypshimandClaude Haiku 5.5 committed 2026-10-23 14:42:31 +09:00
1 parent 55abc4be13
commit 1d8746d533
2 files changed
+98

No files matched your search

+55
View File
@@ -0,0 +1,55 @@
/**
* 솔플레이트 기하 (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 };
}